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

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

3.4.1. 启动间隔与最大频率之间的权衡

离线编译器会尽可能实现给定循环的启动间隔(II)为1。在某些情况下,离线编译器可能会以减低fMAX为代价而争取使启动间隔(II)为1。

请参考如下实例:

kernel void lowered_fmax (global int *dst, int N) {
     int res = N;
     #pragma unroll  9
     for (int i = 0; i < N; i++) {
 	    res += 1;
 	    res ^= i;
     }
     dst[0] = res;
 }

下图显示内核lowered_fmax中循环的数据路径。以9为因子部分展开该循环,因而该数据路径中包含原始循环主体的9个副本。为节省篇幅,下图中仅描述其中的三个副本:

图 53. 内核lowered_fmax中部分展开的循环的数据路径
内核lowered_fmax中的循环具有一个涉及res变量的循环携带依赖。这个循环携带的依赖在循环的数据路径中形成可一个循环,如图内核lowered_fmax中部分展开的循环的数据路径所示。
注: 启动下一次迭代时,从一次迭代来的res值必须可用。因此,如果循环要实现II=1,该周期必须最多只能包含一个寄存器。该周期包含一个具有9个加法和XOR的链,因此必须降低fMAX才能使该操作链在一个时钟周期内完成。离线编译器可能会降低内核的fMAX来实现II=1,因为启动间隔(II )是实现良好性能的重要因素。查阅HTML报告以找出是哪些循环其携带的依赖项限制了fMAX