描述
Vitis HLS 中的 PERFORMANCE 编译指示为您的设计提供了用于定义高层次性能目标的机制,以便引导综合工具的优化工作。它可应用于两个不同的作用域:设计的顶层(内核/IP)和设计中的特定循环层。
顶层 PERFORMANCE 编译指示
在内核或 IP 顶层函数上应用 PERFORMANCE 编译指示允许您指定整体性能目标,主要侧重于达成所需的吞吐量。在内核顶层函数上应用该编译指示时,会触发 HLS 工具对整个设计执行性能分析。该分析对整个设计结构进行评估,以判定满足指定性能目标的可行性。根据整体目标及此项分析,该工具会自动为设计层内的单个循环和循环嵌套推断适当的循环层性能编译指示。
循环层 PERFORMANCE 编译指示
直接将 PERFORMANCE 编译指示应用于特定循环或循环嵌套使您能定义循环或循环嵌套的该特定部分的性能目标。循环层 PERFORMANCE 编译指示或指令支持您指定高层次约束 target_ti 来定义循环的连续启动之间的时钟周期数,并允许该工具推断达成期望结果所需的低层次 UNROLL、PIPELINE、ARRAY_PARTITION 和 INLINE 指令。PERFORMANCE 编译指示或指令不保证能达成指定的值,仅作为目标
适用于顶层(整个函数/DUT)和循环层的 PERFORMANCE 编译指示使用 target_ti 参数来引导优化以达成特定性能目标。
target_ti:(目标启动时间间隔)定义 DUT 或循环的连续启动之间所需的时钟周期数。
顶层性能编译指示:
- 在顶层应用 target_ti 时,它会指定单次函数执行的开始时间与下一次函数执行的开始时间之间的目标时间间隔。来看一个示例,假设要为图像处理设计计算顶层性能编译指示,目标帧数为每秒 60 帧 (FPS)。要达到 60 FPS 的帧速,函数/DUT 必须在 1/60 秒内准备好重新启动并读取新的帧。
- Target TI = 1/FPS = 1/60 ~= 16.67 毫秒。
- 这意味着函数/DUT 必须在 16.7 毫秒内准备好重新启动并读取新的帧,以保持每秒 60 帧 (FPS) 的目标。
循环层性能编译指示:
- 在循环层应用 target_ti 时,它会指定连续多次外层循环迭代中的循环的首次迭代开始时间与下一次开始迭代之间的目标时间间隔。在以下示例中,循环 L2 上的 target_ti=T 将循环 L2 开始执行一次 L1 迭代与循环 L2 开始执行 L1 的下一次迭代之间的目标时间间隔设为 T 个时钟周期。
-
1 const int T = 100; 2 L1: for (int i=0; i<N; i++) 3 L2: for (int j=0; j<M; j++) 4 { pragma HLS performance target_ti=T ... }
语法
#pragma HLS performance target_ti=<value>
其中:
- target_ti=<value>
- 指定目标传输事务时间间隔定义为代码的函数、循环或区域完成一次迭代的时钟周期数。<value> 可指定为整数、浮点或由该工具解析为整数的常量表达式。注释: 如果发生截位,则会返回警告。
- unit=[sec | cycle]
- 指定与
target_ti值或target_tl值关联的单位。此单位可指定为秒数或时钟周期数。当指定的单位为秒数时,可用表示纳秒 (ns)、皮秒 (ps) 或微秒 (us) 的相应的值来指定单位。
示例 1
如果 target_ti 所需目标值为 100 us,那么应如何指定编译指示?例如,如果值为 100 us,则 target_ti=1e-4 unit=sec。
- #pragma HLS performance target_ti=100 unit=us
- #pragma HLS performance target_ti=100us unit=sec
- #pragma HLS performance target_ti=100e-6 unit=sec
示例 2
指定外层函数的目标传输事务时间间隔为 1000 个时钟周期。
for (int i =0; i < 1000; ++i) {
#pragma HLS performance target_ti=1000
for (int j = 0; j < 8; ++j) {
int tmp = b_buf[j].read();
b[i * 8 + j] = tmp + 2;
}
}