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

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

10.2.1. 简化英特尔 Stratix 10 OpenCL设计中的循环携带依赖性

要确保您的英特尔 Stratix 10 OpenCL设计达到最佳性能,请务必尽可能简化循环携带的计算,从而使得 Intel® FPGA SDK for OpenCL™ Offline Compiler可以在一个周期内完成计算。

离线编译器无法流水线化用于携带依赖项的循环的计算。那些循环包含的许多复杂计算限制了编译器执行重新定时优化的数量,因为编译器无法对循环路径进行函数性改变。即使II=1,HTML报告也会识别出fMAX瓶颈。请将该信息与Loop Analysis report窗格中显示的信息结合使用,以评估设计中最关键的路径。

如果循环迭代的依赖项包含编译器无法在一个时钟周期内计算的逻辑,那么有一种缓解方法是延长依赖项的距离。依赖项的距离是从编译器读取值到下一个值可用这个循环发生的迭代次数。High Level Design Report内的循环分析报告确定了最复杂的循环依赖项。

循环携带依赖项的自动优化

对于英特尔 Stratix 10设计, Intel® FPGA SDK for OpenCL™ Offline Compiler尝试在循环的每次迭代中自动增加值模数(modulo)N(mod N)。

您可以对任何相关联和相通信的操作手动应用该优化。如果您以这种方式重构代码,编译器可以将计算分散到两个或者更多循环携带的变量上,并且可以在非循环携带的计算中需要该值时重新组合该计算。请参阅“Safari, Nima et al. "Methods for Implementation of Feedback Loops in High Speed FPGA Applications". 24th International Conference on Field Programmable Logic and Applications (FPL) (2014) doi:10.1109/FPL.2014.6927434”获得更多信息。

Intel® 建议对在设计关键路径上的操作进行优化,请参考以下实例:

int i = 0;
int N = 256;
while (!done) {
   i++;
   if (i == N) i = 0;
   <use i for some computation…>
}

每次循环迭代中,离线编译器必须增加一个值,并将其与常量进行比较,然后在必要时重置该值。为了优化次代码,编译器有效地分解表达式并将计算分散到两个时钟周期中以增加依赖项之间的距离。此优化的副作用是逻辑使用量略有增加。

离线编译器可能无法优化实例代码的场景如下:

  • 如果i的初始值非零(non-zero), 并且编译器无法确定该初始值是否介于0到N之间,则编译器无法保证上述形式在功能上是等效的。
  • 如果任何条件导致i被修改或重置到0,那么离线编译器不会应用此优化。