64位原子添加到CUDA中

Fla*_*ire 6 c++ types cuda atomic word-size

atomicAdd我在 CUDA 7 下使用时遇到问题。atomicAdd定义为“ int”、“ unsigned int”和“ unsigned long long int”,说明它使用“32 或 64 位值”。

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

#if __WORDSIZE == 64
typedef unsigned long int   uint64_t;
#else
__extension__
typedef unsigned long long int  uint64_t;
#endif
Run Code Online (Sandbox Code Playgroud)

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

是否可以uint64_t == long long int按照编程指南中所述假设进行 CUDA 编译?

Fla*_*ire 7

回答一下以供将来参考:

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

typedef long long int int64_cu
typedef unsigned long long int uint64_cu
Run Code Online (Sandbox Code Playgroud)

并且可能通过(boost-)保护它们的static_asserts大小相同

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