データ型の関数テンプレート - 2022.1 日本語

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

Document ID
UG1483
Release Date
2022-05-26
Version
2022.1 日本語

データ型の関数テンプレートは、汎用データ型を使用可能な関数です。関数テンプレートを使用すると、複数のデータ型をサポートするライブラリ関数を作成でき、各データ型をサポートするために Model Composer HLS ブロック ライブラリでコードまたはブロックを複製する必要はありません。Model Composer の xmcImportFunction コマンドを使用して、ブロックでサポートされるどのデータ型の信号にでも接続可能な汎用ライブラリ ブロックを作成します。

データ型 (typename) テンプレート パラメーターは、コードおよびシミュレーション ラッパーが生成されるシミュレーション実行時間に解決されます。パラメーターはシミュレーション中にライブラリ ブロックに接続されている信号で指定された実際のデータ型に置き換えられます。置き換えられるデータ型は、データ型の使用 に説明されている Model Composer でサポートされるデータ型である必要があります。

複数のデータ型をサポートするブロックをインポートするには、関数テンプレートを使用します。次に例を示します。
template <typename T>
T max(T x, T y) {
   return (x > y) ? x : y;
}
または、complex 関数引数を使用した関数の場合、この例は次のようになります。
#include <complex>
template <typename T>
void mult_by_two(std::complex< T > x, std::complex< T > *y)
{
   *Out = In1 * 2;
}
データ型は Model Composer によりシミュレーション中に決定されます。typename (または class) パラメーターはブロックの入力信号から伝搬されるか、シミュレーション前にユーザーが定義する必要のあるカスタマイズ パラメーターです。
重要: 関数またはクラスのデータ型は、出力から伝搬させることはできません。

次の例では、関数テンプレートでパラメーター T をカスタマイズ パラメーターとして定義しています。入力引数 x または y に関連付けられていないので、ブロックをモデルに追加したときにユーザーが値を指定する必要があります。

template <typename T>
T min(int x, int y) {
   return (x < y) ? x : y;
}

生成された Library Function ブロックの [Block Parameters] ダイアログ ボックスには、次の図に示すように、テンプレート引数を入力する編集フィールドがあります。

図 1. Library Function の [Block Parameters] ダイアログ ボックス

テンプレート構文では、関数またはクラスのデータ型テンプレート パラメーターをほかのテンプレート パラメーターで指定できます。指定順序は重要ではありません。次に例を示します。

template <typename T1, int ROWS, int COLS, int W, int I>
T1 func(T1 x[ROW][COLS], ap_fixed<W, I> &y) {
...
}
重要: 上記の例では、T1 テンプレート パラメーターが関数の戻り値および入力 x のデータ型の両方を指定するのに使用されています。この場合、これは 1 つのテンプレート パラメーターなので、両方の引数が同じデータ型になり、入力信号からブロックに伝搬されます。

SUPPORTED_TYPES/UNSUPPORTED_TYPES プラグマ

データ型 (typename) テンプレート パラメーター (または class) を定義する際、関数シグネチャの一部として SUPPORTED_TYPES または UNSUPPORTED_TYPES プラグマを使用して変数でサポートされるデータ型を定義できます。これを次のコード例に示します。
#pragma XMC INPORT x
#pragma XMC INPORT y
#pragma XMC SUPPORTED_TYPES T: int8, int16, int32, double, single, half
template <class T>
T max(T x, T y) {
   return (x > y) ? x : y;
}

#pragma XMC UNSUPPORTED_TYPES T: boolean
#pragma XMC INPORT x, y
template <typename T>
T min(T x, T y) {
   return (x < y) ? x : y;
}
Model Composer では、データ型の使用 に示すデータ型がサポートされます。テンプレート パラメーターでサポートされるデータ型を指定するには、サポートされるデータ型またはサポートされないデータ型をリストします。SUPPORTED_TYPESUNSUPPORTED_TYPES プラグマは、同じものを反対の方法で指定します。
  • SUPPORTED_TYPES: テンプレート パラメーター名 (param) を指定し、そのパラメーターでサポートされるデータ型をリストします。リストされていないデータ型はサポートされません。
    #pragma XMC SUPPORTED_TYPES param: type1, type2, ...
  • UNSUPPORTED_TYPES: テンプレート パラメーター名 (param) を指定し、そのパラメーターでサポートされないデータ型をリストします。リストされていないデータ型すべてがサポートされます。
    #pragma XMC UNSUPPORTED_TYPES param: type1, type2, ...

SUPPORTED_TYPES または UNSUPPORTED_TYPES プラグマの指定に基づいて、Model Composer でブロックに接続されている入力信号のデータ型がサポートされているかどうかが確認されます。これらのプラグマを使用しない場合、データ型テンプレート パラメーターで Model Composer でサポートされるデータ型がすべてサポートされます。

関数テンプレートの特殊化およびオーバーロード

xmcImportFunction コマンドでは、関数テンプレートの特殊化がサポートされています。Model Composer では、複数のデータ型をサポートする汎用関数テンプレートのライブラリ ブロックが作成されますが、一致するデータ型の入力信号に接続されたときに使用される特殊化関数も含まれます。汎用関数と特殊化関数の両方がブロック DLL にコンパイルされます。次に例を示します。

template <typename T>
T min(T x, T y) {
   return (x < y) ? x : y;
}

template <>
bool min<bool>(bool x, bool y) {
...
}

この例では、ブロックがブール信号に接続されたときに、Model Composer で min 関数の特殊化されたブール式が呼び出されます。

Model Composer では、入力/出力引数の数が同じ関数のオーバーロードもサポートされます。たとえば、次の例では関数の 2 つの形式を定義しています。
int func(int x);
float func(float x);
次のように関数テンプレートをオーバーロードさせることもできます。
template <typename T> 
int func(int x, T y);

template <typename T> 
float func(float x, T y);
ヒント: 入力/出力引数の数または引数の次元が異なる関数のオーバーロードはサポートされておらず、別の関数として定義する必要があります。