CUDA中的64位atomicAdd

时间:2015-09-03 08:20:50

标签: c++ types cuda atomic word-size

我在CUDA 7下使用atomicAdd时出现问题。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

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

如编程指南中所述,是否为CUDA编译假设uint64_t == long long int

1 个答案:

答案 0 :(得分:1)

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

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

static_asserts

并且可能通过(boost - )template<typename...> struct myclass; template<> struct myclass<>{}; template<typename T> struct myclass<T>{}; 保护它们的大小(of)

或者如@Anastasiya Asadullayeva所建议的那样,在调用中使用reinterpret_cast,最好还是由static_assert保护。