-
Notifications
You must be signed in to change notification settings - Fork 3
/
Macros.hpp
177 lines (158 loc) · 7.56 KB
/
Macros.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
/* Copyright(C) ga-developers
*
* Repository: https://github.com/ga-developers/ga-benchmark.git
*
* This file is part of the GA-Benchmark project.
*
* GA-Benchmark is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GA-Benchmark is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GA-Benchmark. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __GABM_MACROS_HPP__
#define __GABM_MACROS_HPP__
#if defined(__GNUC__)
#define GABM_INLINE inline
#define GABM_ALWAYS_INLINE __attribute__((always_inline)) inline
#elif defined(_MSC_VER) && !defined(__clang__)
#define GABM_INLINE inline
#define GABM_ALWAYS_INLINE __forceinline
#else
#define GABM_INLINE inline
#define GABM_ALWAYS_INLINE inline
#endif
#define ConformalModel 0x01
#define EuclideanModel 0x02
#define HomogeneousModel 0x03
#define MinkowskiModel 0x04
#define GABM_CHECK_MODEL(MODEL) (MODEL == GABM_MODEL)
#define AlgorithmInverseKinematics 0x11
#define BinaryOperations 0x12
#define UnaryOperations 0x13
#define GABM_CHECK_OPERATION(OPERATION) (OPERATION == GABM_OPERATION)
#if GABM_CHECK_MODEL(ConformalModel)
#define GABM_N_DIMENSIONS ((GABM_D_DIMENSIONS) + 2)
#elif GABM_CHECK_MODEL(EuclideanModel)
#define GABM_N_DIMENSIONS (GABM_D_DIMENSIONS)
#elif GABM_CHECK_MODEL(HomogeneousModel)
#define GABM_N_DIMENSIONS ((GABM_D_DIMENSIONS) + 1)
#elif GABM_CHECK_MODEL(MinkowskiModel)
#define GABM_N_DIMENSIONS ((GABM_D_DIMENSIONS) + 2)
#else
#error The value assumed by GABM_MODEL is invalid.
#endif
#define GABM_ITERATIONS 10000
#define GABM_REPETITIONS 30
#define GABM_ZERO_TOLERANCE 1.0e-8
#define GABM_CAPTURE(FUNC, SYSTEM_NAME, SYSTEM_VERSION, COMPILER_ID, COMPILER_VERSION, SOLUTION, MODEL, D_DIMENSIONS, CASE) \
BENCHMARK_CAPTURE(FUNC, SystemName:SYSTEM_NAME/SystemVersion:SYSTEM_VERSION/CompilerID:COMPILER_ID/CompilerVersion:COMPILER_VERSION/Solution:SOLUTION/Model:MODEL/D:D_DIMENSIONS/CASE, "") \
->Unit(benchmark::kMillisecond) \
->Iterations(GABM_ITERATIONS) \
->Repetitions(GABM_REPETITIONS) \
->ReportAggregatesOnly(true) \
->DisplayAggregatesOnly(true);
#define GABM_ASSERT_OPERATION_DEFINITION(GROUP, OPERATION) \
static_assert(GABM_##GROUP##_##OPERATION##_Defined, "Use GABM_DEFINE_<GROUP-NAME>[_<OPERATION-NAME>], GABM_REPORT_<OPERATION-GROUP-NAME>_[OPERATION-NAME_]IS_NOT_IMPLEMENTED, or GABM_REPORT_<OPERATION-GROUP-NAME>_[OPERATION-NAME_]LEADS_TO_COMPILATION_ERROR to define the missing operation.");
#define GABM_DEFINE_RANDOM_ARGUMENTS_FOR_OPERATION(GROUP, OPERATION, ...) \
auto const GABM_##GROUP##_##OPERATION##_RandomArguments = gabm::WrapRandomArguments(__VA_ARGS__);
#define GABM_DEFINE_OPERATION(GROUP, OPERATION, CASE, ...) \
constexpr static bool GABM_##GROUP##_##OPERATION##_Defined = true; \
\
template<typename... Types> \
GABM_INLINE decltype(auto) GABM_##GROUP##_##OPERATION##_Impl(std::tuple<Types...> const &); \
\
template<typename... ExtraArgsType> \
void GABM_##GROUP##_##OPERATION(benchmark::State &state, ExtraArgsType &&...) try { \
std::size_t ind = 0; \
while (state.KeepRunning()) { \
benchmark::DoNotOptimize(GABM_##GROUP##_##OPERATION##_Impl(GABM_##GROUP##_##OPERATION##_RandomArguments[ind])); \
++ind; \
} \
} \
catch (std::exception &error) { \
state.SkipWithError(("OPERATION_LEADS_TO_RUNTIME_ERROR (" + std::string(error.what()) + ")").c_str()); \
} \
catch (...) { \
state.SkipWithError("OPERATION_LEADS_TO_RUNTIME_ERROR"); \
} \
\
GABM_CAPTURE(GABM_##GROUP##_##OPERATION, GABM_SYSTEM_NAME, GABM_SYSTEM_VERSION, GABM_COMPILER_ID, GABM_COMPILER_VERSION, GABM_SOLUTION, GABM_MODEL, GABM_D_DIMENSIONS, CASE) \
\
template<typename... Types> \
GABM_ALWAYS_INLINE decltype(auto) GABM_##GROUP##_##OPERATION##_Impl(std::tuple<Types...> const &args) { \
auto const & [__VA_ARGS__] = args; \
return GABM_##GROUP##_##OPERATION##_Wrapper(__VA_ARGS__); \
}
#define GABM_REPORT_OPERATION_IS_NOT_IMPLEMENTED(GROUP, OPERATION, CASE) \
constexpr static bool GABM_##GROUP##_##OPERATION##_Defined = true; \
\
template<typename... ExtraArgsType> \
void GABM_##GROUP##_##OPERATION(benchmark::State &state, ExtraArgsType &&...) { \
state.SkipWithError("OPERATION_NOT_IMPLEMENTED"); \
} \
\
GABM_CAPTURE(GABM_##GROUP##_##OPERATION, GABM_SYSTEM_NAME, GABM_SYSTEM_VERSION, GABM_COMPILER_ID, GABM_COMPILER_VERSION, GABM_SOLUTION, GABM_MODEL, GABM_D_DIMENSIONS, CASE)
#define GABM_REPORT_OPERATION_LEADS_TO_COMPILATION_ERROR(GROUP, OPERATION, CASE) \
constexpr static bool GABM_##GROUP##_##OPERATION##_Defined = true; \
\
template<typename... ExtraArgsType> \
void GABM_##GROUP##_##OPERATION(benchmark::State &state, ExtraArgsType &&...) { \
state.SkipWithError("OPERATION_LEADS_TO_COMPILATION_ERROR"); \
} \
\
GABM_CAPTURE(GABM_##GROUP##_##OPERATION, GABM_SYSTEM_NAME, GABM_SYSTEM_VERSION, GABM_COMPILER_ID, GABM_COMPILER_VERSION, GABM_SOLUTION, GABM_MODEL, GABM_D_DIMENSIONS, CASE)
#define GABM_SKIP_OPERATION_WHEN_MODEL_IS_NOT_IMPLEMENTED(GROUP, OPERATION, CASE) \
constexpr static bool GABM_##GROUP##_##OPERATION##_Defined = true; \
\
template<typename... ExtraArgsType> \
void GABM_##GROUP##_##OPERATION(benchmark::State &state, ExtraArgsType &&...) { \
state.SkipWithError("MODEL_NOT_IMPLEMENTED"); \
} \
\
GABM_CAPTURE(GABM_##GROUP##_##OPERATION, GABM_SYSTEM_NAME, GABM_SYSTEM_VERSION, GABM_COMPILER_ID, GABM_COMPILER_VERSION, GABM_SOLUTION, GABM_MODEL, GABM_D_DIMENSIONS, CASE)
#define GABM_DECLARE_RANDOM_ANGLES(GLOBAL_VARIABLE) \
class GABM_##GLOBAL_VARIABLE##_Generator { \
public: \
static GABM_INLINE decltype(auto) MakeRandomEntry(std::default_random_engine &random_engine) { \
return gabm::MakeRandomAngle(random_engine); \
} \
}; \
\
gabm::RandomEntries<GABM_##GLOBAL_VARIABLE##_Generator> const GLOBAL_VARIABLE;
#define GABM_DECLARE_RANDOM_BLADES(GRADE, GLOBAL_VARIABLE) \
class GABM_##GLOBAL_VARIABLE##_Generator { \
public: \
static GABM_INLINE decltype(auto) MakeRandomEntry(std::default_random_engine &random_engine) { \
return gabm::MakeRandomBlade<GRADE>(random_engine); \
} \
}; \
\
gabm::RandomEntries<GABM_##GLOBAL_VARIABLE##_Generator> const GLOBAL_VARIABLE;
#define GABM_DECLARE_RANDOM_INVERTIBLE_BLADES(GRADE, GLOBAL_VARIABLE) \
class GABM_##GLOBAL_VARIABLE##_Generator { \
public: \
static GABM_INLINE decltype(auto) MakeRandomEntry(std::default_random_engine &random_engine) { \
return gabm::MakeRandomInvertibleBlade<GRADE>(random_engine); \
} \
}; \
\
gabm::RandomEntries<GABM_##GLOBAL_VARIABLE##_Generator> const GLOBAL_VARIABLE;
#define GABM_MAIN() \
int main(int argc, char **argv) { \
benchmark::Initialize(&argc, argv); \
if (benchmark::ReportUnrecognizedArguments(argc, argv)) { \
return EXIT_FAILURE; \
} \
gabm::InitializeRandomEntries(); \
benchmark::RunSpecifiedBenchmarks(); \
return EXIT_SUCCESS; \
}
#endif // __GABM_MACROS_HPP__