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 voIDcompute<int,Method1<int> >(int* input,int* output,int n);template voIDcompute<float,Method1<float> >(float* input,float* output,int n);template voIDcompute<int,Method2<int> >(int* input,Method2<float> >(float* input,int n);
那么,是否有必要专门化每个模板化函数,以使其可以从主机调用? (这是一个很大的缺点)
感谢您的意见!
解决方法 这是一个 C++ FAQ,不仅限于CUDA.如果您在.cpp或.cu文件中有模板实现,那么当您编译该转换单元时,编译器可能无法知道您将需要哪些模板参数的排列.因此,当您链接时,您将收到错误.
您可以将实现放在头文件中(在这种情况下,您需要在.cu文件中实例化,因为它包含CUDA),或者您必须显式实例化所有必需的排列.如果您必须执行其中的许多 *** 作,那么您可以使用宏来实例化所有排列.
总结以上是内存溢出为你收集整理的c – CUDA和模板:需要专业化声明吗?全部内容,希望文章能够帮你解决c – CUDA和模板:需要专业化声明吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)