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