Restore the custom double atomic add. (#7198)
This commit is contained in:
parent
7a1d67f9cb
commit
ba69244a94
@ -53,6 +53,27 @@
|
|||||||
|
|
||||||
#endif // defined(XGBOOST_USE_RMM) && XGBOOST_USE_RMM == 1
|
#endif // defined(XGBOOST_USE_RMM) && XGBOOST_USE_RMM == 1
|
||||||
|
|
||||||
|
#if !defined(__CUDA_ARCH__) || __CUDA_ARCH__ >= 600 || defined(__clang__)
|
||||||
|
|
||||||
|
#else // In device code and CUDA < 600
|
||||||
|
__device__ __forceinline__ double atomicAdd(double* address, double val) { // NOLINT
|
||||||
|
unsigned long long int* address_as_ull =
|
||||||
|
(unsigned long long int*)address; // NOLINT
|
||||||
|
unsigned long long int old = *address_as_ull, assumed; // NOLINT
|
||||||
|
|
||||||
|
do {
|
||||||
|
assumed = old;
|
||||||
|
old = atomicCAS(address_as_ull, assumed,
|
||||||
|
__double_as_longlong(val + __longlong_as_double(assumed)));
|
||||||
|
|
||||||
|
// Note: uses integer comparison to avoid hang in case of NaN (since NaN !=
|
||||||
|
// NaN)
|
||||||
|
} while (assumed != old);
|
||||||
|
|
||||||
|
return __longlong_as_double(old);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace dh {
|
namespace dh {
|
||||||
namespace detail {
|
namespace detail {
|
||||||
template <size_t size>
|
template <size_t size>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user