HiRep 0.1
Loading...
Searching...
No Matches
precise_sums_gpu.hpp
1
2#ifndef PRECISE_SUMS_GPU_H
3#define PRECISE_SUMS_GPU_H
4
5struct __align__(16) quad_double {
6 double val;
7 double compensation;
8
9 constexpr visible quad_double(const double x = 0.0, const double comp = 0.0)
10 : val(x)
11 , compensation(comp) {
12 }
13
14 visible inline __attribute__((always_inline)) quad_double &operator=(const quad_double &x) {
15 val = x.val;
16 compensation = x.compensation;
17 return *this;
18 }
19
20 // Maybe we need to add the compensation term of the added variable?
21 visible inline __attribute__((always_inline)) quad_double operator+(const quad_double &x) const {
22 double new_val = val;
23 double new_compensation = compensation;
24 _2Sum_acc(new_val, new_compensation, x.val);
25 new_compensation += x.compensation;
26 return quad_double(new_val, new_compensation);
27 }
28
29 visible inline __attribute__((always_inline)) quad_double &operator+=(const quad_double &x) {
30 _2Sum_acc(val, compensation, x.val);
31 compensation += x.compensation;
32 return *this;
33 }
34
35 visible inline __attribute__((always_inline)) void correct() {
36 val += compensation;
37 compensation = 0;
38 }
39};
40
41quad_double *alloc_quad_double_sum_field(int n);
42
43#endif