pragma HLS performance - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

描述

提示: PERFORMANCE 编译指示或指令适用于循环和循环嵌套,需要已知循环次数才能判定性能。如果您的循环包含可变循环计数,则必须同时指定 LOOP_TRIPCOUNT 编译指示或指令。

PERFORMANCE 编译指示或指令支持您指定高层次约束 target_titarget_tl 来定义循环的连续启动之间的时钟周期数,并允许该工具推断达成期望结果所需的低层次 UNROLL、PIPELINE、ARRAY_PARTITION 和 INLINE 指令。PERFORMANCE 编译指示或指令不保证将达成指定的值,仅作为目标。

target_ti 是循环连续启动之间的时间间隔,或者启动循环的首次迭代与下一次启动循环的首次迭代之间的时间间隔。在以下代码示例中,target_ti=T 意味着在 L1 的 2 次连续迭代之间,L2 循环启动的目标时间间隔应为 100 个周期。

const int T = 100;
L1: for (int i=0; i<N; i++)
  L2: for (int j=0; j<M; j++){
pragma HLS performance target_ti=T
   ...
   }

target_tl 是循环启动与结束之间的时间间隔,或者循环的首次迭代开始与循环的最后一次迭代完成之间的时间间隔。例如,在前述代码示例中,target_tl=T 意味着对于 L1 的单次迭代,L2 循环的目标完成时间应为 100 个周期。

注释: INLINE 编译指示会自动应用于 II=1 的任意流水打拍循环内部的函数。如果您应用的 PERFORMANCE 编译指示或指令推断得到 II=1 的流水线,那么它还将触发自动内联最优化。您可使用 #pragma HLS INLINE off 来为特定函数禁用此操作。

传输事务时间间隔是循环的启动时间间隔 (II) 乘以迭代次数或循环次数:target_ti = II * loop tripcount。反之,target_ti = 频率 (Hz) / 每秒操作数。

例如,假定图像处理函数每次调用处理一帧,吞吐量目标为 60 fps,则此函数的目标吞吐量为每秒 60 次调用。如果时钟频率为 180 MHz,则 target_ti 为 180M/60,或每次函数调用 3 百万个时钟周期。

语法

将编译指示置于循环边界内或嵌套循环的外层循环边界内。

#pragma HLS performance target_ti=<value> target_tl=<value> unit=[sec|cycle]

其中:

target_ti=<value>
指定目标传输事务时间间隔定义为代码的函数、循环或区域完成一次迭代的时钟周期数。<value> 可指定为整数、浮点或由该工具解析为整数的常量表达式。
注释: 如果发生截位,则返回警告。
target_tl=<value>

指定目标时延定义为循环完成所有迭代的时钟周期数。传输事务时延定义为循环的首次迭代开始与该循环的最后一次迭代完成之间的时间间隔。<value> 可指定为整数、浮点或由该工具解析为整数的常量表达式。

unit=[sec | cycle]
指定与 target_ti 值或 target_tl 值关联的单位。此单位可指定为秒数或时钟周期数。当指定的单位为秒数时,可用表示纳秒 (ns)、皮秒 (ps) 或微秒 (us) 的相应的值来指定单位。

示例 1

指定外层函数的目标传输事务时间间隔为 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;
    }
  }