Developer Documentation
Loading...
Searching...
No Matches
VectorT.cpp
1/*
2 * VectorT.cpp
3 *
4 * Created on: Nov 19, 2015
5 * Author: ebke
6 */
7
8#ifndef BMPOSTFIX
9#error "Do not compile directly."
10#endif
11
12#include <type_traits>
13
14#define ASSEMBLE_(POSTFIX, PREFIX) PREFIX ## POSTFIX
15#define ASSEMBLE(POSTFIX, PREFIX) ASSEMBLE_(POSTFIX, PREFIX)
16#define MYBENCHMARK(NAME) BENCHMARK(NAME)
17#define MYBENCHMARK_TEMPLATE(NAME, TYPE) BENCHMARK_TEMPLATE(NAME, TYPE)
18
19template<class Vec>
20static inline
21typename std::enable_if<Vec::size_ == 3, Vec>::type
22testVec() {
23 return Vec(1.1, 1.2, 1.3);
24}
25
26template<class Vec>
27static inline
28typename std::enable_if<Vec::size_ == 4, Vec>::type
29testVec() {
30 return Vec(1.1, 1.2, 1.3, 1.4);
31}
32
33template<class Vec>
34static void ASSEMBLE(BMPOSTFIX, Vec_add_compare)(benchmark::State& state) {
35 Vec v1(0.0);
36 Vec v2(1000.0);
37 while (state.KeepRunning()) {
38 v1 += testVec<Vec>();
39 v2 -= testVec<Vec>();
40 if (v1 == v2) {
41 v1 -= v2;
42 v2 += v1;
43 }
44 }
45 // Just so nothing gets optimized away.
46 static double dummy;
47 dummy = v1.norm() + v2.norm();
48 static_cast<void>(dummy);
49}
50
51MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_add_compare), OpenMesh::Vec3d);
52MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_add_compare), OpenMesh::Vec3f);
53MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_add_compare), OpenMesh::Vec4d);
54MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_add_compare), OpenMesh::Vec4f);
55
56template<class Vec>
57static void ASSEMBLE(BMPOSTFIX, Vec_cross_product)(benchmark::State& state) {
58 Vec v1(0.0);
59 Vec v2(1000.0);
60 while (state.KeepRunning()) {
61 v1 += testVec<Vec>();
62 v2 -= testVec<Vec>();
63 v1 = (v1 % v2);
64 }
65 // Just so nothing gets optimized away.
66 static double dummy;
67 dummy = v1.norm() + v2.norm();
68 static_cast<void>(dummy);
69}
70
71MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_cross_product), OpenMesh::Vec3d);
72MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_cross_product), OpenMesh::Vec3f);
73
74template<class Vec>
75static void ASSEMBLE(BMPOSTFIX, Vec_scalar_product)(benchmark::State& state) {
76 Vec v1(0.0);
77 Vec v2(1000.0);
78 double acc = 0;
79 while (state.KeepRunning()) {
80 v1 += testVec<Vec>();
81 v2 -= testVec<Vec>();
82 acc += (v1 | v2);
83 }
84 // Otherwise GCC will optimize everything away.
85 static double dummy;
86 dummy = acc;
87 static_cast<void>(dummy);
88}
89
90MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_scalar_product), OpenMesh::Vec3d);
91MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_scalar_product), OpenMesh::Vec3f);
92MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_scalar_product), OpenMesh::Vec4d);
93MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_scalar_product), OpenMesh::Vec4f);
94
95template<class Vec>
96static void ASSEMBLE(BMPOSTFIX, Vec_norm)(benchmark::State& state) {
97 Vec v1(0.0);
98 double acc = 0;
99 while (state.KeepRunning()) {
100 v1 += testVec<Vec>();
101 acc += v1.norm();
102 }
103 // Otherwise GCC will optimize everything away.
104 static double dummy;
105 dummy = acc;
106 static_cast<void>(dummy);
107}
108
109MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_norm), OpenMesh::Vec3d);
110MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_norm), OpenMesh::Vec3f);
111MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_norm), OpenMesh::Vec4d);
112MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_norm), OpenMesh::Vec4f);
113
114template<class Vec>
115static void ASSEMBLE(BMPOSTFIX, Vec_times_scalar)(benchmark::State& state) {
116 Vec v1(0.0);
117 while (state.KeepRunning()) {
118 v1 += testVec<Vec>();
119 v1 *= static_cast<decltype(v1.norm())>(1.0)/v1[0];
120 v1 *= v1[1];
121 }
122 // Otherwise GCC will optimize everything away.
123 static double dummy;
124 dummy = v1.norm();
125 static_cast<void>(dummy);
126}
127
128MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_times_scalar), OpenMesh::Vec3d);
129MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_times_scalar), OpenMesh::Vec3f);
130MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_times_scalar), OpenMesh::Vec4d);
131MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_times_scalar), OpenMesh::Vec4f);
132
133#include "VectorT_dummy_data.hpp"
134
135template<class Vec>
136static void ASSEMBLE(BMPOSTFIX, Vec_add_in_place)(benchmark::State& state) {
137 auto v = make_dummy_vector<Vec>();
138 while (state.KeepRunning()) {
139 v += v;
140 }
141 // Otherwise GCC will optimize everything away.
142 static double dummy = observe_dummy_vector(v);
143 static_cast<void>(dummy);
144}
145
146template<class Vec>
147static void ASSEMBLE(BMPOSTFIX, Vec_add_temporary)(benchmark::State& state) {
148 auto v = make_dummy_vector<Vec>();
149 while (state.KeepRunning()) {
150 v = v + v;
151 }
152 // Otherwise GCC will optimize everything away.
153 static double dummy = observe_dummy_vector(v);
154 static_cast<void>(dummy);
155}
156
159
160MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_add_in_place), Vec3VAd);
161MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_add_temporary), Vec3VAd);
162MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_add_in_place), Vec3Cd);
163MYBENCHMARK_TEMPLATE (ASSEMBLE(BMPOSTFIX, Vec_add_temporary), Vec3Cd);