我有一个模板化的包装函数,它调用像这样的.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);
那么,是否有必要专门化每个模板化函数,以使其可以从主机调用? (这是一个很大的缺点)
感谢您的意见!