为什么atomicAdd()
双打没有明确地作为 CUDA 4.0 或更高版本的一部分实现?
在CUDA 编程指南 4.1的附录 F 第 97 页中,已经实现了 atomicAdd 的以下版本。
int atomicAdd(int* address, int val);
unsigned int atomicAdd(unsigned int* address,
unsigned int val);
unsigned long long int atomicAdd(unsigned long long int* address,
unsigned long long int val);
float atomicAdd(float* address, float val)
同一页面继续给出了一个用于双打的 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 = old;
old = atomicCAS(address_as_ull, assumed,
__double_as_longlong(val +
__longlong_as_double(assumed)));
} while (assumed != old);
return __longlong_as_double(old);
}
为什么不将上述代码定义为 CUDA 的一部分?