作者:Florentw,来源:AMD Xilinx开发者社区
简介
在前文中,我们首先认识了 Vitis™ 2022.1 统一软件平台内适用于 Versal™ 的 AI 引擎 (AIE) 应用。
我们认识了 Vitis IDE 2022.1 中 AIE 应用工程的结构,还了解了用于 graph 初始化、运行和终止的一些 API。在本文中,我们将进一步深入讲解工程内的 AIE graph。
在本文中,我们将分析工程内例化和运行的 mygraph graph 内包含哪些内容。
要求
下文要求您已通读 AI 引擎系列 1 文章 。
AI 引擎 graph 简介
自适应数据流 (Adaptive Data Flow, ADF) graph 是 AIE 应用的更高层次。这些 graph 是以 C++ 编写的,包含节点和边缘,其中节点表示计算内核函数和/或子 graph,边缘表示数据连接。所有 ADF graph 类定义都是预定义的数据流 graph 类 adf::graph 的子类,必须位于头文件内。
在同一个头文件中可包含多个 ADF graph 定义。该类头文件应包含在 main 应用文件中,在此文件中,实际顶层 graph 在文件作用域内声明。
Graph 是使用 AI 引擎工具链来编译和执行的,此工具链集成在 Vitis 2022.1 统一软件平台内。
请务必注意,graph 是静态定义、映射和编译的(运行时期间 graph 不发生更改)。
请打开来自前文中导入的模板工程的 project.h 文件。
此文件内容如下:
include 头文件(第 2 行到第 3 行)添加了 adf 数据流库 (adf.h) 与内核函数原型 (kernels.h)。
从第 7 行到第 13 行:
class simpleGraph : public adf::graph {
private:
kernel first;
kernel second;
public:
input_plio in;
output_plio out;
其中基于 graph 类 adf::graph(第 7 行)声明了 1 个 graph。
在此 graph 内声明了 2 个具有 private 私有成员访问权限的内核,分别名为 first 和 second(第 8 行到第 10 行)
此 graph 调入了 1 个输入端口并调出 1 个输出端口(第 12 行到第 14 行)这些端口的类型为 PLIO,表示将连接到可编程逻辑 (PL)。另一种可用的端口类型是 GMIO,它可将 graph 连接到 Versal NoC。
我们基于此来更新 mygraph graph 视图,如下所示:
第 14 行到第 30 行包含此 graph 的构造函数:
simpleGraph(){
in = input_plio::create(plio_32_bits, "data/input.txt");
out = output_plio::create(plio_32_bits, "data/output.txt");
first = kernel::create(simple);
second = kernel::create(simple);
connect< window<128> > net0 (in, first.in[0]);
connect< window<128> > net1 (first.out[0], second.in[0]);
connect< window<128> > net2 (second.out[0], out);
source(first) = "kernels/kernels.cc";
source(second) = "kernels/kernels.cc";
runtime
runtime
}
在第 16 行和第 17 行上,定义了 PLIO 端口的大小和文本文件,这些文本文件将用于在仿真中馈送给这些端口。
在第 19 行和第 20 行上,创建了 2 个内核,并将其与名为“simple”的函数相关联。
第 21 行到第 23 行添加了连接信息:
在第 25 行和第 26 行上,这些内核与包含函数“simple”的源文件相关联,稍后将执行该函数。
最后,对这 2 个内核应用运行时比率 0.1。这表示这 2 个函数预计运行时间将占单个 AI 引擎处理时间的 10%。我们将在后续博文中讲解运行时比率的影响。
我们可以根据以上详细信息来绘制 mygraph graph 的视图,如下所示:
在下一篇博文中,我们将详细讲解内核。