加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – CUDA和模板:需要专业化声明吗?

发布时间:2020-12-16 06:57:36 所属栏目:百科 来源:网络整理
导读:我有一个模板化的包装函数,它调用像这样的.cu文件中定义的内核(__global__) templatetypename T,class M __global__ void compute_kernel(T* input,T* output,n) { M m; // compute stuff using m};templatetypename T,class M void compute(T* input,int n)
我有一个模板化的包装函数,它调用像这样的.cu文件中定义的内核(__global__)

template<typename T,class M> 
__global__ void compute_kernel(T* input,T* output,n) {
    M m;
    // compute stuff using m
};

template<typename T,class M> 
void compute(T* input,int n) {
    // ... compute blocks,threads,etc.
    compute_kernel<T,M> <<<dim_grid,dim_block>>>(input,output,n);
    // ...
};

和一个头文件,包含在只有声明的主机代码中

template<typename T,int n);

但是,使用任意模板参数从主机调用compute(),编译失败,未定义引用’void reduce(…)’,并且只有在.cu文件的末尾添加特化声明才能编译代码:

template void
compute<int,Method1<int> >(int* input,int* output,int n);

template void
compute<float,Method1<float> >(float* input,float* output,int n);

template void
compute<int,Method2<int> >(int* input,Method2<float> >(float* input,int n);

那么,是否有必要专门化每个模板化函数,以使其可以从主机调用? (这是一个很大的缺点)

感谢您的意见!

解决方法

这是一个 C++ FAQ,不仅限于CUDA.

如果您在.cpp或.cu文件中有模板实现,那么当您编译该转换单元时,编译器可能无法知道您将需要哪些模板参数的排列.因此,当您链接时,您将收到错误.

您可以将实现放在头文件中(在这种情况下,您需要在.cu文件中实例化,因为它包含CUDA),或者您必须显式实例化所有必需的排列.如果您必须执行其中的许多操作,那么您可以使用宏来实例化所有排列.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读