AI エンジン コンパイラは、基本ブロック内のデータ移動と式を並べ替えます。データ依存がコンパイラで認識されない場合、またはコードにシーケンシャル ポイントを挿入する場合は、次のようにプラグマ
chess_separator_scheduler()
を使用して、コードの一部を分離できます。func(...){
//code block 1
chess_separator_scheduler();
//code block 2
}
chess_separator_scheduler(N)
プラグマは、chess_separator_scheduler()
プラグマの別の形式です (N
は 2 つのブロック間の追加 N サイクル)。N
には、正の値または負の値を指定できます。負のオフセットを使用すると、2 つのブロックを部分的 (最大 N サイクルまで) オーバーラップさせることができます。
たとえば、コンパイラではカーネルの異なるストリーム間の依存関係は認識されません。同じサイクルで異なるストリーム読み出しまたは書き込みをスケジュールできます。ストリーム読み出しまたは書き込みでカーネルがストールした場合、カーネルとの間でデータを供給または消費するには外部ソースが必要です。次のコード例はでは、ストリーム書き込み (
out
) および読み出し (receive_back
) を同じサイクルにスケジュールできます。void producer(output_stream<int32> *out, input_stream<int32> *receive_back){
int32 data;
...
writeincr(out,data); //schedule in the same cycle
readincr(receive_back); //schedule in the same cycle
...
}
ストリーム
receive_back
から読み出すデータがなくなると、上記のカーネルはストールします。そのため、ストリーム out
に送信されるデータがありません。データを receive_back
に送信する前に外部ソースが producer
からデータを受信する必要がある場合、カーネルはストールし、回復できません。ストリーム操作を異なるサイクルでスケジュールするには、次のように chess_separator_scheduler(N)
を追加します。void producer(output_stream<int32> *out, input_stream<int32> *receive_back){
int32 data;
...
writeincr(out,data);
//Make sure read occurs after write and data is sent out before a possible stall
chess_separator_scheduler(1);
readincr(receive_back);
...
}