データ アクセスのメカニズム で説明したように、ストリーム ベースのカーネルは、データ ストリームにサンプルごとにアクセスします。Vitis Model Composer では、AIE Kernel ブロックへのインターフェイスとして次のストリーム ベース入力および出力がサポートされます。
-
input_stream_<TYPE>
-
output_window_<TYPE>
<Type> | 実数/複素数 | 符号の有無 |
---|---|---|
int8 | 実数 | 符号付き |
int16 | 実数 | 符号付き |
int32 | 実数 | 符号付き |
int64 | 実数 | 符号付き |
uint8 | 実数 | 符号なし |
uint16 | 実数 | 符号なし |
uint32 | 実数 | 符号なし |
uint64 | 実数 | 符号なし |
cint16 | 複素数 | 符号付き |
cint32 | 複素数 | 符号付き |
float | 実数 | なし |
cfloat | 複素数 | なし |
accfloat | 実数 | なし |
caccfloat | 複素数 | なし |
たとえば、ストリーム ベースのインターフェイスを含む単純なカーネルをインポートする場合、次の simple.h ヘッダー ファイルに示すように、1 つの入力ストリームと 1 つの出力ストリームを含む simple_comp
関数を定義します。
#ifndef __COMPLEX_KERNEL_H__
#define __COMPLEX_KERNEL_H__
#include <adf.h>
void simple_comp(input_stream_cint16 * in, output_stream_cint16 * out);
#endif //__COMPLEX_KERNEL_H__
この関数は simple.cc で定義します。
#include "simple.h"
void simple_comp(input_stream_cint16 * in, output_stream_cint16 * out) {
cint16 c1, c2;
for (unsigned i=0; i<NUM_SAMPLES; i++) {
c1 = readincr(in);
c2.real = c1.real+c1.imag;
c2.imag = c1.real-c1.imag;
writeincr(out, c2);
}
}
ウィンドウ ベースとストリーム ベースのカーネルの関数引数は異なりますが、ストリーム ベースのカーネルをインポートする手順も同じです。
インポートすると、Function タブが表示されます。次の図に示すように、関数定義とポートをすばやく確認できます。
次の表に、各パラメーターの説明を示します。
パラメーター名 | 説明 |
---|---|
Signal size | 出力信号のサイズを示します。カーネルの起動時に生成されるサンプルの最大数以上の値に設定する必要があります。 |
General タブの Import ボタンが Update に変わり、ブロック パラメーターをアップデートできるようになります。
Model Composer では、2 つの AI エンジン プロセッサ間のカスケード ストリーム接続もサポートされます。
AI エンジン カーネルでは、入力ストリーム接続を次のように使用できます。
-
Input_stream_acc48
-
Input_stream_cacc48
同様に、出力ストリーム接続は次のように使用できます。
-
output_stream_acc48
-
output_stream_cacc48
Model Composer では、カスケード ストリーム ポートは、複素数または実数の 48 ビット固定小数点信号 (x_sfix48
) として表されます。
1 つのカーネルのカスケード出力ストリームが別のカーネルのカスケード入力ストリームに接続されてる次の例を考えます。
#ifndef __CASCADE_KERNELS_H__
#define __CASCADE_KERNELS_H__
void f_osacc48(input_window_int32 *i_hi,
input_window_int16 *i_lo,
output_stream_acc48 *o1);
#endif
f_osacc48
には、2 つの入力ウィンドウ i_hi
および i_lo
と、1 つのカスケード ストリーム出力 o1
があります。このカーネル関数をインポートすると、AIE Kernel ブロックは次の図のように表示されます。
次に、1 つのカスケード ストリーム入力 i1
と 2 つの出力ウィンドウ o_hi
および o_lo
を持つ別のカーネル関数 f_isacc48
を考えます。
#ifndef __CASCADE_KERNELS_H__
#define __CASCADE_KERNELS_H__
void f_isacc48(input_stream_acc48 *i1,
output_window_int32 *o_hi,
output_window_int16 *o_lo);
#endif
2 番目のカーネル関数をインポートすると、AIE Kernel ブロックは次の図のように表示されます。
ブロック f_osacc48
のカスケード ストリーム出力とブロック f_isaccc48
のカスケード ストリーム入力を接続すると、この 2 つのカーネルをカスケード接続できます。これを次の図に示します。