AI 引擎编程模型具有如下功能特性。
- 所有 I/O 对象(
input_plio
/output_plio
和input_gmio
/output_gmio
)均为计算图类的公共成员。支持通过 I/O 对象循环。这样即可简化 I/O 对象构造,降低出错概率。例如:class mygraph : public graph { public: // Declare N kernels. kernel k[N]; // Declare N input_gmio(s) and output_gmio(s) input_gmio gmioIn[N]; output_gmio gmioOut[N]; mygraph() { // Create multiple input_gmio(s)/output_gmio(s) and connections for (int i=0; i<N; i++) { gmioIn[i] = input_gmio::create("gmioIn" + std::to_string(i), 64, 1); gmioOut[i] = output_gmio::create("gmioOut" + std::to_string(i), 64, 1); connect(gmio[i].out[0], k[i].in[0]); connect(k[i].out[0], gmioOut[i].in[0]); dimensions(k[i].in[0]) = {FRAME_LENGTH}; dimensions(k[i].out[0]) = {FRAME_LENGTH}; } } };
注释: 虽然这并非强制要求,但创建input_plio
、output_plio
、input_gmio
和output_gmio
对象时,可提供逻辑名称。如不提供,AI 引擎编译器将自动设置唯一的逻辑名称。 - 编程模型能够简化设计中的连接。只要
input_plio
、output_plio
、input_gmio
和output_gmio
对象在局部作用域内,connect
调用就无需提供唯一连接名称。 - 编程模型支持
input_plio
、output_plio
、input_gmio
和output_gmio
对象的方向属性。方向属性是在对象构造内确定的。
以下提供了用于对这些先前列出的功能特性进行寻址的编程模型示例。
/* A graph with both PLIO and GMIO*/
class mygraph : graph
{
public:
/* Classes support input_gmio/output_gmio and input_plio/output_plio */
input_gmio gm_in;
output_gmio gm_out;
input_plio pl_in;
output_plio pl_out;
kernel k1, k2;
mygraph()
{
k1 = kernel::create(...);
k2 = kernel::create(...);
/* create() API for PLIO and GMIO objects support same arguments specified as in global scope */
gm_in = input_gmio::create("GMIO_In0",/*const std::string& logical_name*/
64, /*size_t burst_length*/
1 /*size_t bandwidth*/);
gm_out = output_gmio::create("GMIO_Out0", 64, 1);
pl_in = input_plio::create("PLIO_In0", /* std::string logical_name */
plio_32_bits, /* enum plio_type plio_width */
"data/input.txt",/* std::string data_file */
250.0 /* double frequency */ );
pl_out = output_plio::create("PLIO_Out0", plio_32_bits, "data/output.txt", 250.0);
/* Each input_gmio/output_gmio and input_plio/output_plio supports 1 port per direction */
connect(gm_in.out[0], k1.in[0]);
connect(k1.out[0], gm_out.in[0]);
connect(pl_in.out[0], k2.in[0]);
connect(k2.out[0], pl_out.in[0]);
location<GMIO>(gm_in) = shim(col);
location<GMIO>(gm_out) = shim(col, ch_num); /* not supported */
location<PLIO>(pl_in) = shim(col);
location<PLIO>(pl_out) = shim(col, ch_num);
}
};
先前代码片段用于演示:
-
input_plio
、output_plio
、input_gmio
和output_gmio
均为计算图内的公共对象。 -
input_plio
和output_plio
类都继承自PLIO
类。 -
input_gmio
和output_gmio
类都继承自GMIO
类。 -
input_plio
、output_plio
、input_gmio
和output_gmio
对象构造均包含方向属性。 -
connect
调用不需要唯一名称。 - 位置约束可直接应用于
input_plio
、output_plio
、input_gmio
和output_gmio
对象,但 GMIO 通道约束例外,在此版本中不支持此类约束。注释: 不支持含 DMA 通道的 GMIO shim 拼块位置约束。注释: 主机应用调用剖析 API 需要引用对象的公共成员mygraph.gm_in
、mygraph.gm_out
、mygraph.pl_in
和mygraph.pl_out
。如需了解有关剖析 API 的更多详细信息,请参阅 AI 引擎工具和流程用户指南(UG1076) 中的在仿真期间执行 AI 引擎计算图应用性能分析。以下提供了从编程模型执行剖析调用的示例。
event::handle handle0 = event::start_profiling(mygraph.gm_in, event::io_stream_start_to_bytes_transferred_cycles, sizeIn*sizeof(cint16));
重要:
input_plio
、output_plio
、input_gmio
和 output_gmio
对象必须具有唯一名称。如果名称不唯一,则会发出以下错误消息:ERROR: [aiecompiler 77-4551] The logical name DataIn1 of node i6 conflicts with the logical/qualified name of node i0.