AI 引擎内核可使用 graph::run(-1)
来始终保持运行。这样在最后一次迭代后,内核将自动重新启动。
注释: 无实参的
graph::run()
会按先前指定的迭代次数来运行 AI 引擎内核,在无任何实参的前提下运行 graph 时,默认迭代次数无限。如果 graph 按有限次数的迭代来运行,例如,mygraph.run(3);
mygraph.run();
,那么第二轮调用也会运行 3 次迭代。但它要求输入缓冲器和输出缓冲器全部就绪之后才能开始。因此,在内核执行迭代之间存在少量开销。本节描述的方法可用于构造一种具有零开销且永续运行的内核。它称为自由运行的 AI 引擎内核。
自由运行的内核只能包含串流接口。含无限迭代的循环可位于内核内部。例如:
void free_running_aie(input_stream_cint16 * in,
output_stream_cint16 * out) {
while(true){ //This can be syntax supported by C++, for example: for(;;)
writeincr(out, readincr(in));
}
}
自由运行的内核必须定义其自己的 graph。此 graph 不得包含任何其它非自由运行内核,因为此 graph 永不停止,但非自由运行的内核将在启动后失去控制。包含自由运行的内核的 graph 必须为顶层 graph,可以连接到其它 graph,或者可以连接到 PLIO 或 GMIO。以下显示了自由运行的 graph 与其它 graph 之间的连接样本。
simpleGraph mygraph; //normal graph
freeGraph mygraph_free; //graph with free running kernel
simulation::platform<1,1> platform("data/input.txt", "data/output.txt");
connect<> net0(platform.src[0], mygraph.in);
connect<> net1(mygraph.sout,mygraph_free.in);
connect<> net2(mygraph_free.out,mygraph.sin);
connect<> net3(mygraph.out, platform.sink[0]);
图 1. 自由运行的 graph 连接
自由运行的 graph 可使用 mygraph_free.run(-1)
启动,或者也可以在加载后自动启动。