DD-AVX  2.0.0
scale.cpp
Go to the documentation of this file.
1 #include<DD-AVX_internal.hpp>
2 using namespace ddavx_core;
3 
4 namespace dd_avx{
5  void scale(const dd_real& alpha, dd_real_vector& x){
6  registers regs;
7 
8 #pragma omp parallel private(regs)
9  {
10  int i=0, is=0, ie=0;
11  get_isie(x.size(), is, ie);
12  reg alpha_hi = broadcast(alpha.x[0]);
13  reg alpha_lo = broadcast(alpha.x[1]);
14  for(i = is; i < (ie-SIMD_Length+1); i += SIMD_Length){
15 
16  reg x_hi = load(x.hi[i]);
17  reg x_lo = load(x.lo[i]);
18 
19  Mul(x_hi, x_lo, alpha_hi, alpha_lo, x_hi, x_lo, regs);
20 
21  store(x.hi[i], x_hi);
22  store(x.lo[i], x_lo);
23  }
24  for(;i<ie;i++){
25  Mul(x.hi[i], x.lo[i], alpha.x[0], alpha.x[1], x.hi[i], x.lo[i]);
26  }
27  }
28  }
29 
30  void scale(const d_real& alpha, dd_real_vector& x){
31  registers regs;
32 
33 #pragma omp parallel private(regs)
34  {
35  int i=0, is=0, ie=0;
36  get_isie(x.size(), is, ie);
37  reg alpha_hi = broadcast(alpha);
38  reg alpha_lo = regs.zeros;
39  for(i = is; i < (ie-SIMD_Length+1); i += SIMD_Length){
40 
41  reg x_hi = load(x.hi[i]);
42  reg x_lo = load(x.lo[i]);
43 
44  Mul(x_hi, x_lo, alpha_hi, alpha_lo, x_hi, x_lo, regs);
45 
46  store(x.hi[i], x_hi);
47  store(x.lo[i], x_lo);
48  }
49  for(;i<ie;i++){
50  Mul(x.hi[i], x.lo[i], alpha, 0.0, x.hi[i], x.lo[i]);
51  }
52  }
53  }
54 
55  void scale(const dd_real& alpha, d_real_vector& x){
56  registers regs;
57 
58 #pragma omp parallel private(regs)
59  {
60  int i=0, is=0, ie=0;
61  get_isie(x.size(), is, ie);
62  reg alpha_hi = broadcast(alpha.x[0]);
63  reg alpha_lo = broadcast(alpha.x[1]);
64  for(i = is; i < (ie-SIMD_Length+1); i += SIMD_Length){
65 
66  reg x_hi = load(x.data()[i]);
67  reg x_lo = regs.zeros;
68 
69  Mul(x_hi, x_lo, alpha_hi, alpha_lo, x_hi, x_lo, regs);
70 
71  store(x.data()[i], x_hi);
72  }
73  for(;i<ie;i++){
74  Mul(x.data()[i], alpha.x[0], alpha.x[1], x.data()[i], 0.0);
75  }
76  }
77  }
78 
79  void scale(const d_real& alpha, d_real_vector& x){
80  registers regs;
81 
82 #pragma omp parallel private(regs)
83  {
84  int i=0, is=0, ie=0;
85  get_isie(x.size(), is, ie);
86  reg alpha_hi = broadcast(alpha);
87  reg alpha_lo = regs.zeros;
88  for(i = is; i < (ie-SIMD_Length+1); i += SIMD_Length){
89 
90  reg x_hi = load(x.data()[i]);
91  reg x_lo = regs.zeros;
92 
93  Mul(x_hi, x_lo, alpha_hi, alpha_lo, x_hi, x_lo, regs);
94 
95  store(x.data()[i], x_hi);
96  }
97  for(;i<ie;i++){
98  Mul(x.data()[i], alpha, 0.0, x.data()[i], 0.0);
99  }
100  }
101  }
102 }
double d_real
Definition: DD-AVX.hpp:22
Double precision vector class, This class is almost same as std::vector<double>
Double-double precision vector class.
std::vector< double > lo
int size() const
get size
std::vector< double > hi
void scale(const dd_real &alpha, dd_real_vector &x)
scale: x = ax
Definition: scale.cpp:5