compute() API - 2023.2 简体中文

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

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

compute() 方法是用户定义的加速器类定义中的一种用户定义的特殊方法,用于表示计算单元。compute() 的实参可将 CU 的软件接口提供给主机侧应用,compute() 的主体可指定 CU 的硬件组合。加速器类必须定义一种或多种其他方法,每一种方法都只能在 compute() 主体内单独调用。调用的此类每个函数都是硬件内的一个处理元素 (PE)。compute() 的主体可用于创建 PE 的结构组合。

compute() 主体具有下列功能特性:

  • 它属于处理元素的结构化网络,并且:
    • 在硬件中使用 AXI4 标准协议。
    • 为每个 compute() 作业使用启动/停止同步
    • 可表示已同步的硬件流水线
  • compute() 主体内仅允许调用 PE 函数和本地变量声明,不允许任何其他 C 语言构造
  • 每个 PE 都表示一个硬件内并行运行的处理元素:
    • 此函数的代码使用 Vitis HLS 作为 FSM 和数据路径来实现
    • PE 函数可包含 Vitis HLS 编译指示 (#pragma HLS)
  • PE 可连接到全局存储器或其他平台 AXI4 端口
  • PE 可通过 AXI4‑Stream 接口彼此相连
  • PE 可自由运行,并且:
    • 无法察觉到不含 ap_ctrl 信号的传输事务的启动/停止
    • 始终执行(数据驱动),无复位/启动状态
    • 仅允许 AXI4‑Stream 接口

compute() 函数定义示例如下所示:

typedef vpp::stream<float, STREAM_DEPTH> InternalStream;
void pipelined_cu::compute(float* A, float* B, float* E, int M) {
    static InternalStream STR_X("str_X");
    static InternalStream STR_Y("str_Y");
    mmult(A, B, STR_X, M);
    incr_10(STR_X, STR_Y, M);
    incr_20(STR_Y, E, M);
}
  • 此示例是 3 个 PE 组成的一条硬件流水线,这 3 个 PE 通过 2 个内部 AXI4‑Stream 接口相连:STR_XSTR_Y
  • mmult PE 使用矩阵 A 和 B 关联的指针从全局存储器读取这两个矩阵,并写入串流 STR_X
  • incr_10 PE 从串流 STR_X 读取并写入串流 STR_Y
  • incr_20 PE 从串流 STR_Y 读取并写入全局存储器 E。
  • 标量实参 M 是矩阵的维度,提供给 CU 中的所有 PE。

此模型可用于定义各种类型的加速器系统组合。

compute() 接口旨在简练捕获硬件系统,同时提供简单的软件应用接口。下一节描述了 compute() 接口上允许的本机 C++ 数据类型。含 compute() 和其他 PE 的完整加速器类定义与应用代码均可按 调试和确认 中所述方式进行功能确认。