カーネルは、入力バッファーからデータを読み出し、出力バッファーにデータを書き込みます。デフォルトでは、データの入力バッファーを待機するのに必要な同期は、カーネルに入る前に実行されます。空の出力バッファーを準備するのに必要な同期も、カーネルに入る前に実行されます。カーネルの実行開始後は、データの個々のサンプルの読み出しまたは書き込みのために同期バッファー ポートをカーネル内で同期させる必要はありません。
バッファー ポート サイズは、dimensions()
API またはカーネル関数プロトタイプを使用して宣言できます。
- オプション 1
- グラフ内の
dimensions()
API を使って設定します。connect netN(in.out[0], k.in[0]); dimensions(k.in[0])={INPUT_SAMPLE_SIZE};
- オプション 2
- カーネル ヘッダー ファイルで宣言され、グラフ コードで参照されるカーネル関数プロトタイプを使用して設定します。
グラフ コードで接続を指定します。
connect netN(in.out[0], k.in[0]);
カーネル コードでデータ型およびバッファー サイズを指定します。
void simple(input_buffer<int32, adf::extents<INPUT_SAMPLE_SIZE>> & in, output_buffer<int32, adf::extents<OUTPUT_SAMPLE_SIZE>> & out);
次の例では、タイル 1 のカーネルは書き込みにピンポン バッファーを使用し、タイル 1 に隣接するタイル 2 のカーネルは読み出しに同じピンポン バッファーを使用します。2 つのカーネルと 2 つの main 関数の実行時間は異なるため、実行中に一部のプロセッサが停止することがあります。全体的なメカニズムとして、カーネル 1 が ping バッファーに書き込み、カーネル 2 が pong バッファーから読み出します。次の図では、反復カーネル 1 が pong バッファーに書き込み、カーネル 2 が ping バッファーから読み出しています。
図 1. 同期ピンポン バッファー アクセスのロック メカニズム
カーネルのバッファー ロック メカニズムは、タイル main
関数で処理されます。カーネルは、すべての入力バッファーと出力バッファーがそれぞれ読み出しと書き込みのためにロックされたときにのみ開始します。ロック取得の最小レイテンシは、バッファーの取得が可能な状態となっている場合は 7 クロック サイクルです。既にほかのカーネルによってロックされている場合は、利用可能になるまで停止します (図では赤で表示)。
図から、ロック取得が ping バッファーと pong バッファーで交互に実行されているのがわかります。ping バッファーと pong バッファーの選択は自動的に実行されるため、この時点ではユーザーの介入は不要です。