在以前的CUDA版本中,atomicAdd没有实现双精度,所以通常在这里实现这一点.使用新的CUDA 8 RC,当我尝试编译包含这样一个函数的代码时,我遇到了麻烦.我想这是因为使用Pascal和Compute Capability 6.0,添加了原生双重版本的atomicAdd,但不知何故,以前的Compute Capabilities没有正确忽略.
下面的代码用于编译和运行以前的CUDA版本,但现在我得到此编译错误:
test.cu(3): error: function "atomicAdd(double *, double)" has already been defined
Run Code Online (Sandbox Code Playgroud)
但是,如果我删除我的实现,我会得到此错误:
test.cu(33): error: no instance of overloaded function "atomicAdd" matches the argument list
argument types are: (double *, double)
Run Code Online (Sandbox Code Playgroud)
我应该补充一点,如果我编译-arch=sm_35
或类似,我只会看到这个.如果我编译-arch=sm_60
我获得预期的行为,即只有第一个错误,并在第二种情况下成功编译.
编辑:此外,它是特定的atomicAdd
- 如果我更改名称,它运作良好.
它看起来像编译器错误.其他人可以确认是这种情况吗?
示例代码:
__device__ double atomicAdd(double* address, double val)
{
unsigned long long int* address_as_ull = (unsigned long long int*)address;
unsigned long long int old = *address_as_ull, assumed;
do {
assumed = …
Run Code Online (Sandbox Code Playgroud)