将内核端口映射到存储器 - 2023.2 简体中文

Vitis 统一软件平台文档 应用加速开发 (UG1393)

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 简体中文

链接阶段表示内核的存储器端口连接至存储器资源的时间,包括 DDR、HBM 和 PLRAM。默认情况下,在 v++ 链接进程中生成 xclbin 文件时,所有内核存储器接口均连接到相同的全局存储体(或 gmem)。因此导致每次只有 1 个内核接口可在存储体上进行数据传入和传出,使应用性能受到存储器访问的限制。

虽然 Vitis 编译器可以将 CU 自动连接到全局存储器资源,但您也可以手动指定每个内核实参(或接口)所连接到的全局存储体。正确配置内核到存储器的连接对于最大程度提升带宽、最优化数据传输和提升总体性能而言至关重要。即使器件中只有 1 个计算单元,将其输入和输出实参映射到不同全局存储体同样可以通过支持同时访问输入数据和输出数据来提升性能。

以下模块框图显示了 GitHub 上的 Vitis 示例中的 全局存储器双存储体 示例。此示例将内核的输入指针接口连接到 DDR 存储体 0,并将输出指针接口连接到 DDR 存储体 1。

图 1. 全局存储器双存储体示例
重要: 最多可将 15 个单独的内核接口连接到单个全局存储体。因此,如果设计内有超过 15 个存储器接口,则必须按上述方式显式执行存储器映射,并使用 --conectivity.sp 选项在不同存储体间分配连接。

首先将内核实参分配到各独立捆绑包,以增加可用接口端口,然后将实参分配给各独立存储体。以下示例使用的是 HW 接口 中所述的接口。

  1. 在 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
    

    在以上示例中,为存储器接口输入 pixelweights 分配不同的捆绑包名称,而 out 则与 pixel 捆绑在一起。这样即可创建 2 个独立的接口端口:gmemgmem1

    重要: 您必须使用全小写字符来指定 bundle= 名称,这样才能使用 --connectivity.sp 选项将其分配给特定存储体。
  2. 请按 --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_gmemm_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 的使用情况。

图 2. “Device Hardware Transaction”视图 DDR 存储体上的传输事务