HMLP: High-performance Machine Learning Primitives
gsks_d8x6.hpp
1 #include <stdio.h>
2 #include <math.h>
3 
4 #include <hmlp.h>
5 #include <hmlp_internal.hpp>
6 
8 #include <avx_type.h>
9 
10 
11 #define MM256_ADD8x6(beta,regis); \
12  regis.v = _mm256_broadcast_sd( &beta ); \
13  c03_0.v = _mm256_add_pd( regis.v, c03_0.v ); \
14  c03_1.v = _mm256_add_pd( regis.v, c03_1.v ); \
15  c03_2.v = _mm256_add_pd( regis.v, c03_2.v ); \
16  c03_3.v = _mm256_add_pd( regis.v, c03_3.v ); \
17  c03_4.v = _mm256_add_pd( regis.v, c03_4.v ); \
18  c03_5.v = _mm256_add_pd( regis.v, c03_5.v ); \
19  c47_0.v = _mm256_add_pd( regis.v, c47_0.v ); \
20  c47_1.v = _mm256_add_pd( regis.v, c47_1.v ); \
21  c47_2.v = _mm256_add_pd( regis.v, c47_2.v ); \
22  c47_3.v = _mm256_add_pd( regis.v, c47_3.v ); \
23  c47_4.v = _mm256_add_pd( regis.v, c47_4.v ); \
24  c47_5.v = _mm256_add_pd( regis.v, c47_5.v ); \
25 
26 #define MM256_MUL8x6(alpha,regis); \
27  regis.v = _mm256_broadcast_sd( &alpha ); \
28  c03_0.v = _mm256_mul_pd( regis.v, c03_0.v ); \
29  c03_1.v = _mm256_mul_pd( regis.v, c03_1.v ); \
30  c03_2.v = _mm256_mul_pd( regis.v, c03_2.v ); \
31  c03_3.v = _mm256_mul_pd( regis.v, c03_3.v ); \
32  c03_4.v = _mm256_mul_pd( regis.v, c03_4.v ); \
33  c03_5.v = _mm256_mul_pd( regis.v, c03_5.v ); \
34  c47_0.v = _mm256_mul_pd( regis.v, c47_0.v ); \
35  c47_1.v = _mm256_mul_pd( regis.v, c47_1.v ); \
36  c47_2.v = _mm256_mul_pd( regis.v, c47_2.v ); \
37  c47_3.v = _mm256_mul_pd( regis.v, c47_3.v ); \
38  c47_4.v = _mm256_mul_pd( regis.v, c47_4.v ); \
39  c47_5.v = _mm256_mul_pd( regis.v, c47_5.v ); \
40 
41 #define MM256_SQUARE8x6(); \
42  c03_0.v = _mm256_mul_pd( c03_0.v, c03_0.v ); \
43  c03_1.v = _mm256_mul_pd( c03_1.v, c03_1.v ); \
44  c03_2.v = _mm256_mul_pd( c03_2.v, c03_2.v ); \
45  c03_3.v = _mm256_mul_pd( c03_3.v, c03_3.v ); \
46  c03_4.v = _mm256_mul_pd( c03_4.v, c03_4.v ); \
47  c03_5.v = _mm256_mul_pd( c03_5.v, c03_5.v ); \
48  c47_0.v = _mm256_mul_pd( c47_0.v, c47_0.v ); \
49  c47_1.v = _mm256_mul_pd( c47_1.v, c47_1.v ); \
50  c47_2.v = _mm256_mul_pd( c47_2.v, c47_2.v ); \
51  c47_3.v = _mm256_mul_pd( c47_3.v, c47_3.v ); \
52  c47_4.v = _mm256_mul_pd( c47_4.v, c47_4.v ); \
53  c47_5.v = _mm256_mul_pd( c47_5.v, c47_5.v ); \
54 
55 #define MM256_EXP8x6(); \
56  c03_0.v = _mm256_exp_pd( c03_0.v ); \
57  c03_1.v = _mm256_exp_pd( c03_1.v ); \
58  c03_2.v = _mm256_exp_pd( c03_2.v ); \
59  c03_3.v = _mm256_exp_pd( c03_3.v ); \
60  c03_4.v = _mm256_exp_pd( c03_4.v ); \
61  c03_5.v = _mm256_exp_pd( c03_5.v ); \
62  c47_0.v = _mm256_exp_pd( c47_0.v ); \
63  c47_1.v = _mm256_exp_pd( c47_1.v ); \
64  c47_2.v = _mm256_exp_pd( c47_2.v ); \
65  c47_3.v = _mm256_exp_pd( c47_3.v ); \
66  c47_4.v = _mm256_exp_pd( c47_4.v ); \
67  c47_5.v = _mm256_exp_pd( c47_5.v ); \
68 
69 #define MM256_POW8x6(power,regis); \
70  regis.v = _mm256_broadcast_sd( &power ); \
71  c03_0.v = _mm256_pow_pd( c03_0.v, regis.v ); \
72  c03_1.v = _mm256_pow_pd( c03_1.v, regis.v ); \
73  c03_2.v = _mm256_pow_pd( c03_2.v, regis.v ); \
74  c03_3.v = _mm256_pow_pd( c03_3.v, regis.v ); \
75  c03_4.v = _mm256_pow_pd( c03_4.v, regis.v ); \
76  c03_5.v = _mm256_pow_pd( c03_5.v, regis.v ); \
77  c47_0.v = _mm256_pow_pd( c47_0.v, regis.v ); \
78  c47_1.v = _mm256_pow_pd( c47_1.v, regis.v ); \
79  c47_2.v = _mm256_pow_pd( c47_2.v, regis.v ); \
80  c47_3.v = _mm256_pow_pd( c47_3.v, regis.v ); \
81  c47_4.v = _mm256_pow_pd( c47_4.v, regis.v ); \
82  c47_5.v = _mm256_pow_pd( c47_5.v, regis.v ); \
83 
84 
85 
86 
88 {
89 
90  inline GSKS_OPERATOR(float) const
91  {
92  printf( "no GSKS_OPERATOR implementation\n" );
93  exit( 1 );
94  };
95 
96 };
101 {
102 
103  inline GSKS_OPERATOR(double) const
104  {
105  double alpha = ker->scal;
106 
108  #include <component/rank_k_int_d8x6.hpp>
109 
111  #include <component/sq2nrm_int_d8x6.hpp>
112 
114  MM256_MUL8x6(alpha,a03);
115 
117  __asm__ volatile( "prefetcht0 0(%0) \n\t" : :"r"( u ) );
118  __asm__ volatile( "prefetcht0 0(%0) \n\t" : :"r"( w ) );
119 
121  MM256_EXP8x6();
122 
124  #include <component/weighted_sum_int_d8x6.hpp>
125  };
126 
127 };
132 {
133 
134  inline GSKS_OPERATOR(float) const
135  {
136  printf( "no GSKS_OPERATOR implementation\n" );
137  exit( 1 );
138  };
139 
140 };
144 {
145 
146  inline GSKS_OPERATOR(double) const
147  {
148  double powe = ker->powe;
149  double scal = ker->scal;
150  double cons = ker->cons;
151 
153  #include <component/rank_k_int_d8x6.hpp>
154 
156  __asm__ volatile( "prefetcht0 0(%0) \n\t" : :"r"( u ) );
157  __asm__ volatile( "prefetcht0 0(%0) \n\t" : :"r"( w ) );
158 
160  MM256_MUL8x6(scal,a03);
161 
163  MM256_ADD8x6(cons,a03);
164 
166  if ( powe == 2.0 )
167  {
168  MM256_SQUARE8x6();
169  }
170  else if ( powe == 4.0 )
171  {
172  MM256_SQUARE8x6();
173  MM256_SQUARE8x6();
174  }
175  else
176  {
177  MM256_POW8x6(powe,a03);
178  }
179 
181  #include <component/weighted_sum_int_d8x6.hpp>
182  };
183 
184 };
Definition: gsks_d8x6.hpp:131
Definition: gsks_d8x6.hpp:100
Definition: gsks_d8x6.hpp:87
GSKS_OPERATOR(double) const
Definition: gsks_d8x6.hpp:146
GSKS_OPERATOR(double) const
Definition: gsks_d8x6.hpp:103
Definition: gsks_d8x6.hpp:143