データ アクセスのメカニズム で説明したように、バッファー ベース アクセスの入力および出力データ ブロックのサイズは、指定されたバッファー サイズによって異なります。Vitis Model Composer では、AI エンジン カーネル ブロックへのインターフェイスとして次のバッファー ベース入力および出力がサポートされます。
-
input_buffer<Type>
-
output_buffer<Type>
<Type> | 実数/複素数 | 符号の有無 |
---|---|---|
int8 | 実数 | 符号付き |
int16 | 実数 | 符号付き |
int32 | 実数 | 符号付き |
int64 | 実数 | 符号付き |
uint8 | 実数 | 符号なし |
uint16 | 実数 | 符号なし |
uint32 | 実数 | 符号なし |
uint64 | 実数 | 符号なし |
cint16 | 複素数 | 符号付き |
cint32 | 複素数 | 符号付き |
float | 実数 | N/A |
cfloat | 複素数 | N/A |
たとえば、バッファー ベースのインターフェイスを含む単純なカーネルをインポートする場合、次の simple.h ヘッダー ファイルに示すように、int16
型の 2 つの入力バッファーと 1 つの出力バッファーを含む add_kernel
関数を定義します。
Simple.h
#ifndef __ADD_KERNEL_H__
#define __ADD_KERNEL_H__
#include <adf.h>
#define NUM_SAMPLES 4
using namespace adf;
void add_kernel(input_buffer<int16> & in1,input_buffer<int16> & in2, output_buffer<int16> & outw);
#endif
このカーネル (simple.cc) は、次のように定義されます。in1
および in2
の sum
演算を処理し、outw
に出力を生成します。
#include "simple.h"
void add_kernel(input_window_int16 & in1,input_window_int16 & in2, output_window_int16 & outw)
{
// Use scalar iterator to traverse data
auto pIn1 = aie::begin(in1);
auto pIn2 = aie::begin(in2);
auto pOut = aie::begin(outw);
for (unsigned i=0; i<NUM_SAMPLES; i++) {
*pOut++ = *pIn1++ + *pIn2++;
}
}
- 各カーネルを個別のソース ファイルで定義します。
- カーネルのヘッダー ファイルとソース ファイル用の個別のディレクトリを作成します。
- 個別にコンパイルできるように、カーネル ソース ファイルに関連のヘッダー ファイルをすべて含める必要があります。
add_kernel
関数をブロックとしてインポートするには、AIE Kernel ブロックをダブルクリックし、パラメーターを次のようにアップデートします。- Kernel header file
- kernels/include/simple.h
- Kernel function
-
add_kernel
- Kernel Init function
- 空のまま
- Kernel source file
- kernels/source/simple.cc
- Kernel search path
- 空のまま
- Preprocessor options
- 空のまま
Block Parameters ダイアログ ボックスで Import をクリックすると、ツールによりヘッダー ファイルの関数シグネチャが解析され、AI エンジン カーネルのインターフェイスが次の図に示すようにアップデートされます。
AIE Kernel ブロックを Simulink エディターに追加した後には、入力ポートと出力ポートは存在しません。Block Parameters ダイアログ ボックスでカーネル パラメーターを追加すると、ブロックが 2 つの入力ポートと 1 つの出力ポートでアップデートされ、インポートされたカーネル関数に一致するブロック名が付けられます。
正しくインポートされると、Function タブにユーザーが編集可能なパラメーターが表示されます。インポートされたカーネル関数の関数定義と、ポート名および方向をすばやく確認できます。
Function タブの Buffer size と Buffer margin に適切な値入力する必要があります。
バッファー マージン値の設定
データ アクセスのメカニズム で説明したように、バッファー マージンは入力データ サンプルのオーバーラップです。Model Composer では、Buffer margin 値はサンプル数で指定します。Buffer margin に入力する値は、32 バイトの倍数である必要があります。
たとえば、入力のデータ型が int16
(2 バイト) に場合、Vuffer margin の指定可能な最小値は 16 サンプル (16 × 2) で、ほかに 32、48、64 などの値を指定できます。
別の例として、入力のデータ型が cint32
(8 バイト: 実数部 4 バイト、仮想部 4 バイト) である場合、指定可能な最小バッファー マージンは 4 です。これは、4 × 8 バイトは 32 バイトだからです。ほかに 8、12、16 などの値を指定できます。
次の表に、各パラメーターの説明を示します。
パラメーター名 | 必要性 | 説明 |
---|---|---|
Buffer size | 必須 |
|
Buffer margin | 必須 |
|
Synchronicity | 必須 |
|
カーネル関数が正常にインポートされると、General タブ Import ボタンが Update に変わり、ブロック パラメーターをアップデートできるようになります。ブロックをインポートした後、再インポートせずにカーネル関数のソース コードを変更できます。ただし、関数シグネチャまたは関数へのパラメーターを変更した場合は、General タブの Update ボタンをクリックする必要があります。