1
1
#include " ../Benchmark.hpp"
2
2
#include " ../Fixtures.hpp"
3
+ #include " ../Input.hpp"
3
4
4
5
#include < Mathter/Matrix.hpp>
5
6
#include < Mathter/Transforms/RandomBuilder.hpp>
@@ -11,43 +12,46 @@ using namespace mathter;
11
12
12
13
namespace {
13
14
14
- template <class Mat , int Count>
15
- std::array<Mat, Count> MakeInput () {
16
- using Scalar = scalar_type_t <Mat>;
17
- using Real = remove_complex_t <Scalar>;
18
- using namespace std ::complex_literals;
19
-
20
- std::mt19937_64 rne;
21
- std::uniform_real_distribution<Real> rng (Real (-0.5 ), Real (0.5 ));
22
-
23
- std::array<Mat, Count> r;
24
- for (auto & v : r) {
25
- if constexpr (is_complex_v<Scalar>) {
26
- const Mat real = Random (rng, rne);
27
- const Mat imag = Random (rng, rne);
28
- v = real + Scalar (1if) * imag;
15
+ static constexpr auto benchmarkCaseLayout_r = eMatrixLayout::ROW_MAJOR;
16
+ static constexpr auto benchmarkCaseLayout_c = eMatrixLayout::COLUMN_MAJOR;
17
+
18
+ static constexpr auto benchmarkCaseOrder_f = eMatrixOrder::FOLLOW_VECTOR;
19
+ static constexpr auto benchmarkCaseOrder_p = eMatrixOrder::PRECEDE_VECTOR;
20
+
21
+
22
+ struct MulVecOp {
23
+ template <class Vec , class Mat >
24
+ auto operator ()(const Vec& v, const Mat& m) const {
25
+ if constexpr (order_v<Mat> == eMatrixOrder::FOLLOW_VECTOR) {
26
+ return v * m;
29
27
}
30
28
else {
31
- v = Random (rng, rne) ;
29
+ return m * v ;
32
30
}
33
31
}
34
- return r;
35
32
};
36
33
37
34
38
- static constexpr auto benchmarkCaseLayout_r = eMatrixLayout::ROW_MAJOR;
39
- static constexpr auto benchmarkCaseLayout_c = eMatrixLayout::COLUMN_MAJOR;
35
+ #define MATRIX_BINOP_BENCHMARK_CASE (TYPE, ROWS, MATCH, COLS, LAYOUT_L, LAYOUT_R, PACKED, OP, OPTEXT ) \
36
+ BENCHMARK_CASE (#TYPE " ." #ROWS #MATCH #LAYOUT_L " " OPTEXT " " #TYPE " ." #MATCH #COLS #LAYOUT_R " (P=" #PACKED " )" , \
37
+ " [Matrix][Arithmetic]" , \
38
+ 50 , \
39
+ 64 , \
40
+ GenericNAryFixture{ OP{} }, \
41
+ MakeRandomInput<Matrix<TYPE, ROWS, MATCH, eMatrixOrder::FOLLOW_VECTOR, benchmarkCaseLayout_##LAYOUT_L, PACKED>, 1 >()[0 ], \
42
+ MakeRandomInput<Matrix<TYPE, ROWS, MATCH, eMatrixOrder::FOLLOW_VECTOR, benchmarkCaseLayout_##LAYOUT_L, PACKED>, 4 >(), \
43
+ MakeRandomInput<Matrix<TYPE, MATCH, COLS, eMatrixOrder::FOLLOW_VECTOR, benchmarkCaseLayout_##LAYOUT_R, PACKED>, 64 >());
40
44
41
45
42
- #define MATRIX_BINOP_BENCHMARK_CASE (TYPE, ROWS, MATCH, COLS, LAYOUT_L, LAYOUT_R , PACKED, OP, OPTEXT ) \
43
- BENCHMARK_CASE (#TYPE " ." #ROWS #MATCH #LAYOUT_L " " OPTEXT " " #TYPE " ." #MATCH #COLS #LAYOUT_R " (P=" #PACKED " )" , \
44
- " [Matrix][Arithmetic]" , \
45
- 50 , \
46
- 64 , \
47
- GenericBinaryFixture { OP{} }, \
48
- MakeInput<Matrix <TYPE, ROWS, MATCH, eMatrixOrder::FOLLOW_VECTOR, benchmarkCaseLayout_##LAYOUT_L, PACKED>, 1 >()[0 ], \
49
- MakeInput<Matrix <TYPE, ROWS, MATCH, eMatrixOrder::FOLLOW_VECTOR, benchmarkCaseLayout_##LAYOUT_L, PACKED>, 4 >(), \
50
- MakeInput <Matrix<TYPE, MATCH , COLS, eMatrixOrder::FOLLOW_VECTOR , benchmarkCaseLayout_##LAYOUT_R , PACKED>, 64 >());
46
+ #define MATRIX_BINOP_VEC_CASE (TYPE, ROWS, COLS, ORDER, LAYOUT , PACKED, DIM, OP, OPTEXT ) \
47
+ BENCHMARK_CASE (#TYPE " ." #ROWS #COLS #ORDER #LAYOUT " " OPTEXT " " #TYPE " ." #DIM " (P=" #PACKED " )" , \
48
+ " [Matrix][Arithmetic]" , \
49
+ 50 , \
50
+ 64 , \
51
+ GenericNAryFixture { OP{} }, \
52
+ MakeRandomInput<Vector <TYPE, DIM, PACKED>, 1 >()[0 ], \
53
+ MakeRandomInput<Vector <TYPE, DIM, PACKED>, 4 >(), \
54
+ MakeRandomInput <Matrix<TYPE, ROWS , COLS, benchmarkCaseOrder_##ORDER , benchmarkCaseLayout_##LAYOUT , PACKED>, 64 >());
51
55
52
56
53
57
MATRIX_BINOP_BENCHMARK_CASE (float , 2 , 2 , 2 , r, r, false , std::multiplies<>, " *" );
@@ -107,4 +111,45 @@ MATRIX_BINOP_BENCHMARK_CASE(double, 3, 3, 3, c, c, true, std::divides<>, "/");
107
111
MATRIX_BINOP_BENCHMARK_CASE (double , 4 , 4 , 4 , c, c, true , std::divides<>, " /" );
108
112
109
113
114
+ MATRIX_BINOP_VEC_CASE (float , 2 , 2 , f, r, false , 2 , MulVecOp, " *" );
115
+ MATRIX_BINOP_VEC_CASE (float , 3 , 3 , f, r, false , 3 , MulVecOp, " *" );
116
+ MATRIX_BINOP_VEC_CASE (float , 4 , 4 , f, r, false , 4 , MulVecOp, " *" );
117
+ MATRIX_BINOP_VEC_CASE (float , 4 , 4 , f, r, false , 3 , MulVecOp, " *" );
118
+
119
+ MATRIX_BINOP_VEC_CASE (float , 2 , 2 , f, c, false , 2 , MulVecOp, " *" );
120
+ MATRIX_BINOP_VEC_CASE (float , 3 , 3 , f, c, false , 3 , MulVecOp, " *" );
121
+ MATRIX_BINOP_VEC_CASE (float , 4 , 4 , f, c, false , 4 , MulVecOp, " *" );
122
+ MATRIX_BINOP_VEC_CASE (float , 4 , 4 , f, c, false , 3 , MulVecOp, " *" );
123
+
124
+ MATRIX_BINOP_VEC_CASE (float , 2 , 2 , p, r, false , 2 , MulVecOp, " *" );
125
+ MATRIX_BINOP_VEC_CASE (float , 3 , 3 , p, r, false , 3 , MulVecOp, " *" );
126
+ MATRIX_BINOP_VEC_CASE (float , 4 , 4 , p, r, false , 4 , MulVecOp, " *" );
127
+ MATRIX_BINOP_VEC_CASE (float , 4 , 4 , p, r, false , 3 , MulVecOp, " *" );
128
+
129
+ MATRIX_BINOP_VEC_CASE (float , 2 , 2 , p, c, false , 2 , MulVecOp, " *" );
130
+ MATRIX_BINOP_VEC_CASE (float , 3 , 3 , p, c, false , 3 , MulVecOp, " *" );
131
+ MATRIX_BINOP_VEC_CASE (float , 4 , 4 , p, c, false , 4 , MulVecOp, " *" );
132
+ MATRIX_BINOP_VEC_CASE (float , 4 , 4 , p, c, false , 3 , MulVecOp, " *" );
133
+
134
+ MATRIX_BINOP_VEC_CASE (double , 2 , 2 , f, r, false , 2 , MulVecOp, " *" );
135
+ MATRIX_BINOP_VEC_CASE (double , 3 , 3 , f, r, false , 3 , MulVecOp, " *" );
136
+ MATRIX_BINOP_VEC_CASE (double , 4 , 4 , f, r, false , 4 , MulVecOp, " *" );
137
+ MATRIX_BINOP_VEC_CASE (double , 4 , 4 , f, r, false , 3 , MulVecOp, " *" );
138
+
139
+ MATRIX_BINOP_VEC_CASE (double , 2 , 2 , f, c, false , 2 , MulVecOp, " *" );
140
+ MATRIX_BINOP_VEC_CASE (double , 3 , 3 , f, c, false , 3 , MulVecOp, " *" );
141
+ MATRIX_BINOP_VEC_CASE (double , 4 , 4 , f, c, false , 4 , MulVecOp, " *" );
142
+ MATRIX_BINOP_VEC_CASE (double , 4 , 4 , f, c, false , 3 , MulVecOp, " *" );
143
+
144
+ MATRIX_BINOP_VEC_CASE (double , 2 , 2 , p, r, false , 2 , MulVecOp, " *" );
145
+ MATRIX_BINOP_VEC_CASE (double , 3 , 3 , p, r, false , 3 , MulVecOp, " *" );
146
+ MATRIX_BINOP_VEC_CASE (double , 4 , 4 , p, r, false , 4 , MulVecOp, " *" );
147
+ MATRIX_BINOP_VEC_CASE (double , 4 , 4 , p, r, false , 3 , MulVecOp, " *" );
148
+
149
+ MATRIX_BINOP_VEC_CASE (double , 2 , 2 , p, c, false , 2 , MulVecOp, " *" );
150
+ MATRIX_BINOP_VEC_CASE (double , 3 , 3 , p, c, false , 3 , MulVecOp, " *" );
151
+ MATRIX_BINOP_VEC_CASE (double , 4 , 4 , p, c, false , 4 , MulVecOp, " *" );
152
+ MATRIX_BINOP_VEC_CASE (double , 4 , 4 , p, c, false , 3 , MulVecOp, " *" );
153
+
154
+
110
155
} // namespace
0 commit comments