64bit atomicAdd in CUDA



我在CUDA 7下使用atomicAdd有问题。atomicAdd定义为"int","unsigned int"one_answers"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"定义。

是保存假设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更好地保护。

最新更新