2013-04-09 95 views
0

我有以下模板__device__功能CUDA:访问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()是我的专业化不确定的,这同样适用,当我尝试使用任何CUDA功能如专业化中的__syncthreads()。有任何想法吗?谢谢。

+1

听起来像你正试图用错误的编译器编译专业化。你真的使用nvcc,并且正在编译的文件是否具有.cu扩展名? – talonmies 2013-04-09 10:33:45

+0

第一个未特例和第二个特例都存在于同一个文件中。在我写第二个例子后,我刚刚评论了第一个例子。这似乎是专业化的一个具体问题。 – mjm26 2013-04-09 16:57:42

+0

问题是我可以把你发布的代码放在一个带有内核的文件中,用nvcc进行编译并且没有错误。所以有一些不同,你忽略告诉我们.. – talonmies 2013-04-09 18:23:23

回答

0

它最终成为与同事开发的一些OpenGL代码的链接问题。迫使专业化内联解决问题,但显然不是根本原因。不过,现在它会做,直到我可以被困扰挖掘其他人的代码。