HBM 中多端口访问的编程模型 - 2021.2 Chinese

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2021-12-15
Version
2021.2 Chinese

如果在设计中的不同 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 编译指示内使用