在__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())时,同样适用。什么好主意吗?谢谢。

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

最新更新