C++ 64位原子插件CUDA
我在CUDA 7下使用原子添加时遇到问题C++ 64位原子插件CUDA,c++,types,cuda,atomic,word-size,C++,Types,Cuda,Atomic,Word Size,我在CUDA 7下使用原子添加时遇到问题atomicAdd是为“int”、“unsigned int”和“unsigned long long int”定义的,表示它使用了“32位或64位值” 在我们的代码中,为了安全起见,我们使用了uint32\u t和uint64\u t。但是,gcc以以下方式对其进行了定义: #if __WORDSIZE == 64 typedef unsigned long int uint64_t; #else __extension__ typedef unsi
atomicAdd
是为“int
”、“unsigned int
”和“unsigned long long int
”定义的,表示它使用了“32位或64位值”
在我们的代码中,为了安全起见,我们使用了uint32\u t
和uint64\u t
。但是,gcc以以下方式对其进行了定义:
#if __WORDSIZE == 64
typedef unsigned long int uint64_t;
#else
__extension__
typedef unsigned long long int uint64_t;
#endif
因此,当我将一个uint64\u t
传递给atomicAdd
时,它会抱怨,因为它没有为“无符号长int
”定义
按照编程指南中的说明,假设CUDA编译的
uint64\u t==long-long-int
可以保存吗?回答这个问题以供将来参考:
有两个选项:使用typedef定义64位cuda类型,如:
typedef long long int int64_cu
typedef unsigned long long int uint64_cu
并可能通过(boost-静态断言
大小相同来保护这些
或者按照@Anastasiya Asadullayeva的建议,在调用中使用一个reinterpret_cast,它最好也由一个静态断言来保护。是的,我可以。然而,我们似乎在前面遇到了这个问题,并为设备端使用定义了(u)int64_cu。用静态断言来保护这一点可能是最好的解决方案。