QDP++
sse_blas_local_sumsq_double.cc
Go to the documentation of this file.
1
6
8#include <xmmintrin.h>
9namespace QDP {
10
11
12// (Vector) out = (Scalar) (*scalep) * (Vector) InScale + (Vector) Add
13// #define DEBUG_VAXPY_DOUBLE
14 void local_sumsq4(REAL64 *sum, REAL64 *vecptr, int n_4spin)
15 {
16
17 // Initialize the 4 sums to zero. Use _mm_setzero_pd() rather than explicit xor
18 // Apparently we dont need volatile then.
19 __m128d sum1 = _mm_setzero_pd();
20 __m128d sum2 = _mm_setzero_pd();
21 __m128d sum3 = _mm_setzero_pd();
22 __m128d sum4 = _mm_setzero_pd();
23
24 __m128d tmp1;
25 __m128d tmp2;
26 __m128d tmp3;
27 __m128d tmp4;
28 __m128d tmp5;
29 __m128d tmp6;
30 __m128d tmp7;
31 __m128d tmp8;
32
33 double *in=vecptr;
34
35 for(int i=0; i < n_4spin; i++) {
36
37 tmp1=_mm_load_pd(in);
38 tmp5=_mm_mul_pd(tmp1,tmp1);
39 sum1=_mm_add_pd(sum1,tmp5);
40
41 tmp2=_mm_load_pd(in+2);
42 tmp6=_mm_mul_pd(tmp2,tmp2);
43 sum2=_mm_add_pd(sum2,tmp6);
44
45 tmp3=_mm_load_pd(in+4);
46 tmp7=_mm_mul_pd(tmp3,tmp3);
47 sum3=_mm_add_pd(sum3,tmp7);
48
49 tmp4=_mm_load_pd(in+6);
50 tmp8=_mm_mul_pd(tmp4,tmp4);
51 sum4=_mm_add_pd(sum4,tmp8);
52
53 tmp1=_mm_load_pd(in+8);
54 tmp5=_mm_mul_pd(tmp1,tmp1);
55 sum1=_mm_add_pd(sum1,tmp5);
56
57 tmp2=_mm_load_pd(in+10);
58 tmp6=_mm_mul_pd(tmp2,tmp2);
59 sum2=_mm_add_pd(sum2,tmp6);
60
61 tmp3=_mm_load_pd(in+12);
62 tmp7=_mm_mul_pd(tmp3,tmp3);
63 sum3=_mm_add_pd(sum3,tmp7);
64
65 tmp4=_mm_load_pd(in+14);
66 tmp8=_mm_mul_pd(tmp4,tmp4);
67 sum4=_mm_add_pd(sum4,tmp8);
68
69 tmp1=_mm_load_pd(in+16);
70 tmp5=_mm_mul_pd(tmp1,tmp1);
71 sum1=_mm_add_pd(sum1,tmp5);
72
73 tmp2=_mm_load_pd(in+18);
74 tmp6=_mm_mul_pd(tmp2,tmp2);
75 sum2=_mm_add_pd(sum2,tmp6);
76
77 tmp3=_mm_load_pd(in+20);
78 tmp7=_mm_mul_pd(tmp3,tmp3);
79 sum3=_mm_add_pd(sum3,tmp7);
80
81 tmp4=_mm_load_pd(in+22);
82 tmp8=_mm_mul_pd(tmp4,tmp4);
83 sum4=_mm_add_pd(sum4,tmp8);
84
85 in+=24;
86
87 }
88
89 sum1 = _mm_add_pd(sum1,sum2);
90 sum3 = _mm_add_pd(sum3,sum4);
91 sum1 = _mm_add_pd(sum1,sum3);
92
93 tmp1 = _mm_shuffle_pd(sum1, sum1, 0x1);
94 sum1 = _mm_add_pd(tmp1,sum1);
95 _mm_storel_pd(sum,sum1);
96
97}
98
99
100
101} // namespace QDP;
102
103
double REAL64
UnaryReturn< C, FnSum >::Type_t sum(const QDPType< T, C > &s1)
OScalar = sum(source).
Yet another random number generator.
void local_sumsq4(REAL64 *sum, REAL64 *vecptr, int n_4spin)
Generic Scalar VAXPY routine.