Skip to content

Commit b6d1d28

Browse files
authored
Trying to black box parameters properly for iai_callgrind. (#513)
1 parent 636add0 commit b6d1d28

File tree

2 files changed

+197
-90
lines changed

2 files changed

+197
-90
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ rand_xoshiro = "0.6"
5757
# Set a size_xx feature so that this crate compiles properly with --all-targets --all-features
5858
rkyv = { version = "0.7", default-features = false, features = ["size_32"] }
5959
serde_json = "1.0"
60-
iai = { version = "0.1" }
6160

6261
[target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies]
6362
criterion = { version = "0.5", features = ["html_reports"] }
63+
iai-callgrind = "0.11.0"
6464

6565
[target.'cfg(target_arch = "wasm32")'.dev-dependencies]
6666
wasm-bindgen-test = "0.3.0"

benches/iai.rs

Lines changed: 196 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,175 +1,282 @@
11
#![allow(clippy::all)]
2+
23
use core::hint::black_box;
3-
use iai;
4+
use iai_callgrind::{library_benchmark, library_benchmark_group, main};
45

56
use glam::{BVec3A, Mat2, Mat3A, Mat4, Quat, Vec2, Vec3A, Vec4};
67

8+
#[cfg(feature = "scalar-math")]
9+
use glam::BVec4 as BVec4A;
10+
11+
#[cfg(not(feature = "scalar-math"))]
12+
use glam::BVec4A;
13+
714
#[inline]
815
fn mat2() -> Mat2 {
9-
Mat2::from_cols_array(&[1.0, 2.0, 3.0, 4.0])
16+
black_box(Mat2::from_cols_array(&[1.0, 2.0, 3.0, 4.0]))
1017
}
1118

1219
#[inline]
1320
fn mat3a() -> Mat3A {
14-
Mat3A::from_cols_array(&[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0])
21+
black_box(Mat3A::from_cols_array(&[
22+
1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0,
23+
]))
1524
}
1625

1726
#[inline]
1827
fn mat4() -> Mat4 {
19-
Mat4::from_cols_array(&[
28+
black_box(Mat4::from_cols_array(&[
2029
1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0,
21-
])
30+
]))
2231
}
2332

2433
#[inline]
2534
fn quat() -> Quat {
26-
Quat::IDENTITY
35+
black_box(Quat::from_xyzw(0.0, 0.0, 0.0, 1.0))
2736
}
2837

2938
#[inline]
3039
fn vec2() -> Vec2 {
31-
Vec2::new(1.0, 2.0)
40+
black_box(Vec2::new(1.0, 2.0))
3241
}
3342

3443
#[inline]
3544
fn vec3a() -> Vec3A {
36-
Vec3A::new(1.0, 2.0, 3.0)
45+
black_box(Vec3A::new(1.0, 2.0, 3.0))
46+
}
47+
48+
#[inline]
49+
fn bvec3a() -> BVec3A {
50+
black_box(BVec3A::new(true, false, true))
3751
}
3852

3953
#[inline]
4054
fn vec4() -> Vec4 {
41-
Vec4::new(1.0, 2.0, 3.0, 4.0)
55+
black_box(Vec4::new(1.0, 2.0, 3.0, 4.0))
56+
}
57+
58+
#[inline]
59+
fn bvec4a() -> BVec4A {
60+
black_box(BVec4A::new(true, false, true, false))
61+
}
62+
63+
#[library_benchmark]
64+
#[bench::args(mat2())]
65+
fn mat2_determinant(m: Mat2) -> f32 {
66+
black_box(m.determinant())
4267
}
4368

44-
fn iai_bench_mat2_determinant() -> f32 {
45-
black_box(mat2()).determinant()
69+
#[library_benchmark]
70+
#[bench::args(mat2())]
71+
fn mat2_inverse(m: Mat2) -> Mat2 {
72+
black_box(m.inverse())
4673
}
4774

48-
fn iai_bench_mat2_inverse() -> Mat2 {
49-
black_box(mat2()).inverse()
75+
#[library_benchmark]
76+
#[bench::args(mat2())]
77+
fn mat2_transpose(m: Mat2) -> Mat2 {
78+
black_box(m.transpose())
5079
}
5180

52-
fn iai_bench_mat2_transpose() -> Mat2 {
53-
black_box(mat2()).transpose()
81+
#[library_benchmark]
82+
#[bench::args(mat2(), mat2())]
83+
fn mat2_mul_mat2(m1: Mat2, m2: Mat2) -> Mat2 {
84+
black_box(m1 * m2)
5485
}
5586

56-
fn iai_bench_mat2_mul_mat2() -> Mat2 {
57-
black_box(mat2()) * black_box(mat2())
87+
#[library_benchmark]
88+
#[bench::args(mat2(), vec2())]
89+
fn mat2_mul_vec2(m: Mat2, v: Vec2) -> Vec2 {
90+
black_box(m * v)
5891
}
5992

60-
fn iai_bench_mat2_mul_vec2() -> Vec2 {
61-
black_box(mat2()) * black_box(vec2())
93+
#[library_benchmark]
94+
#[bench::args(mat3a())]
95+
fn mat3a_determinant(m: Mat3A) -> f32 {
96+
black_box(m.determinant())
6297
}
6398

64-
fn iai_bench_mat3a_determinant() -> f32 {
65-
black_box(mat3a()).determinant()
99+
#[library_benchmark]
100+
#[bench::args(mat3a())]
101+
fn mat3a_inverse(m: Mat3A) -> Mat3A {
102+
black_box(m.inverse())
66103
}
67104

68-
fn iai_bench_mat3a_inverse() -> Mat3A {
69-
black_box(mat3a()).inverse()
105+
#[library_benchmark]
106+
#[bench::args(mat3a())]
107+
fn mat3a_transpose(m: Mat3A) -> Mat3A {
108+
black_box(m.transpose())
70109
}
71110

72-
fn iai_bench_mat3a_transpose() -> Mat3A {
73-
black_box(mat3a()).transpose()
111+
#[library_benchmark]
112+
#[bench::args(mat3a(), mat3a())]
113+
fn mat3a_mul_mat3a(m1: Mat3A, m2: Mat3A) -> Mat3A {
114+
black_box(m1 * m2)
74115
}
75116

76-
fn iai_bench_mat3a_mul_mat3a() -> Mat3A {
77-
black_box(mat3a()) * black_box(mat3a())
117+
#[library_benchmark]
118+
#[bench::args(mat3a(), vec3a())]
119+
fn mat3a_mul_vec3a(m: Mat3A, v: Vec3A) -> Vec3A {
120+
black_box(m * v)
78121
}
79122

80-
fn iai_bench_mat3a_mul_vec3a() -> Vec3A {
81-
black_box(mat3a()) * black_box(vec3a())
123+
#[library_benchmark]
124+
#[bench::args(mat4())]
125+
fn mat4_determinant(m: Mat4) -> f32 {
126+
black_box(m.determinant())
82127
}
83128

84-
fn iai_bench_mat4_determinant() -> f32 {
85-
black_box(mat4()).determinant()
129+
#[library_benchmark]
130+
#[bench::args(mat4())]
131+
fn mat4_inverse(m: Mat4) -> Mat4 {
132+
black_box(m.inverse())
86133
}
87134

88-
fn iai_bench_mat4_inverse() -> Mat4 {
89-
black_box(mat4()).inverse()
135+
#[library_benchmark]
136+
#[bench::args(mat4())]
137+
fn mat4_transpose(m: Mat4) -> Mat4 {
138+
black_box(m.transpose())
90139
}
91140

92-
fn iai_bench_mat4_transpose() -> Mat4 {
93-
black_box(mat4()).transpose()
141+
#[library_benchmark]
142+
#[bench::args(mat4(), mat4())]
143+
fn mat4_mul_mat4(m1: Mat4, m2: Mat4) -> Mat4 {
144+
black_box(m1 * m2)
94145
}
95146

96-
fn iai_bench_mat4_mul_mat4() -> Mat4 {
97-
black_box(mat4()) * black_box(mat4())
147+
#[library_benchmark]
148+
#[bench::args(mat4(), vec4())]
149+
fn mat4_mul_vec4(m: Mat4, v: Vec4) -> Vec4 {
150+
black_box(m * v)
98151
}
99152

100-
fn iai_bench_mat4_mul_vec4() -> Vec4 {
101-
black_box(mat4()) * black_box(vec4())
153+
#[library_benchmark]
154+
#[bench::args(quat(), quat())]
155+
fn quat_mul_quat(q1: Quat, q2: Quat) -> Quat {
156+
black_box(q1 * q2)
102157
}
103158

104-
fn iai_bench_quat_mul_quat() -> Quat {
105-
black_box(quat()) * black_box(quat())
159+
#[library_benchmark]
160+
#[bench::args(quat(), vec3a())]
161+
fn quat_mul_vec3a(q: Quat, v: Vec3A) -> Vec3A {
162+
black_box(q * v)
106163
}
107164

108-
fn iai_bench_quat_mul_vec3a() -> Vec3A {
109-
black_box(quat()) * black_box(vec3a())
165+
#[library_benchmark]
166+
#[bench::args(vec3a(), vec3a())]
167+
fn vec3a_dot(v1: Vec3A, v2: Vec3A) -> f32 {
168+
black_box(v1.dot(v2))
110169
}
111170

112-
fn iai_bench_vec3a_dot() -> f32 {
113-
black_box(vec3a()).dot(black_box(vec3a()))
171+
#[library_benchmark]
172+
#[bench::args(vec3a(), vec3a())]
173+
fn vec3a_cross(v1: Vec3A, v2: Vec3A) -> Vec3A {
174+
black_box(v1.cross(v2))
114175
}
115176

116-
fn iai_bench_vec3a_cross() -> Vec3A {
117-
black_box(vec3a()).cross(black_box(vec3a()))
177+
#[library_benchmark]
178+
#[bench::args(vec3a())]
179+
fn vec3a_length(v: Vec3A) -> f32 {
180+
black_box(v.length())
118181
}
119182

120-
fn iai_bench_vec3a_length() -> f32 {
121-
black_box(vec3a()).length()
183+
#[library_benchmark]
184+
#[bench::args(vec3a())]
185+
fn vec3a_normalize(v: Vec3A) -> Vec3A {
186+
black_box(v.normalize())
122187
}
123188

124-
fn iai_bench_vec3a_normalize() -> Vec3A {
125-
black_box(vec3a()).normalize()
189+
#[library_benchmark]
190+
#[bench::args(bvec3a(), vec3a(), vec3a())]
191+
fn vec3a_select(b: BVec3A, v1: Vec3A, v2: Vec3A) -> Vec3A {
192+
black_box(Vec3A::select(b, v1, v2))
126193
}
127194

128-
fn iai_bench_vec3a_select() -> Vec3A {
129-
Vec3A::select(black_box(BVec3A::TRUE), Vec3A::ONE, Vec3A::ZERO)
195+
#[library_benchmark]
196+
#[bench::args(vec4(), vec4())]
197+
fn vec4_dot(v1: Vec4, v2: Vec4) -> f32 {
198+
black_box(v1.dot(v2))
130199
}
131200

132-
fn iai_bench_vec4_dot() -> f32 {
133-
black_box(vec4()).dot(black_box(vec4()))
201+
#[library_benchmark]
202+
#[bench::args(vec4())]
203+
fn vec4_length(v: Vec4) -> f32 {
204+
black_box(v.length())
134205
}
135206

136-
fn iai_bench_vec4_length() -> f32 {
137-
black_box(vec4()).length()
207+
#[library_benchmark]
208+
#[bench::args(vec4())]
209+
fn vec4_normalize(v: Vec4) -> Vec4 {
210+
black_box(v.normalize())
138211
}
139212

140-
fn iai_bench_vec4_normalize() -> Vec4 {
141-
black_box(vec4()).normalize()
213+
#[library_benchmark]
214+
#[bench::args(bvec4a(), vec4(), vec4())]
215+
fn vec4_select(b: BVec4A, v1: Vec4, v2: Vec4) -> Vec4 {
216+
black_box(Vec4::select(b, v1, v2))
142217
}
143218

144-
// fn iai_bench_vec4_select() -> Vec4 {
145-
// Vec4::select(black_box(BVec4A::TRUE), Vec4::ONE, Vec4::ZERO)
146-
// }
219+
library_benchmark_group!(
220+
name = bench_mat2;
221+
benchmarks =
222+
mat2_determinant,
223+
mat2_inverse,
224+
mat2_mul_mat2,
225+
mat2_mul_vec2,
226+
mat2_transpose,
227+
);
228+
229+
library_benchmark_group!(
230+
name = bench_mat3a;
231+
benchmarks =
232+
mat3a_determinant,
233+
mat3a_inverse,
234+
mat3a_mul_mat3a,
235+
mat3a_mul_vec3a,
236+
mat3a_transpose,
237+
);
238+
239+
library_benchmark_group!(
240+
name = bench_mat4;
241+
benchmarks =
242+
mat4_determinant,
243+
mat4_inverse,
244+
mat4_mul_mat4,
245+
mat4_mul_vec4,
246+
mat4_transpose,
247+
);
248+
249+
library_benchmark_group!(
250+
name = bench_quat;
251+
benchmarks =
252+
quat_mul_quat,
253+
quat_mul_vec3a,
254+
);
255+
256+
library_benchmark_group!(
257+
name = bench_vec3a;
258+
benchmarks =
259+
vec3a_dot,
260+
vec3a_cross,
261+
vec3a_length,
262+
vec3a_normalize,
263+
vec3a_select,
264+
);
265+
266+
library_benchmark_group!(
267+
name = bench_vec4;
268+
benchmarks =
269+
vec4_dot,
270+
vec4_length,
271+
vec4_normalize,
272+
vec4_select,
273+
);
147274

148-
iai::main!(
149-
iai_bench_mat2_determinant,
150-
iai_bench_mat2_inverse,
151-
iai_bench_mat2_mul_mat2,
152-
iai_bench_mat2_mul_vec2,
153-
iai_bench_mat2_transpose,
154-
iai_bench_mat3a_determinant,
155-
iai_bench_mat3a_inverse,
156-
iai_bench_mat3a_mul_mat3a,
157-
iai_bench_mat3a_mul_vec3a,
158-
iai_bench_mat3a_transpose,
159-
iai_bench_mat4_determinant,
160-
iai_bench_mat4_inverse,
161-
iai_bench_mat4_mul_mat4,
162-
iai_bench_mat4_mul_vec4,
163-
iai_bench_mat4_transpose,
164-
iai_bench_quat_mul_quat,
165-
iai_bench_quat_mul_vec3a,
166-
iai_bench_vec3a_dot,
167-
iai_bench_vec3a_cross,
168-
iai_bench_vec3a_length,
169-
iai_bench_vec3a_normalize,
170-
iai_bench_vec3a_select,
171-
iai_bench_vec4_dot,
172-
iai_bench_vec4_length,
173-
iai_bench_vec4_normalize,
174-
// iai_bench_vec4_select,
275+
main!(
276+
library_benchmark_groups = bench_mat2,
277+
bench_mat3a,
278+
bench_mat4,
279+
bench_quat,
280+
bench_vec3a,
281+
bench_vec4
175282
);

0 commit comments

Comments
 (0)