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

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

8.4. 通过Banking(储存)局部存储器来提高内核性能

指定numbanks(N)bankwidth(M)高级内核属性使您能够配置局部存储器bank以进行并行存储访问。 这些高级内核属性所描述的存储几何决定了您的内核可以并行访问局部存储器系统的哪些单元。

以下代码实例描述了在单个bank中实现的8 x 4局部存储器系统。因此,系统中没有两个单元可以并行访问。

local int lmem[8][4];

#pragma unroll
for(int i = 0; i<4; i+=2) {
    lmem[i][x] = …; 
}
图 82. 串行访问8 x 4局部存储器系统

为了提高性能,您可以在代码中添加numbanks(N)bankwidth(M)来定义存储器bank的数量并且以字节定义bank宽度。以下代码实现8个存储器bank,每个16字节宽。该存储器bank配置实现对8 x 4阵列的并行存储器访问。

local int __attribute__((numbanks(8), 
                        bankwidth(16)))
                        lmem[8][4]; 
#pragma unroll
for (int i = 0; i < 4; i+=2) {
    lmem[i][x & 0x3] = …; 
}
注意:

为了使能并行访问,您必须屏蔽对较低阵列索引的动态访问。屏蔽较低阵列索引上的动态访问会通知 Intel® FPGA SDK for OpenCL™ Offline Compilerx不超出较低索引绑定。

图 83. 并行访问具有8个16-Byte-Wide Memory Bank的8 x 4局部存储器Bank

通过对numbanks(N)bankwidth(M)内核属性指定不同的值,您可以更改并行访问模式。如下代码实现四个存储器bank,每个4-bytes宽。该存储器bank配置实现对8 x 4阵列的并行存储器访问。

local int __attribute__((numbanks(4), 
                        bankwidth(4)))
                        lmem[8][4]; 

#pragma unroll
for (int i = 0; i < 4; i+=2) {
    lmem[x][i] = …; 
}
图 84. 并行访问带有4个4-字节-宽存储器Banks的8 x 4局部存储器系统