Search code examples
c++typescudaatomicword-size

64bit atomicAdd in CUDA


I have a problem using atomicAdd under CUDA 7. atomicAdd is defined for "int", "unsigned int" and "unsigned long long int" stating it uses "the 32 or 64 bit value".

In our code we use uint32_t and uint64_t for safety. However gcc defines this in the following way:

#if __WORDSIZE == 64
typedef unsigned long int   uint64_t;
#else
__extension__
typedef unsigned long long int  uint64_t;
#endif

So when I pass an uint64_t to atomicAdd it complains because it is not defined for "unsigned long int".

Is it save to assume uint64_t == long long int for CUDA compilation as stated in the programming guide?


Solution

  • To answer that for future reference:

    There are 2 options: Either use a typedef to define 64 bit cuda types like:

    typedef long long int int64_cu
    typedef unsigned long long int uint64_cu
    

    And probably guard these by (boost-)static_asserts to be the same size(of)

    Or as suggested by @Anastasiya Asadullayeva use a reinterpret_cast in the call which is better also guarded by a static_assert.