ロードおよびストア

ベクター レジスタからのロードおよびストア

コンパイラでは、ベクターの標準的なポインター逆参照およびポインター演算がサポートされています。ポインターのポスト インクリメントは、スケジューリングに最も効率的です。ベクター レジスタをロードするのに、特別な組み込み関数は必要ありません。

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 を参照してください。