CUDA 中的 64 位 atomicAdd

64bit atomicAdd in CUDA

我在 CUDA 7 下使用 atomicAdd 时遇到问题。atomicAdd 是为“int”、“unsigned int”和“unsigned long long int”定义的说明它使用 "the 32 or 64 bit value".

在我们的代码中,为了安全起见,我们使用 uint32_tuint64_t。然而 gcc 是这样定义的:

#if __WORDSIZE == 64
typedef unsigned long int   uint64_t;
#else
__extension__
typedef unsigned long long int  uint64_t;
#endif

因此,当我将 uint64_t 传递给 atomicAdd 时,它会抱怨,因为它没有为“unsigned long int”定义。

是否可以按照编程指南中的说明为 CUDA 编译假设 uint64_t == long long int

回答这个问题以备将来参考:

有 2 个选项:要么使用 typedef 来定义 64 位 cuda 类型,例如:

typedef long long int int64_cu
typedef unsigned long long int uint64_cu

并且可能通过 (boost-)static_asserts 来保护它们与 (of)

的大小相同

或者按照@Anastasiya Asadullayeva 的建议,在通话中使用 reinterpret_cast,最好也由 static_assert 保护。