2015-09-03 6 views
1

У меня есть проблема с использованием 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, как указано в руководстве по программированию?

+0

Ну, строго говоря, эти типы не гарантируются одинаковыми, но вы можете добавить 'reinterpret_cast' в' unsigned long int', защищенный 'static_assert', который гарантирует, что оба типа имеют одинаковый размер, и это будет безопасно. Однако я склонен рассматривать это как недостающую перегрузку в API CUDA. –

+0

Да, мне. Однако, похоже, мы столкнулись с этим ранее и определенным (u) int64_cu для использования на стороне устройства. Защита от статического утверждения, вероятно, является лучшим решением. – Flamefire

ответ

1

Чтобы ответить на этот вопрос для дальнейшего использования:

Есть 2 варианта: либо использовать ЬурейеЕ, чтобы определить 64 типов бит Cuda как:

typedef long long int int64_cu 
typedef unsigned long long int uint64_cu 

И, наверное, охраняют их от (boost-) static_asserts к быть того же размера (0)

Или, как было предложено @ Анастасия Асадуллаева, используйте вызов reinterpret_cast в вызове, который лучше также охраняется static_assert.