【发布时间】:2012-09-27 16:37:08
【问题描述】:
为什么没有将 atomicAdd() for doubles 明确实现为 CUDA 4.0 或更高版本的一部分?
来自CUDA programming guide 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 的一部分?
【问题讨论】:
-
可能是因为它的每个用户都知道它的实现,因为它不是内置指令并且重试逻辑可能会受到活锁的影响(因为不能保证公平,线程只要有其他线程更新同一个变量,就会停止)。
标签: cuda