ロードおよびストア
ベクター レジスタからのロードおよびストア
コンパイラでは、ベクターの標準的なポインター逆参照およびポインター演算がサポートされています。ポインターのポスト インクリメントは、スケジューリングに最も効率的です。ベクター レジスタをロードするのに、特別な組み込み関数は必要ありません。
v8int32 * ptr_coeff_buffer = (v8int32 *)ptr_kernel_coeff;
v8int32 kernel_vec0 = *ptr_coeff_buffer++; // 1st 8 values (0 .. 7)
v8int32 kernel_vec1 = *ptr_coeff_buffer; // 2nd 8 values (8 .. 15)
メモリからのロードおよびストア
AI エンジン API を使用すると、AI エンジン カーネルで使用可能なデータ メモリ、ストリーミング データ ポート、およびカスケード ストリーミング ポートからデータを読み書きできます。ウィンドウおよびストリーム API の詳細は、『Vitis 統合ソフトウェア プラットフォームの資料』 (UG1416) の AI エンジン フローのウィンドウおよびストリーミング データ API を参照してください。次の例では、ウィンドウ readincr (window_readincr_v8(din)) API を使用して、複素 int16 データをデータ ベクターに読み出します。同様に、cin ストリームから int16 データのサンプルを読み出すには、readincr_v8(cin) を使用します。カスケード ストリーム出力にデータを書き込むには、writeincr_v4 (cas_out, v) を使用します。
void func(input_window_cint16 *din,
input_stream_int16 *cin,
output_stream_cacc48 *cas_out){
v8cint16 data=window_readincr_v8(din);
v8int16 coef=readincr_v8(cin);
v4cacc48 v;
…
writeincr_v4(cas_out, v);
}
ポインターを使用したロードおよびストア
カーネル関数プロトタイプでは、入力および出力としてウィンドウ API を使用する必要があります。カーネル コードでは、データの読み出し/書き込みに直接ポインター参照を使用できます。
void func(input_window_int16 *w_input,
output_window_cint16 *w_output){
.....
v16int16 *ptr_in = (v16int16 *)w_input->ptr;
v8cint16 *ptr_out = (v8cint16 *)w_output->ptr;
......
}
ウィンドウ構造によりバッファー ロック トラッキング バッファー タイプ (ping/pong) が管理され、これがサイクル数が増加する可能性があります。これは特に、ロード/ストアが順不同 (スキャッター ギャザー) の場合に言えます。ポインターを使用すると、ロードとストアに必要なサイクル数を削減できる可能性があります。
ストリームを使用したロードおよびストア
次の例に示すように、ベクター データは、ストリームからロードまたはストリームにストアできます。
void func(input_stream_int32 *s0, input_stream_int32 *s1, …){
for(…){
data0=readincr(s0);
data1=readincr(s1);
…
}
}
ウィンドウおよびストリーミング データ API の使用法の詳細は、『Vitis 統合ソフトウェア プラットフォームの資料』 (UG1416) の AI エンジン フローのウィンドウおよびストリーミング データ API を参照してください。