我在CUDA中有以下模板__device__
功能:
template<typename T>
__device__ void MyatomicAdd(T *address, T val){
atomicAdd(address , val);
}
如果用T作为浮点数实例化,那么编译并运行就好了,即
__global__ void myKernel(float *a, float b){
MyatomicAdd<float>(a,b);
}
将毫无问题地运行。
我想专门化这个函数,因为双精度没有atomicAdd()
,所以我可以用双精度手工编写一个实现代码。暂时忽略双精度专业化,单精度专业化和模板如下所示:
template<typename T>
__device__ void MyatomicAdd(T *address, T val){
};
template<>
__device__ void MyatomicAdd<float>(float *address, float val){
atomicAdd(address , val);
}
现在编译器抱怨我的专业化中未定义atomicAdd(),当我尝试在专门化中使用__syncthreads()之类的任何CUDA函数时,同样适用。有任何想法吗?感谢。
答案 0 :(得分:0)
它最终成为同事开发的一些OpenGL代码的链接问题。强制专业化内联修复问题,虽然显然不是根本原因。不过,它现在还可以,直到我可能会被另一个人的代码所困扰。