在_设备_函数模板的专用实例化中访问CUDA库函数

在_设备_函数模板的专用实例化中访问CUDA库函数,cuda,template-specialization,Cuda,Template Specialization,我在CUDA中有以下模板\uuuuuuu设备\uuuuuu功能: template<typename T> __device__ void MyatomicAdd(T *address, T val){ atomicAdd(address , val); } 现在,编译器抱怨我的专用化中未定义atomicAdd(),当我尝试在专用化中使用任何CUDA函数(如u syncthreads())时,情况也是如此。有什么想法吗?谢谢。这最终导致了与同事开发的某些OpenGL代码的链接问题。

我在CUDA中有以下模板
\uuuuuuu设备\uuuuuu
功能:

template<typename T>
__device__ void MyatomicAdd(T *address, T val){
atomicAdd(address , val);
}

现在,编译器抱怨我的专用化中未定义atomicAdd(),当我尝试在专用化中使用任何CUDA函数(如u syncthreads())时,情况也是如此。有什么想法吗?谢谢。

这最终导致了与同事开发的某些OpenGL代码的链接问题。强制内联专门化解决了这个问题,尽管显然不是根本原因。不过,在我可以费心去挖掘另一个人的代码之前,它暂时还可以。

听起来你试图用错误的编译器编译专业化。您真的在使用nvcc吗?正在编译的文件是否有.cu扩展名?第一个非专用示例和第二个专用示例都存在于同一个文件中。在我写了第二个示例之后,我刚刚注释掉了第一个示例。这似乎是专门化的一个具体问题。问题是我可以把你发布的代码,粘贴到一个内核文件中,用nvcc编译,并且没有错误。所以有些不同的东西你忽略了告诉我们..我会试着把它放在不同的文件中。在同一个cu文件中有一些其他内核和设备函数,因此可能在某个地方存在一些干扰。它确实使用另一个内核在不同的cu文件中编译,搜索继续。。
__global__ void myKernel(float *a, float b){
MyatomicAdd<float>(a,b);
}
template<typename T>
__device__ void MyatomicAdd(T *address, T val){
};


template<>
__device__ void MyatomicAdd<float>(float *address, float val){
atomicAdd(address , val);
}