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_X
和STR_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 的完整加速器类定义与应用代码均可按 调试和确认 中所述方式进行功能确认。