我在CUDA 7下使用atomicAdd
有问题。atomicAdd
定义为"int
","unsigned int
"one_answers"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
"定义。
是保存假设uint64_t == long long int
CUDA编译如编程指南中所述?
回答这个问题,以备将来参考:
有两个选项:要么使用typedef定义64位cuda类型,如:
typedef long long int int64_cu
typedef unsigned long long int uint64_cu
并且可能通过(boost-) static_asserts
来保护它们的大小相同
或者像@Anastasiya Asadullayeva建议的那样,在调用中使用reinterpret_cast,这也可以由static_assert更好地保护。