Tinker9 70bd052 (Thu Nov 9 12:11:35 2023 -0800)
Loading...
Searching...
No Matches
acc/adddef.h
1#pragma once
2#include "ff/precision.h"
3#include <cstddef>
4#include <type_traits>
5
6namespace tinker {
9
12#pragma acc routine seq
13template <class T>
14inline void atomic_add(T value, T* buffer, size_t offset = 0)
15{
16 #pragma acc atomic update
17 buffer[offset] += value;
18}
19
22#pragma acc routine seq
23template <class T,
24 class = typename std::enable_if<std::is_same<T, float>::value ||
25 std::is_same<T, double>::value>::type>
26inline void atomic_add(T value, fixed* buffer, size_t offset = 0)
27{
28 // float -> (signed) long long -> fixed
29 #pragma acc atomic update
30 buffer[offset] += static_cast<fixed>(static_cast<long long>(value *
31 0x100000000ull));
32}
33
35#pragma acc routine seq
36template <class T>
37inline void atomic_add(T vxx, T vyx, T vzx, T vyy, T vzy, T vzz, T (*buffer)[8],
38 size_t offset = 0)
39{
40 atomic_add(vxx, buffer[offset], 0);
41 atomic_add(vyx, buffer[offset], 1);
42 atomic_add(vzx, buffer[offset], 2);
43 atomic_add(vyy, buffer[offset], 3);
44 atomic_add(vzy, buffer[offset], 4);
45 atomic_add(vzz, buffer[offset], 5);
46}
47
50#pragma acc routine seq
51template <class T,
52 class = typename std::enable_if<std::is_same<T, float>::value ||
53 std::is_same<T, double>::value>::type>
54inline void atomic_add(T vxx, T vyx, T vzx, T vyy, T vzy, T vzz,
55 fixed (*buffer)[8], size_t offset = 0)
56{
57 atomic_add(vxx, buffer[offset], 0);
58 atomic_add(vyx, buffer[offset], 1);
59 atomic_add(vzx, buffer[offset], 2);
60 atomic_add(vyy, buffer[offset], 3);
61 atomic_add(vzy, buffer[offset], 4);
62 atomic_add(vzz, buffer[offset], 5);
63}
64
66#pragma acc routine seq
67template <class G, class T>
68inline G floatTo(T val)
69{
70 static_assert(std::is_same<T, float>::value ||
71 std::is_same<T, double>::value,
72 "");
73 if CONSTEXPR (std::is_same<G, fixed>::value)
74 return static_cast<G>(static_cast<long long>(val * 0x100000000ull));
75 else
76 return static_cast<G>(val);
77}
78
80#pragma acc routine seq
81template <class T>
82inline T fixedTo(fixed val)
83{
84 return static_cast<T>(static_cast<long long>(val)) / 0x100000000ull;
85}
86
88#pragma acc routine seq
89template <class T>
90inline T toFloatGrad(fixed g)
91{
92 return fixedTo<T>(g);
93}
94
96#pragma acc routine seq
97template <class T>
98inline T toFloatGrad(double g)
99{
100 return g;
101}
102
104#pragma acc routine seq
105template <class T>
106inline T toFloatGrad(float g)
107{
108 return g;
109}
110
112template <class T, class U>
113constexpr bool eq()
114{
115 return std::is_same<T, U>::value;
116}
117
119}
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