AI エンジン カーネルは、graph::run(-1)
を使用することで連続的に実行させることができます。これを使用すると、カーネルが最後の反復が完了した後に自動的に再起動します。
注記:
graph::run()
を引数なしで実行すると、AI エンジン カーネルをあらかじめ指定された反復回数 (引数なしでグラフを実行した場合、デフォルトで無限大となる) だけ実行します。グラフを有限の反復回数、たとえば mygraph.run(3); mygraph.run();
で実行する場合、2 回目の run 呼び出しも 3 回の反復で実行されます。ただし、開始する前に入力バッファーと出力バッファーの準備が完了している必要があります。このため、カーネル実行の反復間には、わずかにオーバーヘッドがあります。このセクションでは、オーバーヘッドが 0 で永久に動作するタイプのカーネルを構築する方法について説明します。これは、フリーランニング AI エンジン カーネルと呼ばれます。
フリーランニング カーネルには、ストリーミング インターフェイスしか含まれません。無限に反復するループは、カーネル内に含めることができます。次に例を示します。
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
}
}
フリーランニング カーネルには、独自のグラフが定義されている必要があります。このグラフには、ほかのフリーランニングではないカーネルを含めないようにする必要があります。これは、グラフが停止することがないので、フリーランニング以外のカーネルは起動後に制御を失うからです。フリーランニング カーネルを含むグラフは、ほかのグラフに接続できる最上位グラフである必要があります。または、PLIO または GMIO に接続することもできます。フリーランニング グラフとほかのグラフの接続例を次に示します。
passingGraph mygraph;
freeGraph mygraph_free;
connect<> net0(mygraph.out1,mygraph_free.in);
connect<> net1(mygraph_free.out,mygraph.in2);
図 1. フリーランニング グラフの接続
フリーランニング グラフは、mygraph_free.run(-1)
を使用して開始することも、ロード後に自動的に開始することもできます。