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()。有任何想法吗?谢谢。
听起来像你正试图用错误的编译器编译专业化。你真的使用nvcc,并且正在编译的文件是否具有.cu扩展名? – talonmies 2013-04-09 10:33:45
第一个未特例和第二个特例都存在于同一个文件中。在我写第二个例子后,我刚刚评论了第一个例子。这似乎是专业化的一个具体问题。 – mjm26 2013-04-09 16:57:42
问题是我可以把你发布的代码放在一个带有内核的文件中,用nvcc进行编译并且没有错误。所以有一些不同,你忽略告诉我们.. – talonmies 2013-04-09 18:23:23