У меня есть проблема с использованием atomicAdd
под CUDA 7. atomicAdd
определяется для «int
», «unsigned int
» и «unsigned long long int
» о том, что использует «32 или 64 битное значение».64-разрядные atomicAdd в CUDA
В нашем коде мы используем uint32_t
и uint64_t
для обеспечения безопасности. Однако НКУ определяет это следующим образом:
#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, как указано в руководстве по программированию?
Ну, строго говоря, эти типы не гарантируются одинаковыми, но вы можете добавить 'reinterpret_cast' в' unsigned long int', защищенный 'static_assert', который гарантирует, что оба типа имеют одинаковый размер, и это будет безопасно. Однако я склонен рассматривать это как недостающую перегрузку в API CUDA. –
Да, мне. Однако, похоже, мы столкнулись с этим ранее и определенным (u) int64_cu для использования на стороне устройства. Защита от статического утверждения, вероятно, является лучшим решением. – Flamefire