カーネルは、データフロー グラフ仕様の基本的な構築ブロックとなる演算関数です。カーネルは void
を返す通常の C/C++ 関数として宣言され、引数として特殊なデータ型を使用できます。各カーネルは、個別のソース ファイルで定義する必要があります。これが、再利用のしやすさとコンパイルの高速化のため推奨されます。また、個別にコンパイルできるように、カーネル ソース ファイルに関連のヘッダー ファイルをすべて含める必要があります。
注記:
AI エンジン カーネルで AI エンジン API を使用するには、カーネル ソース コードに次のファイルを含めます。
-
#include "aie_api/aie.hpp"
-
#include "aie_api/aie_adf.hpp"
ヘッダー ファイル (この資料では kernels.h
) では、グラフ内で使用されるすべてのカーネルの関数プロトタイプを宣言することを推奨します。次に例を示します。
#ifndef FUNCTION_KERNELS_H
#define FUNCTION_KERNELS_H
void simple(input_buffer<int16> & __restrict in,
output_buffer<int16> & __restrict out);
#endif
この例には、インクルード ファイルが確実に一度だけ含まれるように (C/C++ の推奨事項)、#ifndef
と #endif
があります。
kernels.cc ファイルは、simple 関数のインプリメンテーション ファイルです。カーネル インプリメンテーションでは、data()
メンバー関数を使用して入力バッファーと出力バッファーの基準値をそれぞれ指す 2 つの int
16 変数 (in_t
および out_t
) が使用されます。
/* A simple kernel */
#include <adf.h>
#include "kernels.h"
void simple(input_buffer<int16> & __restrict in,
output_buffer<int16> & __restrict out)
{
int16* __restrict in_t = in.data();
int16* __restrict out_t = out.data();
for (unsigned i=0; i<NUM_SAMPLES; i++) {
*out_t++ = 1 + *in_t++;
}
}