使用模板创建专用实例 - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

针对模板实参的每个不同值将复制模板函数中的静态变量。

将不同 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);
}