0

__device__我在 CUDA 中有以下模板函数:

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

4

1 回答 1

0

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

于 2013-06-20T14:43:38.683 回答