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_t
和 uint64_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 保护。
我在 CUDA 7 下使用 atomicAdd
时遇到问题。atomicAdd
是为“int
”、“unsigned int
”和“unsigned long long int
”定义的说明它使用 "the 32 or 64 bit value".
在我们的代码中,为了安全起见,我们使用 uint32_t
和 uint64_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 保护。