Skip to content

Commit 73d4e77

Browse files
authored
Merge pull request #244 from rust-ndarray/micro-bench
Benchmark for small matrices
2 parents c2095c9 + 76e757e commit 73d4e77

File tree

8 files changed

+272
-6
lines changed

8 files changed

+272
-6
lines changed

ndarray-linalg/Cargo.toml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,29 @@ approx = { version = "0.3.2", features = ["num-complex"] }
5454
name = "truncated_eig"
5555
harness = false
5656

57+
[[bench]]
58+
name = "eig"
59+
harness = false
60+
5761
[[bench]]
5862
name = "eigh"
5963
harness = false
6064

65+
[[bench]]
66+
name = "qr"
67+
harness = false
68+
69+
[[bench]]
70+
name = "svd"
71+
harness = false
72+
73+
[[bench]]
74+
name = "solve"
75+
harness = false
76+
77+
[[bench]]
78+
name = "solveh"
79+
harness = false
80+
6181
[package.metadata.docs.rs]
6282
rustdoc-args = ["--html-in-header", "katex-header.html"]

ndarray-linalg/benches/eig.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
use criterion::*;
2+
use ndarray::*;
3+
use ndarray_linalg::*;
4+
5+
fn eig_small(c: &mut Criterion) {
6+
let mut group = c.benchmark_group("eig");
7+
for &n in &[4, 8, 16, 32, 64, 128] {
8+
group.bench_with_input(BenchmarkId::new("vecs/C", n), &n, |b, n| {
9+
let a: Array2<f64> = random((*n, *n));
10+
b.iter(|| {
11+
let (_e, _vecs) = a.eig().unwrap();
12+
})
13+
});
14+
group.bench_with_input(BenchmarkId::new("vecs/F", n), &n, |b, n| {
15+
let a: Array2<f64> = random((*n, *n).f());
16+
b.iter(|| {
17+
let (_e, _vecs) = a.eig().unwrap();
18+
})
19+
});
20+
group.bench_with_input(BenchmarkId::new("vals/C", n), &n, |b, n| {
21+
let a: Array2<f64> = random((*n, *n));
22+
b.iter(|| {
23+
let _result = a.eigvals().unwrap();
24+
})
25+
});
26+
group.bench_with_input(BenchmarkId::new("vals/F", n), &n, |b, n| {
27+
let a: Array2<f64> = random((*n, *n).f());
28+
b.iter(|| {
29+
let _result = a.eigvals().unwrap();
30+
})
31+
});
32+
}
33+
}
34+
35+
criterion_group!(eig, eig_small);
36+
criterion_main!(eig);

