1 #ifndef SEMIRING_MRXNR_HPP 2 #define SEMIRING_MRXNR_HPP 4 #include <hmlp_internal.hpp> 9 typename OP1,
typename OP2,
10 typename TA,
typename TB,
typename TC,
typename TV>
13 const static size_t mr = MR;
14 const static size_t nr = NR;
15 const static size_t pack_mr = MR;
16 const static size_t pack_nr = NR;
17 const static size_t align_size = 32;
24 inline void operator()
30 TV **v_list,
int ldv, TV *alpha_list,
34 TV regV[ MR * NR ] = { 0.0 };
37 for (
int p = 0; p < k; p ++ )
40 for (
int j = 0; j < NR; j ++ )
42 for (
int i = 0; i < MR; i ++ )
43 regV[ j * MR + i ] += a[ p * MR + i ] * b[ p * NR + j ];
47 for (
int t = 0; t < len; t ++ )
50 for (
int j = 0; j < NR; j ++ )
53 for (
int i = 0; i < MR; i ++ )
55 v_list[ t ][ j * ldv + i ] += alpha_list[ t ] * regV[ j * MR + i ];
62 inline void operator()
67 TV *v,
int rs_c,
int cs_c,
76 for (
int j = 0; j < NR; j ++ )
78 for (
int i = 0; i < MR; i ++ )
79 regV[ j * MR + i ] = initV;
84 for (
int j = 0; j < NR; j ++ )
86 for (
int i = 0; i < MR; i ++ )
87 regV[ j * MR + i ] = v[ j * cs_c + i * rs_c ];
91 for (
int p = 0; p < k; p ++ )
94 for (
int j = 0; j < NR; j ++ )
96 for (
int i = 0; i < MR; i ++ )
98 op1( regV[ j * MR + i ], op2( a[ p * MR + i ], b[ p * NR + j ] ) );
104 for (
int j = 0; j < NR; j ++ )
106 for (
int i = 0; i < MR; i ++ )
107 v[ j * cs_c + i * rs_c ] = regV[ j * MR + i ];
Definition: semiring_mrxnr.hpp:11
Definition: hmlp_internal.hpp:38