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

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

3.4. 单个Work-Item内核中的循环

Intel® FPGA SDK for OpenCL™ Offline Compiler通过流水线循环优化单个work-item内核的性能。
单个work-item内核中循环的数据路径包含多个运行中的迭代。该行为与NDRange内核中的循环不同,因为NDRange内核的循环包含多个正在运行的work-items(而非循环迭代)。在优化流水线循环中,每个时钟周期都会启动一个新的循环迭代。每个时钟周期启动一个新的循环迭代可以最大化流水线效率并产生最佳性能。如下图中所示,每时钟中周期启动一个循环可以让内核更快地完成。
图 51. 非流水线循环和流水线循环之间循环迭代的启动频率比较

启动一个循环迭代和下一个循环之间的时间周期数称为循环启动间隔(II)。最佳流水线循环的II值为1,因为每个时钟周期都会启动一个新的循环迭代。

Intel® FPGA SDK for OpenCL™ Offline Compiler可能不会流水线化内核中的每个循环。如果循环未被流水线化,则在前一次迭代完成执行之前,不会开始新的循环迭代。这种情况下,循环数据路径中每次只有一个有效循环迭代。查看HTML报告找出被流水线化的循环,而对于被流水线化的循环,则找出其II值。

请参考如下实例:

kernel void simple_loop (unsigned N,
                         global unsigned* restrict b, 
                         global unsigned* restrict c, 
                         global unsigned* restrict out)
{
    for (unsigned i = 1; i < N; i++) { 
        c[i] = c[i-1] + b[i];
    }
    out[0] = c[N-1];
}
图 52. 内核simple_loop的硬件数据路径

该图描述了离线编译器如何使用循环流水线有效地执行simple_loop。图示显示循环的数据路径中同时包含3个循环迭代。因此,该循环是流水线化的。图中还显示,每个时钟周期都会有一个新的循环迭代进入数据路径。因此,该循环的启动间隔(II)=1。