Line data Source code
1 : ///////////////////////////////////////////////////////////////////////////
2 : // Inastemp - Berenger Bramas MPCDF - 2016
3 : // Under MIT Licence, please you must read the LICENCE file.
4 : ///////////////////////////////////////////////////////////////////////////
5 : #ifndef FLOPSTESTALL_HPP
6 : #define FLOPSTESTALL_HPP
7 :
8 : #include "InastempGlobal.h"
9 : #include "UTester.hpp"
10 :
11 : #include <cmath>
12 : #include <cstring>
13 :
14 : template < class VecType >
15 49 : class FlopsTestAll : public UTester< FlopsTestAll< VecType > > {
16 : using Parent = UTester< FlopsTestAll< VecType > >;
17 :
18 : using RealType = typename VecType::RealType;
19 : using MaskType = typename VecType::MaskType;
20 :
21 14 : void TestBasic() {
22 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getMulOp() , size_t(VecType::GetVecLength()) * size_t(0));
23 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getDivOp() , size_t(VecType::GetVecLength()) * size_t(0));
24 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getAddOp() , size_t(VecType::GetVecLength()) * size_t(0));
25 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSubOp() , size_t(VecType::GetVecLength()) * size_t(0));
26 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getRsqrt() , size_t(VecType::GetVecLength()) * size_t(0));
27 98 : UASSERTEEQUAL(VecType::GetFlopsStats().getSqrt() , size_t(VecType::GetVecLength()) * size_t(0));
28 :
29 :
30 14 : VecType a = 1;
31 : {
32 14 : VecType res = a + a;
33 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getMulOp() , size_t(VecType::GetVecLength()) * size_t(0));
34 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getDivOp() , size_t(VecType::GetVecLength()) * size_t(0));
35 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getAddOp() , size_t(VecType::GetVecLength()) * size_t(1));
36 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSubOp() , size_t(VecType::GetVecLength()) * size_t(0));
37 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getRsqrt() , size_t(VecType::GetVecLength()) * size_t(0));
38 98 : UASSERTEEQUAL(VecType::GetFlopsStats().getSqrt() , size_t(VecType::GetVecLength()) * size_t(0));
39 :
40 14 : res += a;
41 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getMulOp() , size_t(VecType::GetVecLength()) * size_t(0));
42 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getDivOp() , size_t(VecType::GetVecLength()) * size_t(0));
43 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getAddOp() , size_t(VecType::GetVecLength()) * size_t(2));
44 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSubOp() , size_t(VecType::GetVecLength()) * size_t(0));
45 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getRsqrt() , size_t(VecType::GetVecLength()) * size_t(0));
46 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSqrt() , size_t(VecType::GetVecLength()) * size_t(0));
47 : }
48 :
49 14 : VecType::ResetFlopsStats();
50 : {
51 14 : VecType res = a * a;
52 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getMulOp() , size_t(VecType::GetVecLength()) * size_t(1));
53 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getDivOp() , size_t(VecType::GetVecLength()) * size_t(0));
54 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getAddOp() , size_t(VecType::GetVecLength()) * size_t(0));
55 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSubOp() , size_t(VecType::GetVecLength()) * size_t(0));
56 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getRsqrt() , size_t(VecType::GetVecLength()) * size_t(0));
57 98 : UASSERTEEQUAL(VecType::GetFlopsStats().getSqrt() , size_t(VecType::GetVecLength()) * size_t(0));
58 :
59 14 : res *= a;
60 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getMulOp() , size_t(VecType::GetVecLength()) * size_t(2));
61 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getDivOp() , size_t(VecType::GetVecLength()) * size_t(0));
62 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getAddOp() , size_t(VecType::GetVecLength()) * size_t(0));
63 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSubOp() , size_t(VecType::GetVecLength()) * size_t(0));
64 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getRsqrt() , size_t(VecType::GetVecLength()) * size_t(0));
65 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSqrt() , size_t(VecType::GetVecLength()) * size_t(0));
66 : }
67 :
68 14 : VecType::ResetFlopsStats();
69 : {
70 14 : VecType res = a / a;
71 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getMulOp() , size_t(VecType::GetVecLength()) * size_t(0));
72 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getDivOp() , size_t(VecType::GetVecLength()) * size_t(1));
73 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getAddOp() , size_t(VecType::GetVecLength()) * size_t(0));
74 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSubOp() , size_t(VecType::GetVecLength()) * size_t(0));
75 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getRsqrt() , size_t(VecType::GetVecLength()) * size_t(0));
76 98 : UASSERTEEQUAL(VecType::GetFlopsStats().getSqrt() , size_t(VecType::GetVecLength()) * size_t(0));
77 :
78 14 : res /= a;
79 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getMulOp() , size_t(VecType::GetVecLength()) * size_t(0));
80 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getDivOp() , size_t(VecType::GetVecLength()) * size_t(2));
81 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getAddOp() , size_t(VecType::GetVecLength()) * size_t(0));
82 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSubOp() , size_t(VecType::GetVecLength()) * size_t(0));
83 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getRsqrt() , size_t(VecType::GetVecLength()) * size_t(0));
84 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSqrt() , size_t(VecType::GetVecLength()) * size_t(0));
85 : }
86 :
87 14 : VecType::ResetFlopsStats();
88 : {
89 14 : VecType res = a - a;
90 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getMulOp() , size_t(VecType::GetVecLength()) * size_t(0));
91 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getDivOp() , size_t(VecType::GetVecLength()) * size_t(0));
92 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getAddOp() , size_t(VecType::GetVecLength()) * size_t(0));
93 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSubOp() , size_t(VecType::GetVecLength()) * size_t(1));
94 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getRsqrt() , size_t(VecType::GetVecLength()) * size_t(0));
95 98 : UASSERTEEQUAL(VecType::GetFlopsStats().getSqrt() , size_t(VecType::GetVecLength()) * size_t(0));
96 :
97 14 : res -= a;
98 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getMulOp() , size_t(VecType::GetVecLength()) * size_t(0));
99 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getDivOp() , size_t(VecType::GetVecLength()) * size_t(0));
100 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getAddOp() , size_t(VecType::GetVecLength()) * size_t(0));
101 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSubOp() , size_t(VecType::GetVecLength()) * size_t(2));
102 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getRsqrt() , size_t(VecType::GetVecLength()) * size_t(0));
103 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSqrt() , size_t(VecType::GetVecLength()) * size_t(0));
104 : }
105 :
106 :
107 14 : VecType::ResetFlopsStats();
108 : {
109 112 : VecType res = (a*a) + (a/a) - (a+a) * (a-a) / a;
110 :
111 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getMulOp() , size_t(VecType::GetVecLength()) * size_t(2));
112 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getDivOp() , size_t(VecType::GetVecLength()) * size_t(2));
113 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getAddOp() , size_t(VecType::GetVecLength()) * size_t(2));
114 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSubOp() , size_t(VecType::GetVecLength()) * size_t(2));
115 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getRsqrt() , size_t(VecType::GetVecLength()) * size_t(0));
116 98 : UASSERTEEQUAL(VecType::GetFlopsStats().getSqrt() , size_t(VecType::GetVecLength()) * size_t(0));
117 :
118 14 : res = VecType(0.);
119 :
120 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getMulOp() , size_t(VecType::GetVecLength()) * size_t(2));
121 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getDivOp() , size_t(VecType::GetVecLength()) * size_t(2));
122 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getAddOp() , size_t(VecType::GetVecLength()) * size_t(2));
123 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSubOp() , size_t(VecType::GetVecLength()) * size_t(2));
124 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getRsqrt() , size_t(VecType::GetVecLength()) * size_t(0));
125 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSqrt() , size_t(VecType::GetVecLength()) * size_t(0));
126 : }
127 :
128 14 : VecType::ResetFlopsStats();
129 : {
130 70 : VecType res = VecType::Fma(VecType(1),VecType(1),VecType(1));
131 :
132 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getMulOp() , size_t(VecType::GetVecLength()));
133 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getDivOp() , size_t(0));
134 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getAddOp() , size_t(VecType::GetVecLength()));
135 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSubOp() , size_t(0));
136 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getRsqrt() , size_t(0));
137 98 : UASSERTEEQUAL(VecType::GetFlopsStats().getSqrt() , size_t(0));
138 :
139 28 : res = VecType::Fma(res, res, res);
140 :
141 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getMulOp() , size_t(2 * VecType::GetVecLength()));
142 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getDivOp() , size_t(0));
143 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getAddOp() , size_t(2 * VecType::GetVecLength()));
144 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSubOp() , size_t(0));
145 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getRsqrt() , size_t(0));
146 84 : UASSERTEEQUAL(VecType::GetFlopsStats().getSqrt() , size_t(0));
147 : }
148 14 : }
149 :
150 14 : void SetTests() {
151 42 : Parent::AddTest(&FlopsTestAll::TestBasic, "Basic test for vec type");
152 14 : }
153 : };
154 :
155 : #endif
|