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

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

6.1.3. 将循环携带的依赖项转移到局部存储器

对于您无法删除的循环携带依赖项,可通过将具有循环携带依赖项的数组从全局存储器转移到局部存储器来改善II(启动间隔)。

请参考如下内核实例:

1 #define N 128
2
3 __kernel void unoptimized( __global int* restrict A )
4 {
5     for (unsigned i = 0; i < N; i++)
6           A[N-i] = A[i];
7 }	 

全局存储器访问的延迟很长。本实例中,数组A[i]上循环携带的依赖项导致长延迟。该延迟在优化报告中的反映是II为227。要通过将循环携带的依赖项从全局存储器转移到局部存储器来减少该II值, 请执行以下任务:

  1. 将具有循环携带依赖项的数组复制到局部存储器。本实例中,数组A[i]成为局部存储器中的数组B[i]
  2. 执行数组B[i]上带有循环携带依赖项的循环。
  3. 将该数组复制回全局存储器。
当您将数组A[i]传输到局部存储器,并且成为数组B[i]后,循环携带的依赖项现在位于B[i]上。因为局部存储器上的延迟比全局存储器低得多,所以II值改善了。

以下是优化后的重构内核:

 1 #define N 128
 2
 3 __kernel void optimized( __global int* restrict A )
 4 {
 5     int B[N];
 6
 7     for (unsigned i = 0; i < N; i++)
 8         B[i] = A[i];
 9
10     for (unsigned i = 0; i < N; i++)
11         B[N-i] = B[i];
12
13     for (unsigned i = 0; i < N; i++)
14         A[i] = B[i];
15 }

类似于以下类容的优化报告表明II成功从227减少到2: