From 4eeae2c2987cd2e271d4c8243c4d9f4de5fa26d2 Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Mon, 13 Jul 2020 21:37:37 +0900 Subject: [PATCH 1/6] Add bench of LU --- ndarray-linalg/Cargo.toml | 4 ++++ ndarray-linalg/benches/eigh.rs | 4 ++-- ndarray-linalg/benches/solve.rs | 24 ++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 ndarray-linalg/benches/solve.rs diff --git a/ndarray-linalg/Cargo.toml b/ndarray-linalg/Cargo.toml index 81438327..7998ac82 100644 --- a/ndarray-linalg/Cargo.toml +++ b/ndarray-linalg/Cargo.toml @@ -58,5 +58,9 @@ harness = false name = "eigh" harness = false +[[bench]] +name = "solve" +harness = false + [package.metadata.docs.rs] rustdoc-args = ["--html-in-header", "katex-header.html"] diff --git a/ndarray-linalg/benches/eigh.rs b/ndarray-linalg/benches/eigh.rs index d427b6d0..0924d14f 100644 --- a/ndarray-linalg/benches/eigh.rs +++ b/ndarray-linalg/benches/eigh.rs @@ -5,13 +5,13 @@ use ndarray_linalg::*; fn eigh_small(c: &mut Criterion) { let mut group = c.benchmark_group("eigh"); for &n in &[4, 8, 16, 32, 64, 128] { - group.bench_with_input(BenchmarkId::new("eigh", n), &n, |b, n| { + group.bench_with_input(BenchmarkId::new("C", n), &n, |b, n| { let a: Array2 = random((*n, *n)); b.iter(|| { let (_e, _vecs) = a.eigh(UPLO::Upper).unwrap(); }) }); - group.bench_with_input(BenchmarkId::new("eigh_t", n), &n, |b, n| { + group.bench_with_input(BenchmarkId::new("F", n), &n, |b, n| { let a: Array2 = random((*n, *n).f()); b.iter(|| { let (_e, _vecs) = a.eigh(UPLO::Upper).unwrap(); diff --git a/ndarray-linalg/benches/solve.rs b/ndarray-linalg/benches/solve.rs new file mode 100644 index 00000000..6363665c --- /dev/null +++ b/ndarray-linalg/benches/solve.rs @@ -0,0 +1,24 @@ +use criterion::*; +use ndarray::*; +use ndarray_linalg::*; + +fn factorize_small(c: &mut Criterion) { + let mut group = c.benchmark_group("factorize"); + for &n in &[4, 8, 16, 32, 64, 128] { + group.bench_with_input(BenchmarkId::new("C", n), &n, |b, n| { + let a: Array2 = random((*n, *n)); + b.iter(|| { + let _lu = a.factorize().unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("F", n), &n, |b, n| { + let a: Array2 = random((*n, *n).f()); + b.iter(|| { + let _lu = a.factorize().unwrap(); + }) + }); + } +} + +criterion_group!(factorize, factorize_small); +criterion_main!(factorize); From 46111b9c39de68f98c013710c8829555a1718db3 Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Sun, 2 Aug 2020 02:12:54 +0900 Subject: [PATCH 2/6] Add bench/svd --- ndarray-linalg/Cargo.toml | 4 +++ ndarray-linalg/benches/svd.rs | 60 +++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 ndarray-linalg/benches/svd.rs diff --git a/ndarray-linalg/Cargo.toml b/ndarray-linalg/Cargo.toml index 7998ac82..3d584fbb 100644 --- a/ndarray-linalg/Cargo.toml +++ b/ndarray-linalg/Cargo.toml @@ -58,6 +58,10 @@ harness = false name = "eigh" harness = false +[[bench]] +name = "svd" +harness = false + [[bench]] name = "solve" harness = false diff --git a/ndarray-linalg/benches/svd.rs b/ndarray-linalg/benches/svd.rs new file mode 100644 index 00000000..6991bc5e --- /dev/null +++ b/ndarray-linalg/benches/svd.rs @@ -0,0 +1,60 @@ +use criterion::*; +use ndarray::*; +use ndarray_linalg::*; + +fn svd_small(c: &mut Criterion) { + let mut group = c.benchmark_group("svd"); + for &n in &[4, 8, 16, 32, 64, 128] { + group.bench_with_input(BenchmarkId::new("C", n), &n, |b, n| { + let a: Array2 = random((*n, *n)); + b.iter(|| { + let _ = a.svd(false, false).unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("F", n), &n, |b, n| { + let a: Array2 = random((*n, *n).f()); + b.iter(|| { + let _ = a.svd(false, false).unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("u/C", n), &n, |b, n| { + let a: Array2 = random((*n, *n)); + b.iter(|| { + let _ = a.svd(true, false).unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("u/F", n), &n, |b, n| { + let a: Array2 = random((*n, *n).f()); + b.iter(|| { + let _ = a.svd(true, false).unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("vt/C", n), &n, |b, n| { + let a: Array2 = random((*n, *n)); + b.iter(|| { + let _ = a.svd(false, true).unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("vt/F", n), &n, |b, n| { + let a: Array2 = random((*n, *n).f()); + b.iter(|| { + let _ = a.svd(false, true).unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("uvt/C", n), &n, |b, n| { + let a: Array2 = random((*n, *n)); + b.iter(|| { + let _ = a.svd(false, true).unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("uvt/F", n), &n, |b, n| { + let a: Array2 = random((*n, *n).f()); + b.iter(|| { + let _ = a.svd(false, true).unwrap(); + }) + }); + } +} + +criterion_group!(svd, svd_small); +criterion_main!(svd); From 01a02f0e8edafdcdb5fea5fc864e799707226e92 Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Sun, 2 Aug 2020 02:17:51 +0900 Subject: [PATCH 3/6] Rename benchmark ID --- ndarray-linalg/benches/truncated_eig.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ndarray-linalg/benches/truncated_eig.rs b/ndarray-linalg/benches/truncated_eig.rs index 7a55da15..9fcd18b3 100644 --- a/ndarray-linalg/benches/truncated_eig.rs +++ b/ndarray-linalg/benches/truncated_eig.rs @@ -5,14 +5,14 @@ use ndarray_linalg::*; fn truncated_eigh_small(c: &mut Criterion) { let mut group = c.benchmark_group("truncated_eigh"); for &n in &[4, 8, 16, 32, 64, 128] { - group.bench_with_input(BenchmarkId::new("truncated_eig", n), &n, |b, &n| { + group.bench_with_input(BenchmarkId::new("C", n), &n, |b, &n| { let a: Array2 = random((n, n)); let a = a.t().dot(&a); b.iter(move || { let _result = TruncatedEig::new(a.clone(), TruncatedOrder::Largest).decompose(1); }) }); - group.bench_with_input(BenchmarkId::new("truncated_eig_t", n), &n, |b, &n| { + group.bench_with_input(BenchmarkId::new("F", n), &n, |b, &n| { let a: Array2 = random((n, n).f()); let a = a.t().dot(&a); b.iter(|| { From 2b60edfe8fdfa9ddbebbc4b2c21dc98071d18c0f Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Sun, 2 Aug 2020 02:34:21 +0900 Subject: [PATCH 4/6] Add svddc --- ndarray-linalg/benches/svd.rs | 44 ++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/ndarray-linalg/benches/svd.rs b/ndarray-linalg/benches/svd.rs index 6991bc5e..a1870a8f 100644 --- a/ndarray-linalg/benches/svd.rs +++ b/ndarray-linalg/benches/svd.rs @@ -56,5 +56,47 @@ fn svd_small(c: &mut Criterion) { } } -criterion_group!(svd, svd_small); +fn svddc_small(c: &mut Criterion) { + let mut group = c.benchmark_group("svddc"); + for &n in &[4, 8, 16, 32, 64, 128] { + group.bench_with_input(BenchmarkId::new("C", n), &n, |b, n| { + let a: Array2 = random((*n, *n)); + b.iter(|| { + let _ = a.svddc(UVTFlag::None).unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("F", n), &n, |b, n| { + let a: Array2 = random((*n, *n).f()); + b.iter(|| { + let _ = a.svddc(UVTFlag::None).unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("some/C", n), &n, |b, n| { + let a: Array2 = random((*n, *n)); + b.iter(|| { + let _ = a.svddc(UVTFlag::Some).unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("some/F", n), &n, |b, n| { + let a: Array2 = random((*n, *n).f()); + b.iter(|| { + let _ = a.svddc(UVTFlag::Some).unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("full/C", n), &n, |b, n| { + let a: Array2 = random((*n, *n)); + b.iter(|| { + let _ = a.svddc(UVTFlag::Full).unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("full/F", n), &n, |b, n| { + let a: Array2 = random((*n, *n).f()); + b.iter(|| { + let _ = a.svddc(UVTFlag::Full).unwrap(); + }) + }); + } +} + +criterion_group!(svd, svd_small, svddc_small); criterion_main!(svd); From 17b3cd15bdd98ebb0ce91f4e6d12f5a4e8114a50 Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Sun, 2 Aug 2020 17:33:53 +0900 Subject: [PATCH 5/6] eig, eigvals, eigvalsh --- ndarray-linalg/Cargo.toml | 4 ++++ ndarray-linalg/benches/eig.rs | 36 ++++++++++++++++++++++++++++++++++ ndarray-linalg/benches/eigh.rs | 20 +++++++++++++++---- 3 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 ndarray-linalg/benches/eig.rs diff --git a/ndarray-linalg/Cargo.toml b/ndarray-linalg/Cargo.toml index 3d584fbb..f9450666 100644 --- a/ndarray-linalg/Cargo.toml +++ b/ndarray-linalg/Cargo.toml @@ -54,6 +54,10 @@ approx = { version = "0.3.2", features = ["num-complex"] } name = "truncated_eig" harness = false +[[bench]] +name = "eig" +harness = false + [[bench]] name = "eigh" harness = false diff --git a/ndarray-linalg/benches/eig.rs b/ndarray-linalg/benches/eig.rs new file mode 100644 index 00000000..9ab124ec --- /dev/null +++ b/ndarray-linalg/benches/eig.rs @@ -0,0 +1,36 @@ +use criterion::*; +use ndarray::*; +use ndarray_linalg::*; + +fn eig_small(c: &mut Criterion) { + let mut group = c.benchmark_group("eig"); + for &n in &[4, 8, 16, 32, 64, 128] { + group.bench_with_input(BenchmarkId::new("vecs/C", n), &n, |b, n| { + let a: Array2 = random((*n, *n)); + b.iter(|| { + let (_e, _vecs) = a.eig().unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("vecs/F", n), &n, |b, n| { + let a: Array2 = random((*n, *n).f()); + b.iter(|| { + let (_e, _vecs) = a.eig().unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("vals/C", n), &n, |b, n| { + let a: Array2 = random((*n, *n)); + b.iter(|| { + let _result = a.eigvals().unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("vals/F", n), &n, |b, n| { + let a: Array2 = random((*n, *n).f()); + b.iter(|| { + let _result = a.eigvals().unwrap(); + }) + }); + } +} + +criterion_group!(eig, eig_small); +criterion_main!(eig); diff --git a/ndarray-linalg/benches/eigh.rs b/ndarray-linalg/benches/eigh.rs index 0924d14f..677956d7 100644 --- a/ndarray-linalg/benches/eigh.rs +++ b/ndarray-linalg/benches/eigh.rs @@ -5,16 +5,28 @@ use ndarray_linalg::*; fn eigh_small(c: &mut Criterion) { let mut group = c.benchmark_group("eigh"); for &n in &[4, 8, 16, 32, 64, 128] { - group.bench_with_input(BenchmarkId::new("C", n), &n, |b, n| { + group.bench_with_input(BenchmarkId::new("vals/C", n), &n, |b, n| { let a: Array2 = random((*n, *n)); b.iter(|| { - let (_e, _vecs) = a.eigh(UPLO::Upper).unwrap(); + let _result = a.eigvalsh(UPLO::Upper).unwrap(); }) }); - group.bench_with_input(BenchmarkId::new("F", n), &n, |b, n| { + group.bench_with_input(BenchmarkId::new("vals/F", n), &n, |b, n| { let a: Array2 = random((*n, *n).f()); b.iter(|| { - let (_e, _vecs) = a.eigh(UPLO::Upper).unwrap(); + let _result = a.eigvalsh(UPLO::Upper).unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("vecs/C", n), &n, |b, n| { + let a: Array2 = random((*n, *n)); + b.iter(|| { + let _result = a.eigvalsh(UPLO::Upper).unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("vecs/F", n), &n, |b, n| { + let a: Array2 = random((*n, *n).f()); + b.iter(|| { + let _result = a.eigvalsh(UPLO::Upper).unwrap(); }) }); } From 76e757e5f568dd1a7e7863a8ee5177731edceac0 Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Sun, 2 Aug 2020 20:33:45 +0900 Subject: [PATCH 6/6] QR, solveh --- ndarray-linalg/Cargo.toml | 8 +++++++ ndarray-linalg/benches/qr.rs | 24 +++++++++++++++++++++ ndarray-linalg/benches/solve.rs | 24 +++++++++++++++------ ndarray-linalg/benches/solveh.rs | 36 ++++++++++++++++++++++++++++++++ 4 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 ndarray-linalg/benches/qr.rs create mode 100644 ndarray-linalg/benches/solveh.rs diff --git a/ndarray-linalg/Cargo.toml b/ndarray-linalg/Cargo.toml index f9450666..51425547 100644 --- a/ndarray-linalg/Cargo.toml +++ b/ndarray-linalg/Cargo.toml @@ -62,6 +62,10 @@ harness = false name = "eigh" harness = false +[[bench]] +name = "qr" +harness = false + [[bench]] name = "svd" harness = false @@ -70,5 +74,9 @@ harness = false name = "solve" harness = false +[[bench]] +name = "solveh" +harness = false + [package.metadata.docs.rs] rustdoc-args = ["--html-in-header", "katex-header.html"] diff --git a/ndarray-linalg/benches/qr.rs b/ndarray-linalg/benches/qr.rs new file mode 100644 index 00000000..248be49b --- /dev/null +++ b/ndarray-linalg/benches/qr.rs @@ -0,0 +1,24 @@ +use criterion::*; +use ndarray::*; +use ndarray_linalg::*; + +fn qr_small(c: &mut Criterion) { + let mut group = c.benchmark_group("qr"); + for &n in &[4, 8, 16, 32, 64, 128] { + group.bench_with_input(BenchmarkId::new("C", n), &n, |b, n| { + let a: Array2 = random((*n, *n)); + b.iter(|| { + let _result = a.qr().unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("F", n), &n, |b, n| { + let a: Array2 = random((*n, *n).f()); + b.iter(|| { + let _result = a.qr().unwrap(); + }) + }); + } +} + +criterion_group!(qr, qr_small); +criterion_main!(qr); diff --git a/ndarray-linalg/benches/solve.rs b/ndarray-linalg/benches/solve.rs index 6363665c..88b6e282 100644 --- a/ndarray-linalg/benches/solve.rs +++ b/ndarray-linalg/benches/solve.rs @@ -2,23 +2,35 @@ use criterion::*; use ndarray::*; use ndarray_linalg::*; -fn factorize_small(c: &mut Criterion) { - let mut group = c.benchmark_group("factorize"); +fn solve_small(c: &mut Criterion) { + let mut group = c.benchmark_group("solve"); for &n in &[4, 8, 16, 32, 64, 128] { - group.bench_with_input(BenchmarkId::new("C", n), &n, |b, n| { + group.bench_with_input(BenchmarkId::new("factorize/C", n), &n, |b, n| { let a: Array2 = random((*n, *n)); b.iter(|| { let _lu = a.factorize().unwrap(); }) }); - group.bench_with_input(BenchmarkId::new("F", n), &n, |b, n| { + group.bench_with_input(BenchmarkId::new("factorize/F", n), &n, |b, n| { let a: Array2 = random((*n, *n).f()); b.iter(|| { let _lu = a.factorize().unwrap(); }) }); + group.bench_with_input(BenchmarkId::new("inv/C", n), &n, |b, n| { + let a: Array2 = random((*n, *n)); + b.iter(|| { + let _inv = a.inv().unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("inv/F", n), &n, |b, n| { + let a: Array2 = random((*n, *n).f()); + b.iter(|| { + let _inv = a.inv().unwrap(); + }) + }); } } -criterion_group!(factorize, factorize_small); -criterion_main!(factorize); +criterion_group!(solve, solve_small); +criterion_main!(solve); diff --git a/ndarray-linalg/benches/solveh.rs b/ndarray-linalg/benches/solveh.rs new file mode 100644 index 00000000..ee800d03 --- /dev/null +++ b/ndarray-linalg/benches/solveh.rs @@ -0,0 +1,36 @@ +use criterion::*; +use ndarray::*; +use ndarray_linalg::*; + +fn solveh_small(c: &mut Criterion) { + let mut group = c.benchmark_group("solveh"); + for &n in &[4, 8, 16, 32, 64, 128] { + group.bench_with_input(BenchmarkId::new("factorizeh/C", n), &n, |b, n| { + let a: Array2 = random((*n, *n)); + b.iter(|| { + let _lu = a.factorizeh().unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("factorizeh/F", n), &n, |b, n| { + let a: Array2 = random((*n, *n).f()); + b.iter(|| { + let _lu = a.factorizeh().unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("invh/C", n), &n, |b, n| { + let a: Array2 = random((*n, *n)); + b.iter(|| { + let _inv = a.invh().unwrap(); + }) + }); + group.bench_with_input(BenchmarkId::new("invh/F", n), &n, |b, n| { + let a: Array2 = random((*n, *n).f()); + b.iter(|| { + let _inv = a.invh().unwrap(); + }) + }); + } +} + +criterion_group!(solveh, solveh_small); +criterion_main!(solveh);