テンプレート関数のスタティック変数は、テンプレート引数の異なる値に対してそれぞれ複製されます。
関数に異なる C++ テンプレート値を渡すと、各テンプレート値に固有のインスタンスが作成されます。Vitis HLS では、これらのコピーがそのコンテキスト内で個別に合成されます。これにより、各インスタンスに特定の最適化を適用し、関数のシンプルなインプリメンテーションを生成できるので、有益な場合があります。
template<int NC, int K>
void startK(int* dout) {
static int acc=0;
acc += K;
*dout = acc;
}
void foo(int* dout) {
startK<0,1> (dout);
}
void goo(int* dout) {
startK<1,1> (dout);
}
int main() {
int dout0,dout1;
for (int i=0;i<10;i++) {
foo(&dout0);
goo(&dout1);
cout <<"dout0/1 = "<<dout0<<" / "<<dout1<<endl;
}
return 0;
}
再帰関数でのテンプレートの使用
テンプレートは標準 C 合成ではサポートされない再帰関数をインプリメントするために使用することもできます。
次のコード例では、末尾再帰のフィボナッチ アルゴリズムをインプリメントするために、テンプレート化された struct
が使用されています。合成を実行するためには、再帰の最終呼び出しをインプリメントするのに終端クラスを使用する必要があります。この場合、テンプレート サイズは 1 が使用されます。
//Tail recursive call
template<data_t N> struct fibon_s {
template<typename T>
static T fibon_f(T a, T b) {
return fibon_s<N-1>::fibon_f(b, (a+b));
}
};
// Termination condition
template<> struct fibon_s<1> {
template<typename T>
static T fibon_f(T a, T b) {
return b;
}
};
void cpp_template(data_t a, data_t b, data_t &dout){
dout = fibon_s<FIB_N>::fibon_f(a,b);
}