Intel® FPGA SDK for OpenCL™ Pro Edition: 最佳实践实践指南

ID 683521
日期 9/26/2022
Public
文档目录

3.4.5. 循环融合(Loop Fusion)

循环融合是一种编译器转换,其中两个相邻的循环在同一索引范围内合并成单个循环。这种转换通常用于减少循环开销并提高运行时性能。

如下实例显示了在简单情况下融合循环的效果:
Unfused Loops Fused Loops
for (i = 0; i < 300; i++)
    a[i] = a[i] + 3;
for (i = 0; i < 300; i++)
    b[i] = b[i] + 4;
for (i = 0; i < 300; i++) {
    a[i] = a[i] + 3;
    b[i] = b[i] + 4;
}

循环控制结构意味着很大的开销。通过融合两个循环,循环所需要的控制结构的数量就从两个减少到一个,从而减少了此开销。减少该控制结构数量的主要目的是为您的设计节省FPGA的面积的同时,仍然保持(理想情况下增加)组件吞吐量。

融合外部循环会引入不曾出现过的并发性。将两个相邻的循环(Lj和Lk)主体合并起来形成单个循环(Lf),其中的循环主体包含Lj和Lk主体。该组合循环主体可实现Lj和Lk的给定迭代串行化以并发执行的操作。实际上,这两个循环现在是作为一个循环在执行,从而减少了延迟。

如果融合了内部循环,而外部循环迭代的流水线执行已经实现了该并发性。该情况下,循环融合的并发效果就会减弱。

融合条件

如果Lj和Lk满足如下条件,则编译器认为这两个循环的融合有效:
  • 两个循环必须相邻。

    也就是说,您不能有一个带有副作用的声明Si,使得Lj之后先执行Si,然后才执行Lk

  • 每个循环必须有一个single-entry point(单一入口点)和一个single exit point(单一出口点)。例如,不考虑融合包含break声明的循环。
  • 循环必须没有负距离(negative-distance)依赖项。

    也就是说,对于Lj先于Lk被定义的Lj和Lk中,循环Lk的迭代m不依赖于循环Lj的迭代m+n(其中n>0)中计算的值。

自动循环融合(Loop Fusion)

如果编译器分析您的组件并确定融合循环是有益的,则 Intel® FPGA SDK for OpenCL™ Offline Compiler自动融合具有相同行程计数的循环。

循环融合有效转换(基于之前的标准),但编译器认为这样的融合并无益处,具体包括以下情况:
  • 两个循环的其中之一由ivdep pragma注释,但不能两个都是。
  • 两个循环其中之一(但不能两者皆是)包含无停顿逻辑。

High-Level Design Report中的Loop Analysis Report显示循环何时被融合。

除了自动循环融合, Intel® FPGA SDK for OpenCL™ Offline Compiler提供两个pragmas来帮助控制何时融合循环:
  • loop_fuse pragma

    覆盖编译器利益分析并在安全情况下融合相邻循环。

  • nofusion pragma

    使用该pragma注释循环以请求编译器不要融合带有注释的循环。