配置 input_plio/output_plio - 2023.2 简体中文

AI 引擎内核与计算图编程指南 (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 简体中文

通过配置 input_plio/output_plio 对象即可建立跨 AI 引擎到可编程逻辑 (PL) 边界的外部串流连接。当单独设计硬件平台并且在平台内 PL 块已例化时,就会出现这种情况。此硬件设计是从 Vivado 工具作为封装 XSA 导出的,在 AMD Vitis™ 工具中使用该平台创建新工程时,应指定此硬件设计。此 XSA 包含逻辑架构接口规范,用于识别平台可支持的 AI 引擎 I/O 端口。以下提供了包含串流端口的接口规范(从 AI 引擎角度来看)示例。

表 1. 逻辑架构端口规范示例
AI 引擎端口 注解 类型 方向 数据宽度 时钟频率 (MHz)
S00_AXIS Weight0 串流 32 300
S01_AXIS Datain0 串流 32 300
M00_AXIS Dataout0 串流 32 300

此接口规范描述了平台导出两个串流输入端口(AI 引擎阵列接口上的从端口)和一个串流输出端口(AI 引擎阵列接口上的主端口)的方式。通过使用 input_plio/output_plio 属性规范来表示这些接口端口,并将其连接到数据流计算图中其各自的目标或源内核端口。

以下示例显示了在程序中使用前表中所示的 input_plio/output_plio 属性从文件读取输入数据或者将输出数据写入文件的方式。在 PLIO 构造函数中还提供了 input_plio/output_plio 端口的宽度和频率。

input_plio wts  = input_plio::create("Weight0", adf::plio_32_bits, "inputwts.txt", 300);
input_plio din  = input_plio::create("Datain0", adf::plio_32_bits, "din.txt", 300);
output_plio out = output_plio::create("Dataout0", adf::plio_32_bits, "dout.txt", 300);

完成仿真后,会从提供的两个文件读取输入权重和数据,并在指定的输出文件中以串流方式生成输出数据。

导出硬件平台时,所有 AI 引擎到 PL 的串流连接均已从 PL 侧布线到特定物理通道。

宽串流数据路径 PLIO

通常,AI 引擎阵列运行的时钟频率高于内部可编程逻辑。aiecompiler 可搭配编译器选项 --pl-freq 来识别期望的 PL 块运行频率。为了平衡 AI 引擎与内部可编程逻辑之间的吞吐量,可以为更宽的串流数据路径(64 位或 128 位)设计 PL 块,随后在 AI 引擎到 PL 接口交汇时,将其自动序列化到 AI 引擎串流网络上的 32 位串流中。

以下示例显示了如何在程序中使用宽串流 input_plio/output_plio 属性从文件读取输入数据或者将输出数据写入文件。

output_plio pl_out = output_plio::create("TestLogicalNameOut", plio_128_bits, "data/output.txt");
input_plio  pl_in  = input_plio::create("TestLogicalNameIn", plio_128_bits, "data/input.txt");
...
connect(pl_in.out[0], kernel_first.in[0]);
connect(kernel_last.out[0], pl_out.in[0]);

在前述示例中,已声明两个 128 位 PLIO 属性:一个对应输入,另一个对应输出。随后,input_pliooutput_plio 照常挂接到计算图。然后,input_plio/output_plio 属性中指定的数据文件会自动打开,并分别用于读取输入或写入输出。

对数据文件执行 input_plio/output_plio 仿真时,应对数据加以组织,以适应 PL 块的宽度和 AI 引擎块上的连接端口的数据类型。例如,如果数据文件表示 32 位 PL 接口到期望 int16AI 引擎内核的连接,则应组织为每行两列,其中每一列都表示一个 16 位值。又例如,如果数据文件表示 64 位 PL 接口到期望 cint16AI 引擎内核的连接,则应组织为每行四列,其中每一列都表示一个 16 位的实数值或虚数值。同样的 64 位 PL 接口如果为 AI 引擎内核提供 int32 端口,则需将数据组织为每行两列 32 位实数值。以下示例演示了前述场景的输入文件的格式。

64-bit PL interface feeding AI Engine kernel expecting cint16
input file:
0 0 0 0
1 1 1 1
2 2 2 2

64-bit PL interface feeding AI Engine kernel expecting int32
input file:
0 0
1 1
2 2

凭借这些宽 PLIO 属性规范,aiecompiler 即可自动生成 AI 引擎阵列接口配置,以将 64 位或 128 位数据转换为一系列 32 位码字。所有 PL IP 块都遵循 AXI4‑Stream 协议,这样即可确保在较宽的数据路径上具有相应的选通信号用于描述有效的码字,并且这些路径可以发送部分数据。