在__device__函数模板的专用实例中访问CUDA库函数

时间:2013-04-09 10:03:41

标签: cuda template-specialization

我在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函数时,同样适用。有任何想法吗?感谢。

1 个答案:

答案 0 :(得分:0)

它最终成为同事开发的一些OpenGL代码的链接问题。强制专业化内联修复问题,虽然显然不是根本原因。不过,它现在还可以,直到我可能会被另一个人的代码所困扰。