セパレーターのスケジューリング - 2023.2 日本語

AI エンジン カーネルおよびグラフ プログラミング ガイド (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 日本語
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); 
  ...
}