2#include "ff/precision.h"
7#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ < 600
9inline double atomicAdd(
double* ptr,
double v)
11 unsigned long long int* ullptr = (
unsigned long long int*)ptr;
12 unsigned long long int old = *ullptr, assumed;
15 old = atomicCAS(ullptr, assumed,
16 __double_as_longlong(v + __longlong_as_double(assumed)));
17 }
while (assumed != old);
20 return __longlong_as_double(old);
32inline void atomic_add(T value, T* buffer,
size_t offset = 0)
34 atomicAdd(&buffer[offset], value);
40 class =
typename std::enable_if<std::is_same<T, float>::value ||
41 std::is_same<T, double>::value>::type>
46 atomicAdd(&buffer[offset],
47 static_cast<fixed>(
static_cast<long long>(value * 0x100000000ull)));
53inline void atomic_add(T vxx, T vyx, T vzx, T vyy, T vzy, T vzz, T (*buffer)[8],
67 class =
typename std::enable_if<std::is_same<T, float>::value ||
68 std::is_same<T, double>::value>::type>
70inline void atomic_add(T vxx, T vyx, T vzx, T vyy, T vzy, T vzz,
71 fixed (*buffer)[8],
size_t offset = 0)
82template <
class G,
class T>
86 static_assert(std::is_same<T, float>::value ||
87 std::is_same<T, double>::value,
89 if CONSTEXPR (std::is_same<G, fixed>::value)
90 return static_cast<G>(
static_cast<long long>(val * 0x100000000ull));
92 return static_cast<G>(val);
100 return static_cast<T
>(
static_cast<long long>(val)) / 0x100000000ull;
108 return fixedTo<T>(g);
128template <
class T,
class U>
133 return std::is_same<T, U>::value;
G floatTo(T val)
Converts val of floating-point to type G.
Definition: acc/adddef.h:68
T toFloatGrad(fixed g)
Converts a fixed-point value g to floating-point value.
Definition: acc/adddef.h:90
T fixedTo(fixed val)
Converts val of fixed-point to floating-point.
Definition: acc/adddef.h:82
void atomic_add(T value, T *buffer, size_t offset=0)
Definition: acc/adddef.h:14
constexpr bool eq()
Used as eq<T1,T2>() for two type identifiers.
Definition: acc/adddef.h:113
#define CONSTEXPR
Definition: macro.h:61
unsigned long long fixed
Definition: precision.h:68