链接阶段表示内核的存储器端口连接至存储器资源的时间,包括 DDR、HBM 和 PLRAM。默认情况下,在 v++
链接进程中生成 xclbin
文件时,所有内核存储器接口均连接到相同的全局存储体(或 gmem
)。因此导致每次只有 1 个内核接口可在存储体上进行数据传入和传出,使应用性能受到存储器访问的限制。
虽然 Vitis 编译器可以将 CU 自动连接到全局存储器资源,但您也可以手动指定每个内核实参(或接口)所连接到的全局存储体。正确配置内核到存储器的连接对于最大程度提升带宽、最优化数据传输和提升总体性能而言至关重要。即使器件中只有 1 个计算单元,将其输入和输出实参映射到不同全局存储体同样可以通过支持同时访问输入数据和输出数据来提升性能。
以下模块框图显示了 GitHub 上的 Vitis 示例中的 全局存储器双存储体 示例。此示例将内核的输入指针接口连接到 DDR 存储体 0,并将输出指针接口连接到 DDR 存储体 1。
--conectivity.sp
选项在不同存储体间分配连接。首先将内核实参分配到各独立捆绑包,以增加可用接口端口,然后将实参分配给各独立存储体。以下示例使用的是 HW 接口 中所述的接口。
- 在 C/C++ 内核代码中,先使用 INTERFACE 编译指示将实参分配给各独立捆绑包,然后再对其进行编译:
void cnn( int *pixel, // Input pixel int *weights, // Input Weight Matrix int *out, // Output pixel ... // Other input or Output ports #pragma HLS INTERFACE m_axi port=pixel offset=slave bundle=gmem #pragma HLS INTERFACE m_axi port=weights offset=slave bundle=gmem1 #pragma HLS INTERFACE m_axi port=out offset=slave bundle=gmem
在以上示例中,为存储器接口输入
pixel
和weights
分配不同的捆绑包名称,而out
则与pixel
捆绑在一起。这样即可创建 2 个独立的接口端口:gmem
和gmem1
。重要: 您必须使用全小写字符来指定bundle=
名称,这样才能使用--connectivity.sp
选项将其分配给特定存储体。 - 请按 --connectivity 选项 中所述方式使用
--connectivity.sp
选项或者将其包含在配置文件内。例如,对于以上所示cnn
内核,配置文件中的connectivity.sp
选项将如下所示:[connectivity] #sp=<compute_unit_name>.<argument>:<bank name> sp=cnn_1.pixel:DDR[0] sp=cnn_1.weights:DDR[1] sp=cnn_1.out:DDR[0]
其中:
-
<compute_unit_name>
是 CU 的实例名,由connectivity.nk
选项确定(如 创建内核的多个实例 中所述),或者如果不指定多个 CU,则直接命名为<kernel_name>_1
。 -
<argument>
是内核实参的名称。或者,您可以按 C/C++ 内核的 HLS INTERFACE 编译指示中定义的方式来指定内核接口的名称,包括m_axi_
和bundle
名称。在以上cnn
内核中,端口为m_axi_gmem
和m_axi_gmem1
。提示: 对于 RTL 内核,接口由 kernel.xml 文件中定义的接口名称来指定。 - 对于含 4 个 DDR 存储体的平台,
<bank_name>
表示为DDR[0]
、DDR[1]
、DDR[2]
和DDR[3]
。您还可将存储器指定为连续范围内的存储体,例如 DDR[0:2],在此情况下,XRT 将在运行时分配该存储体。某些平台还支持 PLRAM、HBM、HP 或 MIG 存储器,在此情况下,您可使用 PLRAM[0]、HBM[0]、HP[0] 或 MIG[0]。您可以使用
platforminfo
实用工具来获取有关指定平台上可用的全局存储体的信息。如需了解更多信息,请参阅 platforminfo 实用工具。在同时包含 DDR 和 HBM 存储体的平台中,内核必须使用不同的 AXI 接口来访问不同的存储器。DDR 和 PLRAM 访问权限可通过单一端口共享。
提示: 要向特定存储体分配内核接口,可能还需要您指定 SLR 以便将内核布局到其中。如需了解更多信息,请参阅 在 Alveo 加速器卡上将计算单元分配给 SLR。
-
您可以使用 Vitis 分析器中的Device Hardware Transaction(器件硬件传输事务)视图来观察实际的 DDR 存储体通信,并分析 DDR 的使用情况。