如果在设计中的不同 bank 或伪通道内拆分阵列,那么 HBM 即可提供高带宽。这是在高性能计算中将阵列分区为不同存储器区域的常用做法。主机会分配单个缓冲器,该缓冲器为所有伪通道所共用。
Vitis HLS 将把不同指针视作为各独立通道,并移除任何依赖关系分析。但主机会为两个指针分配单个缓冲器,这样该工具即可通过 pragma HLS ALIAS
来保留依赖关系分析。ALIAS 编译指示可以提供有关指针距离的数据依赖关系分析。如需了解更多信息,请参阅 ALIAS 编译指示。
内核 arg0 分配到 bank0 内,内核 arg1 则分配到 bank1 内。指针距离应在 ALIAS 编译指示的
distance
选项内指定,如下所示://Assume that the host code looks like this:
int *buf = clCreateBuffer(ctxt, CL_MEM_READ_ONLY, 2*bank_size, ...);
clSetKernelArg(kernel, 0, 0x20000000, buf); // bank0
clSetKernelArg(kernel, 1, 0x20000000, buf+bank_size); // bank1
//The ALIAS pragma informs data dependence analysis about the pointer distance
void kernel(int *bank0, int *bank1, ...)
{
#pragma HLS alias ports=bank0,bank1 distance=bank_size
ALIAS 编译指示可使用以下任一形式来指定:
- 恒定距离:
#pragma HLS alias ports=arr0,arr1,arr2,arr3 distance=1024
- 可变距离:
#pragma HLS alias ports=arr0,arr1,arr2,arr3 offset=0,512,1024,2048
约束:
- INTERFACE 编译指示中所有端口的深度都必须相同
- 所有端口都必须分配到不同捆绑,并绑定到不同 HBM 控制器
-
第二种形式下指定的端口数量与指定的偏移数量必须相同,每个偏移对应一个端口。不支持
#pragma HLS interface offset=off
- 每个端口仅限在一条 ALIAS 编译指示内使用