異なるデータ型に使用可能な汎用関数が必要な場合があります。テンプレートを使用すると、データ型をパラメーターとして渡すことが可能です。Vitis Model Composer では、関数テンプレートを含む AI エンジン カーネルのインポートがサポートされています。これには、先ほどと同じ AIE Kernel ブロックを使用して、通常の C++ 関数をインポートします。
テンプレートを含むカーネル関数をインポートする例として、関数テンプレートの宣言を含む次のようなヘッダー ファイル kernel.h があるとします。このテンプレートには、typename テンプレート パラメーター T と非タイプ (整数) テンプレート パラメーター N が含まれています。
kernel.h
#ifndef _AIE_TEMP_KERNELS_H_
#define _AIE_TEMP_KERNELS_H_
#include <adf.h>
using namespace adf;
template<typename T, int N>
void myFunc(input_buffer<T> *i1,
output_buffer<T> *o1
);
#endif // ifndef _AIE_TEMP_KERNELS_H
関数テンプレートの定義は、次に示すように、ソース ファイル kernel.cpp に含まれます。
kernel.cpp
#include "kernel.h"
template<typename T, int N>
void myFunc(input_buffer<T> *i1, output_buffer<T> *o1)
{
auto pIn = aie::begin(i1);
auto pOut = aie::begin(o1);
for(int i = 0; i < 8; i++)
{
*pOut++ *= *pIn++;
}
}
カーネル出力計算での非タイプ テンプレート パラメーター N が使用されています。テンプレート関数をブロックとして Model Composer にインポートするには、AIE Kernel ブロックをダブルクリックし、パラメーターを次のようにアップデートします。
- Kernel header file
- kernel.h
- Kernel function
-
myFunc
- Kernel Init function
- 空のまま
- Kernel source file
- kernel.cpp
- Kernel search path
- 空のまま
- Preprocessor options
- 空のまま
Block Parameters ダイアログ ボックスで Import ボタンをクリックすると、Function タブが表示されます。Function Template Parameters セクションに、次の図に示すように、テンプレート タイプ パラメーター T の値とテンプレート非タイプ パラメーターの整数値を入力します。該当する編集可能なフィールドをダブルクリックし、値を入力します。また、Function declaration セクションでテンプレート関数の宣言を確認できます。
サポートされるタイプ テンプレート パラメーターは、次のとおりです。
- int8、int16、int32、int64
- uint8、uint16、uint32、uint64
- float、double
- cint16、cint32、cfloat
Function タブの Port attributes セクションまでスクロールダウンし、次の図に示すように、設定パラメーターを入力します。
[Function] タブで適切な値を入力したら、Apply をクリックします。AIE Kernel ブロックは次の図に示すようになります。