ストリーム ベースのカーネルのインポート - 2021.2 日本語

Vitis Model Composer ユーザー ガイド (UG1483)

Document ID
UG1483
Release Date
2021-10-22
Version
2021.2 日本語
データ アクセスのメカニズム で説明したように、ストリーム ベースのカーネルは、データ ストリームにサンプルごとにアクセスします。Model Composer では、AI エンジン カーネル ブロックへのインターフェイスとして次のストリーム ベース入力および出力がサポートされます。
  • 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);
}
}
注記: readincr() および writeincr() API の詳細は、 『Versal ACAP AI エンジン プログラム環境ユーザー ガイド』 (UG1076) を参照してください。

ウィンドウ ベースとストリーム ベースのカーネルの関数引数は異なりますが、ストリーム ベースのカーネルをインポートする手順も同じです。

インポートすると、[Function] タブが表示されます。次の図に示すように、関数定義とポートをすばやく確認できます。

図 1. [Function] タブ

次の表に、各パラメーターの説明を示します。

表 1. ストリーム ポートのパラメーター
パラメーター名 説明
[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 があります。
注記: このカーネル関数には、ウィンドウ ベースのポートとストリーム ベースのポートの両方が含まれています。

このカーネル関数をインポートすると、AI エンジン カーネル ブロックは次の図のように表示されます。

図 2. インポート後の AI エンジン カーネル

次に、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 番目のカーネル関数をインポートすると、AI エンジン カーネル ブロックは次の図のように表示されます。

図 3. AI エンジン カーネル (2 番目のカーネル関数)

ブロック f_osacc48 のカスケード ストリーム出力とブロック f_isaccc48 のカスケード ストリーム入力を接続すると、この 2 つのカーネルをカスケード接続できます。これを次の図に示します。

図 4. 接続されたカーネル (カスケード接続)