AI エンジン カーネルは、データ ブロックを消費または生成するか、あるいはデータ ストリームをサンプル単位でアクセスまたは生成できます。このセクションでは、両方の場合のデータ アクセス API について説明します。
ウィンドウ ベース アクセス
カーネルに入力されるデータのブロックは、入力バッファーと呼ばれます。入力バッファーは、そのバッファーに含まれるデータ型によって定義されます。次に、実数部と虚数部が両方とも 16 ビット幅の複素整数を含む入力バッファーを宣言する例を示します。
input_buffer<cint16> myInputBuffer;
カーネルから出力されるデータのブロックは、出力バッファーと呼ばれます。これも同様に、データ型で定義されます。次に、32 のビットの整数を含む出力ウィンドウを宣言する例を示します。
output_buffer<int32> myOutputBuffer;
カーネルは、入力バッファーからデータを読み出し、出力バッファーにデータを書き込みます。デフォルトでは、データの入力バッファーを待機するのに必要な同期または空の出力バッファーを準備するのに必要な同期は、カーネルに入る前に実行されます。カーネル内では、データの個々の要素を読み出すためまたは書き込むために同期は必要はありません。つまり、バッファーがフルでなければカーネルは実行されません。
場合によっては、カーネルの各呼び出しでバッファーのフル データを消費しない場合、または各呼び出しでバッファーのフル データを生成しない場合は、カーネルの [Block Parameters] ダイアログ ボックスでカーネル ポートを async
に設定することにより、バッファーの同期を制御できます。
1 つのブロックの入力から次のブロックにオーバーラップさせることも可能です。これは通常、フィルターなどの特定のアルゴリズムで必要です。このオーバーラップは、バッファー マージンと呼ばれます。バッファー マージンを指定すると、カーネルは buffer_size + margin_size のサンプル数にアクセスできます。
バッファー マージンの動作を、次の例を使用して説明します。
入力はサイズ 8
のベクターで、これがバッファー サイズ 6
でバッファー マージン 2
のカーネル ブロックに供給されます。このカーネルは、各呼び出しで合計 8
個のサンプルにアクセスする必要があります。最初のシミュレーション サイクルでは、入力データの最初の 6
個の値の前に 2 つの 0
が追加されます。その後のシミュレーション サイクルでは、カーネルは 6
個の新しい値と前のサイクルからの 2
個の値を含む 8
個の値を受信します。
ストリーム ベース アクセス
カーネルは、データ アクセス API を使用して、データ ストリームにサンプルごとにアクセスできます。ストリーム ベース アクセス モデルでは、カーネルはデータの入力ストリームまたは出力ストリームを引数として受信します。これらのストリームへの各アクセスは同期化されるので、ストリームにデータがない場合は読み出しがストールし、ストリームが新しいデータを受け入れることができない場合は書き込みがストールします。1 つの AI エンジン と物理的に隣接する AI エンジン の間には、カスケードと呼ばれる直接ストリーム接続があります。
次に、cint16
型の入力ストリームと出力ストリームを宣言する例を示します。
input_stream_cint16 * myInputStream;
output_stream_cint16 * myOutputStream;