AI 引擎系列 2 - AI 引擎 graph 简介 (2022.1 更新)

作者: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(first) = 0.1;
runtime(second) = 0.1;

}

在第 16 行和第 17 行上,定义了 PLIO 端口的大小和文本文件,这些文本文件将用于在仿真中馈送给这些端口。

在第 19 行和第 20 行上,创建了 2 个内核,并将其与名为“simple”的函数相关联。

第 21 行到第 23 行添加了连接信息:

  • 在第 21 行上,第一个内核的输入 (first.in[0]) 连接到 graph 的输入 (in)。此连接称为 net0,其窗口大小为 128 字节(我们将在后文中讲解连接类型)
  • 在第 22 行上,第二个内核的输入 (second.in[0]) 连接到第一个内核的输出 (first.out[0])。此连接称为 net1,其窗口大小为 128 字节。
  • 在第 23 行上,第二个内核的输出 (second.out[0]) 连接到 graph 的输出 (out)。此连接称为 net1,其窗口大小为 128 字节。
  • 在第 25 行和第 26 行上,这些内核与包含函数“simple”的源文件相关联,稍后将执行该函数。

    最后,对这 2 个内核应用运行时比率 0.1。这表示这 2 个函数预计运行时间将占单个 AI 引擎处理时间的 10%。我们将在后续博文中讲解运行时比率的影响。

    我们可以根据以上详细信息来绘制 mygraph graph 的视图,如下所示:

    在下一篇博文中,我们将详细讲解内核。

    最新文章

    最新文章