文档目录

6.3. 循环合并(loop_coalesce预处理指令)

使用 loop_coalesce预处理指令指示 Intel® HLS Compiler将嵌套循环合并为单个循环而不影响循环功能。通过指示编译器减少循环控制所需的开销而合并循环,从而有助于减少 组件的面积使用。

合并嵌套循环还可以减少 组件的延迟,从而进一步减少您 组件的面积使用。但是,在某些情况下,合并循环可能会延长关键循环启动间隔数据通路,因此合并循环可能并不适合所有 组件

要合并嵌套循环,请指定以下预处理指令:
#pragma loop_coalesce <loop_nesting_level>

<loop_nesting_level>参数为可选,它是一个整数,指定编译器尝试合并嵌套循环的级数。如果您不指定<loop_nesting_level>参数,则编译器会尝试合并所有嵌套循环。

例如,考虑如下嵌套循环组:
for (A)
  for (B)
    for (C)
      for (D)
    for (E)
如果您将预处理指令置于loop (A)前面,则这些循环的循环嵌套级数的定义如下:
  • Loop (A)的循环嵌套级别为1。
  • Loop (B)的循环嵌套级别为2。
  • Loop (C)的循环嵌套级别为3。
  • Loop (D)的循环嵌套级别为4。
  • Loop (E)的嵌套级别为3。
取决于您指定的循环嵌套级别,编译器尝试将不同程度地合并循环:
  • 如果您在loop (A)上指定#pragma loop_coalesce 1,则编译器不会尝试合并任何嵌套循环。
  • 如果您在loop (A)上指定#pragma loop_coalesce 2,则编译器会尝试合并loops (A)和(B)。
  • 如果您在loop (A)上指定#pragma loop_coalesce 3,那么编译器会尝试合并loop(A),(B),(C)和(E)。
  • 如果在loop (A)上指定#pragma loop_coalesce 4,那么编译器会尝试合并所有循环[loop (A) - loop (E)]。
要了解更多关于应用loop_coalesce循环预处理指令后不同效果的详细信息,请查看以下教程:
<quartus_installdir>/hls/examples/tutorials/best_practices/loop_coalesce

以下实例显示编译器如何将两个循环合并成单个循环。参考如下

以下实例显示编译器如何将两个循环合并成单个循环。

参考简单嵌套循环代码编写如下:
#pragma loop_coalesce
for (int i = 0; i < N; i++)
  for (int j = 0; j < M; j++)
    sum[i][j] += i+j;
编译器将两个循环合并到一起,因此他们可以像单个循环一样运行,写作如下:
int i = 0;
int j = 0;
while(i < N){
  
  sum[i][j] += i+j;
  j++;

  if (j == M){
    j = 0;
    i++;
  }
}