HMLP: High-performance Machine Learning Primitives
rank_k_int_d24x8.hpp
1 #include <stdio.h>
2 #include <immintrin.h> // AVX
3 
4 #include <hmlp_internal.hpp>
5 #include <avx_type.h> // self-defined vector type
6 
7 // #define DEBUG_MICRO 1
8 
10 {
11  inline void operator()
12  (
13  int k,
14  double *a,
15  double *b,
16  double *c, int ldc,
18  ) const
19  {
20  int i;
21  double neg2 = -2.0;
22 
23  // 24 avx512 registers
24  v8df_t c07_0, c07_1, c07_2, c07_3, c07_4, c07_5, c07_6, c07_7;
25  v8df_t c15_0, c15_1, c15_2, c15_3, c15_4, c15_5, c15_6, c15_7;
26  v8df_t c23_0, c23_1, c23_2, c23_3, c23_4, c23_5, c23_6, c23_7;
27 
28  // 8 avx512 registers
29  v8df_t a07, a15, a23;
30  v8df_t A07, A15, A23;
31  v8df_t b0, b1;
32 
33  //__asm__ volatile( "prefetcht0 0(%0) \n\t" : :"r"( a ) );
34  //__asm__ volatile( "prefetcht2 0(%0) \n\t" : :"r"( aux->b_next ) );
35  __asm__ volatile( "prefetcht0 0(%0) \n\t" : :"r"( c ) );
36  __asm__ volatile( "prefetcht0 192(%0) \n\t" : :"r"( c ) );
37  __asm__ volatile( "prefetcht0 384(%0) \n\t" : :"r"( c ) );
38  __asm__ volatile( "prefetcht0 576(%0) \n\t" : :"r"( c ) );
39  __asm__ volatile( "prefetcht0 768(%0) \n\t" : :"r"( c ) );
40  __asm__ volatile( "prefetcht0 960(%0) \n\t" : :"r"( c ) );
41  __asm__ volatile( "prefetcht0 1152(%0) \n\t" : :"r"( c ) );
42  __asm__ volatile( "prefetcht0 1344(%0) \n\t" : :"r"( c ) );
43 
44  #include "rank_k_int_d24x8.segment"
45 
46 #ifdef DEBUG_MICRO
47  printf( "%lf, %lf, %lf, %lf\n", c07_0.d[0], c07_1.d[0], c07_2.d[0], c07_3.d[0], c07_4.d[0], c07_5.d[0], c07_6.d[0], c07_7.d[0] );
48  printf( "%lf, %lf, %lf, %lf\n", c07_0.d[1], c07_1.d[1], c07_2.d[1], c07_3.d[1], c07_4.d[1], c07_5.d[1], c07_6.d[1], c07_7.d[1] );
49  printf( "%lf, %lf, %lf, %lf\n", c07_0.d[2], c07_1.d[2], c07_2.d[2], c07_3.d[2], c07_4.d[2], c07_5.d[2], c07_6.d[2], c07_7.d[2] );
50  printf( "%lf, %lf, %lf, %lf\n", c07_0.d[3], c07_1.d[3], c07_2.d[3], c07_3.d[3], c07_4.d[3], c07_5.d[3], c07_6.d[3], c07_7.d[3] );
51  printf( "%lf, %lf, %lf, %lf\n", c07_0.d[4], c07_1.d[4], c07_2.d[4], c07_3.d[4], c07_4.d[4], c07_5.d[4], c07_6.d[4], c07_7.d[4] );
52  printf( "%lf, %lf, %lf, %lf\n", c07_0.d[5], c07_1.d[5], c07_2.d[5], c07_3.d[5], c07_4.d[5], c07_5.d[5], c07_6.d[5], c07_7.d[5] );
53  printf( "%lf, %lf, %lf, %lf\n", c07_0.d[6], c07_1.d[6], c07_2.d[6], c07_3.d[6], c07_4.d[6], c07_5.d[6], c07_6.d[6], c07_7.d[6] );
54  printf( "%lf, %lf, %lf, %lf\n", c07_0.d[7], c07_1.d[7], c07_2.d[7], c07_3.d[7], c07_4.d[7], c07_5.d[7], c07_6.d[7], c07_7.d[7] );
55 #endif
56 
57  _mm512_store_pd( c + 0 , c07_0.v );
58  _mm512_store_pd( c + 8 , c15_0.v );
59  _mm512_store_pd( c + 16 , c23_0.v );
60 
61  c += ldc;
62 
63  _mm512_store_pd( c + 0 , c07_1.v );
64  _mm512_store_pd( c + 8 , c15_1.v );
65  _mm512_store_pd( c + 16 , c23_1.v );
66 
67  c += ldc;
68 
69  _mm512_store_pd( c + 0 , c07_2.v );
70  _mm512_store_pd( c + 8 , c15_2.v );
71  _mm512_store_pd( c + 16 , c23_2.v );
72 
73  c += ldc;
74 
75  _mm512_store_pd( c + 0 , c07_3.v );
76  _mm512_store_pd( c + 8 , c15_3.v );
77  _mm512_store_pd( c + 16 , c23_3.v );
78 
79  c += ldc;
80 
81  _mm512_store_pd( c + 0 , c07_4.v );
82  _mm512_store_pd( c + 8 , c15_4.v );
83  _mm512_store_pd( c + 16 , c23_4.v );
84 
85  c += ldc;
86 
87  _mm512_store_pd( c + 0 , c07_5.v );
88  _mm512_store_pd( c + 8 , c15_5.v );
89  _mm512_store_pd( c + 16 , c23_5.v );
90 
91  c += ldc;
92 
93  _mm512_store_pd( c + 0 , c07_6.v );
94  _mm512_store_pd( c + 8 , c15_6.v );
95  _mm512_store_pd( c + 16 , c23_6.v );
96 
97  c += ldc;
98 
99  _mm512_store_pd( c + 0 , c07_7.v );
100  _mm512_store_pd( c + 8 , c15_7.v );
101  _mm512_store_pd( c + 16 , c23_7.v );
102 
103  //printf( "ldc = %d\n", ldc );
104  //printf( "%lf, %lf, %lf, %lf\n", c[0], c[ ldc + 0], c[ ldc * 2 + 0], c[ ldc * 3 + 0] );
105  //printf( "%lf, %lf, %lf, %lf\n", c[1], c[ ldc + 1], c[ ldc * 2 + 1], c[ ldc * 3 + 1] );
106  //printf( "%lf, %lf, %lf, %lf\n", c[2], c[ ldc + 2], c[ ldc * 2 + 2], c[ ldc * 3 + 2] );
107  //printf( "%lf, %lf, %lf, %lf\n", c[3], c[ ldc + 3], c[ ldc * 2 + 3], c[ ldc * 3 + 3] );
108  //printf( "%lf, %lf, %lf, %lf\n", c[4], c[ ldc + 4], c[ ldc * 2 + 4], c[ ldc * 3 + 4] );
109  //printf( "%lf, %lf, %lf, %lf\n", c[5], c[ ldc + 5], c[ ldc * 2 + 5], c[ ldc * 3 + 5] );
110  //printf( "%lf, %lf, %lf, %lf\n", c[6], c[ ldc + 6], c[ ldc * 2 + 6], c[ ldc * 3 + 6] );
111  //printf( "%lf, %lf, %lf, %lf\n", c[7], c[ ldc + 7], c[ ldc * 2 + 7], c[ ldc * 3 + 7] );
112  }
113 };
Definition: hmlp_internal.hpp:38
Definition: avx_type.h:4
Definition: rank_k_int_d24x8.hpp:9