仅对英特尔可见 — GUID: wfa1476380079940
Ixiasoft
产品终止通知
1. Intel® FPGA SDK for OpenCL™ Pro Edition最佳实践指南介绍
2. 查看您Kernel的report.html文件
3. OpenCL内核设计概念
4. OpenCL内核设计最佳实践
5. 分析(Profiling)您的内核来识别性能瓶颈
6. 提高单个Work-Item内核性能的策略
7. 提高NDRange内核数据处理效率的策略
8. 提高存储器访问效率的策略
9. 优化FPGA面积使用的策略
10. 优化英特尔 Stratix 10 OpenCL设计的策略
11. 提高主机应用程序性能的策略
12. Intel® FPGA SDK for OpenCL™ Pro版最佳实践指南存档
A. Intel® FPGA SDK for OpenCL™ Pro版最佳实践指南修订历史
仅对英特尔可见 — GUID: wfa1476380079940
Ixiasoft
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。