为什么hasnt atomicAdd()
作为CUDA 4.0或更高版本的一部分明确实施了双打?为什么atomicAdd未实现双打?
从的附录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的一部分?
可能致使其每个用户知道它的实现,因为它不是一个内置的指令和重试逻辑可以承受活锁(因为没有公平的保证,一个线程可以得到停滞不前的只要有其他线程更新相同的变量)。 – tera