Tinker9 70bd052 (Thu Nov 9 12:11:35 2023 -0800)
Loading...
Searching...
No Matches
cu/adddef.h
1#pragma once
2#include "ff/precision.h"
3#include <cstddef>
4#include <type_traits>
5
6// docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#atomic-functions
7#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ < 600
8__device__
9inline double atomicAdd(double* ptr, double v)
10{
11 unsigned long long int* ullptr = (unsigned long long int*)ptr;
12 unsigned long long int old = *ullptr, assumed;
13 do {
14 assumed = old;
15 old = atomicCAS(ullptr, assumed,
16 __double_as_longlong(v + __longlong_as_double(assumed)));
17 } while (assumed != old);
18 // using floating-point comparison will hang in case of NaN
19 // (since NaN != NaN)
20 return __longlong_as_double(old);
21}
22#endif
23
24namespace tinker {
27
30template <class T>
31__device__
32inline void atomic_add(T value, T* buffer, size_t offset = 0)
33{
34 atomicAdd(&buffer[offset], value);
35}
36
39template <class T,
40 class = typename std::enable_if<std::is_same<T, float>::value ||
41 std::is_same<T, double>::value>::type>
42__device__
43inline void atomic_add(T value, fixed* buffer, size_t offset = 0)
44{
45 // float -> (signed) long long -> fixed
46 atomicAdd(&buffer[offset],
47 static_cast<fixed>(static_cast<long long>(value * 0x100000000ull)));
48}
49
51template <class T>
52__device__
53inline void atomic_add(T vxx, T vyx, T vzx, T vyy, T vzy, T vzz, T (*buffer)[8],
54 size_t offset = 0)
55{
56 atomic_add(vxx, buffer[offset], 0);
57 atomic_add(vyx, buffer[offset], 1);
58 atomic_add(vzx, buffer[offset], 2);
59 atomic_add(vyy, buffer[offset], 3);
60 atomic_add(vzy, buffer[offset], 4);
61 atomic_add(vzz, buffer[offset], 5);
62}
63
66template <class T,
67 class = typename std::enable_if<std::is_same<T, float>::value ||
68 std::is_same<T, double>::value>::type>
69__device__
70inline void atomic_add(T vxx, T vyx, T vzx, T vyy, T vzy, T vzz,
71 fixed (*buffer)[8], size_t offset = 0)
72{
73 atomic_add(vxx, buffer[offset], 0);
74 atomic_add(vyx, buffer[offset], 1);
75 atomic_add(vzx, buffer[offset], 2);
76 atomic_add(vyy, buffer[offset], 3);
77 atomic_add(vzy, buffer[offset], 4);
78 atomic_add(vzz, buffer[offset], 5);
79}
80
82template <class G, class T>
83__device__
84inline G floatTo(T val)
85{
86 static_assert(std::is_same<T, float>::value ||
87 std::is_same<T, double>::value,
88 "");
89 if CONSTEXPR (std::is_same<G, fixed>::value)
90 return static_cast<G>(static_cast<long long>(val * 0x100000000ull));
91 else
92 return static_cast<G>(val);
93}
94
96template <class T>
97__device__
98inline T fixedTo(fixed val)
99{
100 return static_cast<T>(static_cast<long long>(val)) / 0x100000000ull;
101}
102
104template <class T>
105__device__
107{
108 return fixedTo<T>(g);
109}
110
112template <class T>
113__device__
114inline T toFloatGrad(double g)
115{
116 return g;
117}
118
120template <class T>
121__device__
122inline T toFloatGrad(float g)
123{
124 return g;
125}
126
128template <class T, class U>
129__device__
130__host__
131constexpr bool eq()
132{
133 return std::is_same<T, U>::value;
134}
135
137}
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
Definition: testrt.h:9