用户定义的加速器类 - 2023.2 简体中文

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

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

Vitis 支持使用 VSC 进行硬件和主机代码编译,前提是源代码包含衍生自 VPP_ACC 类的类。衍生自 VPP_ACC 的类将编译为加速器。

在单一源码的 C++ 模型内,VSC 加速器接口将定义为 C++ 头文件中所需的类定义。在单个编译单元(作为单一 v++ --compile 命令)内可找到多个加速器类定义,这些类定义都在同一 PL 硬件内实现。您还可跨多个编译单元提供多个加速器。但每个编译单元都必须为该单元定义完整的内核(或 HLS)代码。

每个用户定义的加速器类:

  • 都必须衍生自 Vitis 预定义的 VPP_ACC
  • 都必须具有名为 compute() 的静态方法
  • compute() 的实参和功能可由用户定义
  • 类模板具有两个实参:
    • 第一个实参必须与用户定义的类名相同
    • 第二个实参对应硬件中要复制的计算单元数量

以下提供了加速器类定义 (xmmult) 示例:

#include "vpp_acc.hpp"
class xmmult : VPP_ACC<xmmult, /*NCU=*/4>
{
public:
    // Platform port connections
    SYS_PORT(A, DDR[0]);
    SYS_PORT(B, DDR[1]);
    SYS_PORT(C, DDR[2]);
    SYS_PORT_PFM(u50, A, (HBM[0]:HBM[4]:HBM[8]:HBM[12]));
    SYS_PORT_PFM(u50, B, (HBM[1]:HBM[5]:HBM[9]:HBM[13]));
    SYS_PORT_PFM(u50, C, (HBM[2]:HBM[6]:HBM[10]:HBM[14]));
    // Data interfaces
    ACCESS_PATTERN(A, SEQUENTIAL);
    ACCESS_PATTERN(B, RANDOM);
    DATA_COPY(A, A[SZ]);  // move to local memory
    DATA_COPY(B, B[SZ]);
    ZERO_COPY(C);  // direct AXI-mm

    // define the SW entry point of the accelerator
    static void compute(data_t* A, data_t* B, data_t* C);
    // define the HW top-level of the accelerator (HLS top)
    static void mmult(data_t* A, data_t* B, data_t* C);
};

该类接口模型用于捕获单个统一源码内的所有硬件系统相关注意事项,并允许通过 compute() 函数与应用层轻松集成,如 compute() API 中所述。compute() 函数是主机应用的硬件加速器入口点。

类定义还包含引用 compute() 实参的指南宏。通过提供这些指南宏,即可指导 VSC 在实现期间执行特定的硬件选择。如需了解更多信息,请参阅 指南宏

以上所示示例描述了名为 xmmult 的加速器类,VSC 将对此类进行编译,使硬件中包含 4 个 CU (/*NCU=*/4)。此加速器包含 mmult() 函数中定义的 PE(或内核)代码,在 compute() 中会调用此代码并提取 3 个实参:A、B 和 C。对于其中每个实参,将指定两种类型的指南宏:存储器端口连接和数据访问。

  1. 使用 SYS_PORT()SYS_PORT_PFM() 的平台端口连接。
    1. 这些通常是全局存储器 I/O 连接或者硬件平台中可用的其他 AXI4 接口连接,在 Vitis 编译期间使用。在此示例中,前三个 SYS_PORT() 宏用于将 compute() 的三个实参 A、B 和 C 连接到不同的 DDR 存储体(0、1 和 2)。
      提示: 每个实参的 SYS_PORT() 指南宏连接都适用于 xmmult 加速器中的所有 CU 实例 (NCU=4),因为它仅指定一个存储体。
    2. 三个 SYS_PORT_PFM() 宏会通过两种方式来应用全局存储器连接:
      1. 仅当目标名称包含 u50 时(例如,在 U50 Alveo 卡中),才适用。
      2. 对于四个 CU 中的任一 CU,每个实参都连接到不同的 HBM bank。原因在于,用于每个实参的 SYS_PORT_PFM() 的语法均指定 4 次连接:
        SYS_PORT_PFM(u50, A, (HBM[0]:HBM[4]:HBM[8]:HBM[12]));
  2. 数据访问是使用 ACCESS_PATTERN() 宏、DATA_COPY() 宏和 ZERO_COPY() 宏指定的:
    1. ACCESS_PATTERN() 宏用于指令 VSC 为数据传输推断顺序访问或随机访问。在此示例中,实参 A 定义为顺序访问,因此可通过串流连接来实现。实参 B 则随机访问,因此需要本地(片上)存储器缓冲器以支持来自 PE mmult() 的随机数据访问。
    2. 对于实参 A 和 B,DATA_COPY() 宏用于指令 VSC 推断加速器旁的本地存储器 (RAM)。
    3. ZERO_COPY() 宏用于指令 VSC 为实参 C 创建存储器映射 AXI (M_AXI) 连接。