ndarray-linalg/benches/eigh.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,28 @@ use ndarray_linalg::*;
55
fn eigh_small(c: &mut Criterion) {
66
let mut group = c.benchmark_group("eigh");
77
for &n in &[4, 8, 16, 32, 64, 128] {
8-
group.bench_with_input(BenchmarkId::new("eigh", n), &n, |b, n| {
8+
group.bench_with_input(BenchmarkId::new("vals/C", n), &n, |b, n| {
99
let a: Array2<f64> = random((*n, *n));
1010
b.iter(|| {
11-
let (_e, _vecs) = a.eigh(UPLO::Upper).unwrap();
11+
let _result = a.eigvalsh(UPLO::Upper).unwrap();
1212
})
1313
});
14-
group.bench_with_input(BenchmarkId::new("eigh_t", n), &n, |b, n| {
14+
group.bench_with_input(BenchmarkId::new("vals/F", n), &n, |b, n| {
1515
let a: Array2<f64> = random((*n, *n).f());
1616
b.iter(|| {
17-
let (_e, _vecs) = a.eigh(UPLO::Upper).unwrap();
17+
let _result = a.eigvalsh(UPLO::Upper).unwrap();
18+
})
19+
});
20+
group.bench_with_input(BenchmarkId::new("vecs/C", n), &n, |b, n| {
21+
let a: Array2<f64> = random((*n, *n));
22+
b.iter(|| {
23+
let _result = a.eigvalsh(UPLO::Upper).unwrap();
24+
})
25+
});
26+
group.bench_with_input(BenchmarkId::new("vecs/F", n), &n, |b, n| {
27+
let a: Array2<f64> = random((*n, *n).f());
28+
b.iter(|| {
29+
let _result = a.eigvalsh(UPLO::Upper).unwrap();
1830
})
1931
});
2032
}

ndarray-linalg/benches/qr.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
use criterion::*;
2+
use ndarray::*;
3+
use ndarray_linalg::*;
4+
5+
fn qr_small(c: &mut Criterion) {
6+
let mut group = c.benchmark_group("qr");
7+
for &n in &[4, 8, 16, 32, 64, 128] {
8+
group.bench_with_input(BenchmarkId::new("C", n), &n, |b, n| {
9+
let a: Array2<f64> = random((*n, *n));
10+
b.iter(|| {
11+
let _result = a.qr().unwrap();
12+
})
13+
});
14+
group.bench_with_input(BenchmarkId::new("F", n), &n, |b, n| {
15+
let a: Array2<f64> = random((*n, *n).f());
16+
b.iter(|| {
17+
let _result = a.qr().unwrap();
18+
})
19+
});
20+
}
21+
}
22+
23+
criterion_group!(qr, qr_small);
24+
criterion_main!(qr);

ndarray-linalg/benches/solve.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
use criterion::*;
2+
use ndarray::*;
3+
use ndarray_linalg::*;
4+
5+
fn solve_small(c: &mut Criterion) {
6+
let mut group = c.benchmark_group("solve");
7+
for &n in &[4, 8, 16, 32, 64, 128] {
8+
group.bench_with_input(BenchmarkId::new("factorize/C", n), &n, |b, n| {
9+
let a: Array2<f64> = random((*n, *n));
10+
b.iter(|| {
11+
let _lu = a.factorize().unwrap();
12+
})
13+
});
14+
group.bench_with_input(BenchmarkId::new("factorize/F", n), &n, |b, n| {
15+
let a: Array2<f64> = random((*n, *n).f());
16+
b.iter(|| {
17+
let _lu = a.factorize().unwrap();
18+
})
19+
});
20+
group.bench_with_input(BenchmarkId::new("inv/C", n), &n, |b, n| {
21+
let a: Array2<f64> = random((*n, *n));
22+
b.iter(|| {
23+
let _inv = a.inv().unwrap();
24+
})
25+
});
26+
group.bench_with_input(BenchmarkId::new("inv/F", n), &n, |b, n| {
27+
let a: Array2<f64> = random((*n, *n).f());
28+
b.iter(|| {
29+
let _inv = a.inv().unwrap();
30+
})
31+
});
32+
}
33+
}
34+
35+
criterion_group!(solve, solve_small);
36+
criterion_main!(solve);

ndarray-linalg/benches/solveh.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
use criterion::*;
2+
use ndarray::*;
3+
use ndarray_linalg::*;
4+
5+
fn solveh_small(c: &mut Criterion) {
6+
let mut group = c.benchmark_group("solveh");
7+
for &n in &[4, 8, 16, 32, 64, 128] {
8+
group.bench_with_input(BenchmarkId::new("factorizeh/C", n), &n, |b, n| {
9+
let a: Array2<f64> = random((*n, *n));
10+
b.iter(|| {
11+
let _lu = a.factorizeh().unwrap();
12+
})
13+
});
14+
group.bench_with_input(BenchmarkId::new("factorizeh/F", n), &n, |b, n| {
15+
let a: Array2<f64> = random((*n, *n).f());
16+
b.iter(|| {
17+
let _lu = a.factorizeh().unwrap();
18+
})
19+
});
20+
group.bench_with_input(BenchmarkId::new("invh/C", n), &n, |b, n| {
21+
let a: Array2<f64> = random((*n, *n));
22+
b.iter(|| {
23+
let _inv = a.invh().unwrap();
24+
})
25+
});
26+
group.bench_with_input(BenchmarkId::new("invh/F", n), &n, |b, n| {
27+
let a: Array2<f64> = random((*n, *n).f());
28+
b.iter(|| {
29+
let _inv = a.invh().unwrap();
30+
})
31+
});
32+
}
33+
}
34+
35+
criterion_group!(solveh, solveh_small);
36+
criterion_main!(solveh);

ndarray-linalg/benches/svd.rs

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
use criterion::*;
2+
use ndarray::*;
3+
use ndarray_linalg::*;
4+
5+
fn svd_small(c: &mut Criterion) {
6+
let mut group = c.benchmark_group("svd");
7+
for &n in &[4, 8, 16, 32, 64, 128] {
8+
group.bench_with_input(BenchmarkId::new("C", n), &n, |b, n| {
9+
let a: Array2<f64> = random((*n, *n));
10+
b.iter(|| {
11+
let _ = a.svd(false, false).unwrap();
12+
})
13+
});
14+
group.bench_with_input(BenchmarkId::new("F", n), &n, |b, n| {
15+
let a: Array2<f64> = random((*n, *n).f());
16+
b.iter(|| {
17+
let _ = a.svd(false, false).unwrap();
18+
})
19+
});
20+
group.bench_with_input(BenchmarkId::new("u/C", n), &n, |b, n| {
21+
let a: Array2<f64> = random((*n, *n));
22+
b.iter(|| {
23+
let _ = a.svd(true, false).unwrap();
24+
})
25+
});
26+
group.bench_with_input(BenchmarkId::new("u/F", n), &n, |b, n| {
27+
let a: Array2<f64> = random((*n, *n).f());
28+
b.iter(|| {
29+
let _ = a.svd(true, false).unwrap();
30+
})
31+
});
32+
group.bench_with_input(BenchmarkId::new("vt/C", n), &n, |b, n| {
33+
let a: Array2<f64> = random((*n, *n));
34+
b.iter(|| {
35+
let _ = a.svd(false, true).unwrap();
36+
})
37+
});
38+
group.bench_with_input(BenchmarkId::new("vt/F", n), &n, |b, n| {
39+
let a: Array2<f64> = random((*n, *n).f());
40+
b.iter(|| {
41+
let _ = a.svd(false, true).unwrap();
42+
})
43+
});
44+
group.bench_with_input(BenchmarkId::new("uvt/C", n), &n, |b, n| {
45+
let a: Array2<f64> = random((*n, *n));
46+
b.iter(|| {
47+
let _ = a.svd(false, true).unwrap();
48+
})
49+
});
50+
group.bench_with_input(BenchmarkId::new("uvt/F", n), &n, |b, n| {
51+
let a: Array2<f64> = random((*n, *n).f());
52+
b.iter(|| {
53+
let _ = a.svd(false, true).unwrap();
54+
})
55+
});
56+
}
57+
}
58+
59+
fn svddc_small(c: &mut Criterion) {
60+
let mut group = c.benchmark_group("svddc");
61+
for &n in &[4, 8, 16, 32, 64, 128] {
62+
group.bench_with_input(BenchmarkId::new("C", n), &n, |b, n| {
63+
let a: Array2<f64> = random((*n, *n));
64+
b.iter(|| {
65+
let _ = a.svddc(UVTFlag::None).unwrap();
66+
})
67+
});
68+
group.bench_with_input(BenchmarkId::new("F", n), &n, |b, n| {
69+
let a: Array2<f64> = random((*n, *n).f());
70+
b.iter(|| {
71+
let _ = a.svddc(UVTFlag::None).unwrap();
72+
})
73+
});
74+
group.bench_with_input(BenchmarkId::new("some/C", n), &n, |b, n| {
75+
let a: Array2<f64> = random((*n, *n));
76+
b.iter(|| {
77+
let _ = a.svddc(UVTFlag::Some).unwrap();
78+
})
79+
});
80+
group.bench_with_input(BenchmarkId::new("some/F", n), &n, |b, n| {
81+
let a: Array2<f64> = random((*n, *n).f());
82+
b.iter(|| {
83+
let _ = a.svddc(UVTFlag::Some).unwrap();
84+
})
85+
});
86+
group.bench_with_input(BenchmarkId::new("full/C", n), &n, |b, n| {
87+
let a: Array2<f64> = random((*n, *n));
88+
b.iter(|| {
89+
let _ = a.svddc(UVTFlag::Full).unwrap();
90+
})
91+
});
92+
group.bench_with_input(BenchmarkId::new("full/F", n), &n, |b, n| {
93+
let a: Array2<f64> = random((*n, *n).f());
94+
b.iter(|| {
95+
let _ = a.svddc(UVTFlag::Full).unwrap();
96+
})
97+
});
98+
}
99+
}
100+
101+
criterion_group!(svd, svd_small, svddc_small);
102+
criterion_main!(svd);

ndarray-linalg/benches/truncated_eig.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ use ndarray_linalg::*;
55
fn truncated_eigh_small(c: &mut Criterion) {
66
let mut group = c.benchmark_group("truncated_eigh");
77
for &n in &[4, 8, 16, 32, 64, 128] {
8-
group.bench_with_input(BenchmarkId::new("truncated_eig", n), &n, |b, &n| {
8+
group.bench_with_input(BenchmarkId::new("C", n), &n, |b, &n| {
99
let a: Array2<f64> = random((n, n));
1010
let a = a.t().dot(&a);
1111
b.iter(move || {
1212
let _result = TruncatedEig::new(a.clone(), TruncatedOrder::Largest).decompose(1);
1313
})
1414
});
15-
group.bench_with_input(BenchmarkId::new("truncated_eig_t", n), &n, |b, &n| {
15+
group.bench_with_input(BenchmarkId::new("F", n), &n, |b, &n| {
1616
let a: Array2<f64> = random((n, n).f());
1717
let a = a.t().dot(&a);
1818
b.iter(|| {

0 commit comments

Comments
 (0)