The AI Engine kernel can be made to
run continuously by using graph::run(-1)
. This way the
kernel will restart automatically after the last iteration is complete.
graph::run()
without an argument runs the AI Engine kernels for a previously specified number of iterations
(which is infinity by default if the graph is run without any arguments). If the graph
is run with a finite number of iterations, for example, mygraph.run(3); mygraph.run();
the second run call will also run for three
iterations.However, it requires input buffers and output buffers to be ready before it can start. Thus, it has a small overhead between kernel execution iterations. This section describes a method to construct a type of kernel that has zero overhead and runs forever. It is called the free running AI Engine kernel.
The free running kernels can only have streaming interfaces. Loops with infinite iterations can be inside the kernel. For example:
void free_running_aie(input_stream<int32> *in, output_stream<int32> *out) {
while(true){//for(;;) is acceptable for C++
int32 tmp=readincr(in);
chess_separator_scheduler();//make sure stream is flushed
writeincr(out,tmp+1);
chess_separator_scheduler();//make sure stream is flushed
}
}
The free running kernel must have its own graph defined. This graph must not have any other non-free running kernels, because the graph never stops and non-free running kernels will lose control after being started. The graph containing the free running kernel must be a top-level graph that can be connected to other graphs, or it can be connected to PLIO or GMIO. A sample connection between the free running graph and other graphs is shown as follows.
passingGraph mygraph;
freeGraph mygraph_free;
connect<> net0(mygraph.out1,mygraph_free.in);
connect<> net1(mygraph_free.out,mygraph.in2);
The free running graph can be started using mygraph_free.run(-1)
or automatically started after loading.