我在CUDA 7下使用atomicAdd
时出现问题。atomicAdd
定义为“int
”,“unsigned int
”和“unsigned long long int
”使用“32或64位值”。
在我们的代码中,我们使用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
?
答案 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保护。