ウィンドウ ベース カーネルのインポート - 2022.1 日本語

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

Document ID
UG1483
Release Date
2022-05-26
Version
2022.1 日本語
データ アクセスのメカニズム で説明したように、ウィンドウ ベース アクセスの入力および出力データ ブロックのサイズは、指定されたウィンドウ サイズによって異なります。Vitis Model Composer では、AI エンジン カーネル ブロックへのインターフェイスとして次のウィンドウ ベース入力および出力がサポートされます。
  • input_window_<Type>
  • output_window_<Type>
<Type> 実数/複素数 符号の有無
int8 実数 符号付き
int16 実数 符号付き
int32 実数 符号付き
int64 実数 符号付き
uint8 実数 符号なし
uint16 実数 符号なし
uint32 実数 符号なし
uint64 実数 符号なし
cint16 複素数 符号付き
cint32 複素数 符号付き
float 実数 なし
cfloat 複素数 なし

たとえば、ウィンドウ ベースのインターフェイスを含む単純なカーネルをインポートする場合、次の simple.h ヘッダー ファイルに示すように、int16 型の 2 つの入力ウィンドウと 1 つの出力ウィンドウを含む add_kernel 関数を定義します。

Simple.h

#ifndef __ADD_KERNEL_H__
#define __ADD_KERNEL_H__
 
#include <adf.h>
#define NUM_SAMPLES 4
void add_kernel(input_window_int16 * in1,input_window_int16 * in2, output_window_int16 * outw);
 
#endif

このカーネル (simple.cc) は、次のように定義されます。in1 および in2sum 演算を処理し、outw に出力を生成します。

#include "simple.h"
void add_kernel(input_window_int16 * in1,input_window_int16 * in2, output_window_int16 * outw)
{
    int16 temp1,temp2,temp_out;
    for (unsigned i=0; i<NUM_SAMPLES; i++) {
        window_readincr(in1,temp1);
        window_readincr(in2,temp2);
        temp_out = temp1 + temp2;
        window_writeincr(outw,temp_out);
    }
}
ヒント: 必須ではありませんが、再利用性とコンパイルの高速化のため、次をお勧めします。
  • 各カーネルを個別のソース ファイルで定義します。
  • カーネルのヘッダー ファイルとソース ファイル用の個別のディレクトリを作成します。
  • 個別にコンパイルできるように、カーネル ソース ファイルに関連のヘッダー ファイルをすべて含める必要があります。
Model Composer デザインに 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 エンジン カーネルのインターフェイスが次の図に示すようにアップデートされます。

図 1. アップデート後の AIE Kernel ブロック

AIE Kernel ブロックを Simulink エディターに追加した後には、入力ポートと出力ポートは存在しません。Block Parameters ダイアログ ボックスでカーネル パラメーターを追加すると、ブロックが 2 つの入力ポートと 1 つの出力ポートでアップデートされ、インポートされたカーネル関数に一致するブロック名が付けられます。

正しくインポートされると、Function タブにユーザーが編集可能なパラメーターが表示されます。インポートされたカーネル関数の関数定義と、ポート名および方向をすばやく確認できます。

図 2. Function タブ

Function タブの Window sizeWindow margin に適切な値入力する必要があります。

ウィンドウ マージン値の設定

データ アクセスのメカニズム で説明したように、ウィンドウ マージンは入力データ サンプルのオーバーラップです。Model Composer では、Window margin 値はサンプル数で指定します。Window margin に入力する値は、32 バイトの倍数である必要があります。

たとえば、入力のデータ型が int16 (2 バイト) に場合、Window margin の指定可能な最小値は 16 サンプル (16 × 2) で、ほかに 32、48、64 などの値を指定できます。

別の例として、入力のデータ型が cint32 (8 バイト: 実数部 4 バイト、仮想部 4 バイト) である場合、指定可能な最小ウィンドウ マージンは 4 です。これは、4 × 8 バイトは 32 バイトだからです。ほかに 8、12、16 などの値を指定できます。

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

表 1. ウィンドウ ポートのパラメーター
パラメーター名 必要性 説明
Window size 必須
  • カーネル関数の各ポート (引数) に必要です。
  • 値はサンプル (要素) 数を示します。
  • 正の整数を指定する必要があります。
  • 16 バイトの倍数値を指定する必要があります。
Window margin 必須
  • カーネル関数の各入力ポート (引数) に必要です。
  • 値はサンプル (要素) 数を示します。
  • 負以外の整数を指定する必要があります。
  • 32 バイトの倍数値を指定する必要があります。
Synchronicity 必須
  • 指定可能な値は sync および async です。
  • デフォルトでは sync に設定されています。async を指定することもできます。

カーネル関数が正常にインポートされると、General タブ Import ボタンが Update に変わり、ブロック パラメーターをアップデートできるようになります。ブロックをインポートした後、再インポートせずにカーネル関数のソース コードを変更できます。ただし、関数シグネチャまたは関数へのパラメーターを変更した場合は、General タブの Update ボタンをクリックする必要があります。

図 3. General タブ