HMLP: High-performance Machine Learning Primitives
rank_k_int_d8x6.hpp
1 
3 v4df_t c03_0, c03_1, c03_2, c03_3, c03_4, c03_5;
4 v4df_t c47_0, c47_1, c47_2, c47_3, c47_4, c47_5;
5 v4df_t a03, a47, b0, b1;
6 
7 int k_iter = k / 2;
8 int k_left = k % 2;
9 
10 __asm__ volatile( "prefetcht0 0(%0) \n\t" : :"r"( a ) );
11 __asm__ volatile( "prefetcht2 0(%0) \n\t" : :"r"( aux->b_next ) );
12 __asm__ volatile( "prefetcht0 192(%0) \n\t" : :"r"( c ) );
13 
14 c03_0.v = _mm256_setzero_pd();
15 c03_1.v = _mm256_setzero_pd();
16 c03_2.v = _mm256_setzero_pd();
17 c03_3.v = _mm256_setzero_pd();
18 c03_4.v = _mm256_setzero_pd();
19 c03_5.v = _mm256_setzero_pd();
20 
21 c47_0.v = _mm256_setzero_pd();
22 c47_1.v = _mm256_setzero_pd();
23 c47_2.v = _mm256_setzero_pd();
24 c47_3.v = _mm256_setzero_pd();
25 c47_4.v = _mm256_setzero_pd();
26 c47_5.v = _mm256_setzero_pd();
27 
28 // Load a03, a47, b0
29 a03.v = _mm256_load_pd( (double*) a );
30 a47.v = _mm256_load_pd( (double*)( a + 4 ) );
31 
32 for ( int i = 0; i < k_iter; ++ i )
33 {
34 
36  __asm__ volatile( "prefetcht0 192(%0) \n\t" : :"r"(a) );
37 
38  b0.v = _mm256_broadcast_sd( b );
39  b1.v = _mm256_broadcast_sd( b + 1 );
40  c03_0.v = _mm256_fmadd_pd( a03.v, b0.v, c03_0.v );
41  c47_0.v = _mm256_fmadd_pd( a47.v, b0.v, c47_0.v );
42  c03_1.v = _mm256_fmadd_pd( a03.v, b1.v, c03_1.v );
43  c47_1.v = _mm256_fmadd_pd( a47.v, b1.v, c47_1.v );
44 
45  b0.v = _mm256_broadcast_sd( b + 2 );
46  b1.v = _mm256_broadcast_sd( b + 3 );
47  c03_2.v = _mm256_fmadd_pd( a03.v, b0.v, c03_2.v );
48  c47_2.v = _mm256_fmadd_pd( a47.v, b0.v, c47_2.v );
49  c03_3.v = _mm256_fmadd_pd( a03.v, b1.v, c03_3.v );
50  c47_3.v = _mm256_fmadd_pd( a47.v, b1.v, c47_3.v );
51 
52  b0.v = _mm256_broadcast_sd( b + 4 );
53  b1.v = _mm256_broadcast_sd( b + 5 );
54  c03_4.v = _mm256_fmadd_pd( a03.v, b0.v, c03_4.v );
55  c47_4.v = _mm256_fmadd_pd( a47.v, b0.v, c47_4.v );
56  c03_5.v = _mm256_fmadd_pd( a03.v, b1.v, c03_5.v );
57  c47_5.v = _mm256_fmadd_pd( a47.v, b1.v, c47_5.v );
58 
59  a03.v = _mm256_load_pd( (double*)( a + 8 ) );
60  a47.v = _mm256_load_pd( (double*)( a + 12 ) );
61 
63  __asm__ volatile( "prefetcht0 512(%0) \n\t" : :"r"(a) );
64 
65  b0.v = _mm256_broadcast_sd( b + 6 );
66  b1.v = _mm256_broadcast_sd( b + 7 );
67  c03_0.v = _mm256_fmadd_pd( a03.v, b0.v, c03_0.v );
68  c47_0.v = _mm256_fmadd_pd( a47.v, b0.v, c47_0.v );
69  c03_1.v = _mm256_fmadd_pd( a03.v, b1.v, c03_1.v );
70  c47_1.v = _mm256_fmadd_pd( a47.v, b1.v, c47_1.v );
71 
72  b0.v = _mm256_broadcast_sd( b + 8 );
73  b1.v = _mm256_broadcast_sd( b + 9 );
74  c03_2.v = _mm256_fmadd_pd( a03.v, b0.v, c03_2.v );
75  c47_2.v = _mm256_fmadd_pd( a47.v, b0.v, c47_2.v );
76  c03_3.v = _mm256_fmadd_pd( a03.v, b1.v, c03_3.v );
77  c47_3.v = _mm256_fmadd_pd( a47.v, b1.v, c47_3.v );
78 
79  b0.v = _mm256_broadcast_sd( b + 10 );
80  b1.v = _mm256_broadcast_sd( b + 11 );
81  c03_4.v = _mm256_fmadd_pd( a03.v, b0.v, c03_4.v );
82  c47_4.v = _mm256_fmadd_pd( a47.v, b0.v, c47_4.v );
83  c03_5.v = _mm256_fmadd_pd( a03.v, b1.v, c03_5.v );
84  c47_5.v = _mm256_fmadd_pd( a47.v, b1.v, c47_5.v );
85 
86  a03.v = _mm256_load_pd( (double*)( a + 16 ) );
87  a47.v = _mm256_load_pd( (double*)( a + 20 ) );
88 
89  a += 16;
90  b += 12;
91 }
92 
93 
94 for ( int i = 0; i < k_left; ++ i )
95 {
96 
97  // Iteration #0
98  __asm__ volatile( "prefetcht0 192(%0) \n\t" : :"r"(a) );
99 
100  b0.v = _mm256_broadcast_sd( b );
101  b1.v = _mm256_broadcast_sd( b + 1 );
102  c03_0.v = _mm256_fmadd_pd( a03.v, b0.v, c03_0.v );
103  c47_0.v = _mm256_fmadd_pd( a47.v, b0.v, c47_0.v );
104  c03_1.v = _mm256_fmadd_pd( a03.v, b1.v, c03_1.v );
105  c47_1.v = _mm256_fmadd_pd( a47.v, b1.v, c47_1.v );
106 
107  b0.v = _mm256_broadcast_sd( b + 2 );
108  b1.v = _mm256_broadcast_sd( b + 3 );
109  c03_2.v = _mm256_fmadd_pd( a03.v, b0.v, c03_2.v );
110  c47_2.v = _mm256_fmadd_pd( a47.v, b0.v, c47_2.v );
111  c03_3.v = _mm256_fmadd_pd( a03.v, b1.v, c03_3.v );
112  c47_3.v = _mm256_fmadd_pd( a47.v, b1.v, c47_3.v );
113 
114  b0.v = _mm256_broadcast_sd( b + 4 );
115  b1.v = _mm256_broadcast_sd( b + 5 );
116  c03_4.v = _mm256_fmadd_pd( a03.v, b0.v, c03_4.v );
117  c47_4.v = _mm256_fmadd_pd( a47.v, b0.v, c47_4.v );
118  c03_5.v = _mm256_fmadd_pd( a03.v, b1.v, c03_5.v );
119  c47_5.v = _mm256_fmadd_pd( a47.v, b1.v, c47_5.v );
120 
121  a03.v = _mm256_load_pd( (double*)( a + 8 ) );
122  a47.v = _mm256_load_pd( (double*)( a + 12 ) );
123 
124  a += 8;
125  b += 6;
126 }
127 
129 if ( aux->pc )
130 {
131  a03.v = _mm256_load_pd( (double*)( c ) );
132  c03_0.v = _mm256_add_pd( a03.v, c03_0.v );
133  a47.v = _mm256_load_pd( (double*)( c + 4 ) );
134  c47_0.v = _mm256_add_pd( a47.v, c47_0.v );
135 
136  a03.v = _mm256_load_pd( (double*)( c + 8 ) );
137  c03_1.v = _mm256_add_pd( a03.v, c03_1.v );
138  a47.v = _mm256_load_pd( (double*)( c + 12 ) );
139  c47_1.v = _mm256_add_pd( a47.v, c47_1.v );
140 
141  a03.v = _mm256_load_pd( (double*)( c + 16 ) );
142  c03_2.v = _mm256_add_pd( a03.v, c03_2.v );
143  a47.v = _mm256_load_pd( (double*)( c + 20 ) );
144  c47_2.v = _mm256_add_pd( a47.v, c47_2.v );
145 
146  a03.v = _mm256_load_pd( (double*)( c + 24 ) );
147  c03_3.v = _mm256_add_pd( a03.v, c03_3.v );
148  a47.v = _mm256_load_pd( (double*)( c + 28 ) );
149  c47_3.v = _mm256_add_pd( a47.v, c47_3.v );
150 
151  a03.v = _mm256_load_pd( (double*)( c + 32 ) );
152  c03_4.v = _mm256_add_pd( a03.v, c03_4.v );
153  a47.v = _mm256_load_pd( (double*)( c + 36 ) );
154  c47_4.v = _mm256_add_pd( a47.v, c47_4.v );
155 
156  a03.v = _mm256_load_pd( (double*)( c + 40 ) );
157  c03_5.v = _mm256_add_pd( a03.v, c03_5.v );
158  a47.v = _mm256_load_pd( (double*)( c + 44 ) );
159  c47_5.v = _mm256_add_pd( a47.v, c47_5.v );
160 }
Definition: avx_type.h:13