У меня проблема с использованием atomicAdd
под CUDA 7. 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
».
Можно ли предположить uint64_t == long long int
для компиляции CUDA, как указано в руководстве по программированию?
Чтобы ответить на это для дальнейшего использования:
Есть 2 варианта: либо использовать 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.