为什么没有为双打实现atomicAdd?

时间:2012-09-27 16:37:09

标签: cuda

为什么没有atomicAdd()双打{}被明确地作为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的一部分?

1 个答案:

答案 0 :(得分:36)

编辑:从CUDA 8开始,在CUDA中实现了双精度atomicAdd(),并在SM_6X(Pascal)GPU中提供硬件支持。

目前,没有CUDA设备支持atomicAdd硬件中的double正如您所指出的,它可以在64位atomicCAS上实现整数,但有一个非平凡的性能成本。

因此,CUDA软件团队选择将正确的实现记录为开发人员的选项,而不是将其作为CUDA标准库的一部分。这样开发人员就不会在不知情的情况下选择他们不理解的性能成本。

除此之外:我不认为这个问题应该被视为“没有建设性”。我认为这是一个非常有效的问题,+ 1。