| 19 | #ifdef __CUDA_ARCH__ |
| 20 | #if __CUDA_ARCH__ < 600 |
| 21 | inline __device__ double atomicAdd(double* address, double val) |
| 22 | { |
| 23 | unsigned long long int* address_as_ull = |
| 24 | (unsigned long long int*)address; |
| 25 | unsigned long long int old = *address_as_ull, assumed; |
| 26 | |
| 27 | do { |
| 28 | assumed = old; |
| 29 | old = atomicCAS(address_as_ull, assumed, |
| 30 | __double_as_longlong(val + |
| 31 | __longlong_as_double(assumed))); |
| 32 | |
| 33 | // Note: uses integer comparison to avoid hang in case of NaN (since NaN != NaN) |
| 34 | } while (assumed != old); |
| 35 | |
| 36 | return __longlong_as_double(old); |
| 37 | } |
| 38 | #endif |
| 39 | #endif |
| 40 |
no outgoing calls
no test coverage detected