From dee5dd2468624a0056f5d3dcc3586b6aa65bc843 Mon Sep 17 00:00:00 2001 From: Angus Stewart Date: Sun, 30 Jun 2024 20:32:26 +0100 Subject: [PATCH 1/3] perf: add initial benchmarks --- Cargo.toml | 7 ++++ benches/tensor_bench.rs | 81 +++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 9 +++++ 3 files changed, 97 insertions(+) create mode 100644 benches/tensor_bench.rs diff --git a/Cargo.toml b/Cargo.toml index e0fae0a..6148c77 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,3 +10,10 @@ repository = "https://github.com/Rust-Scientific-Computing/feotensor" [dependencies] itertools = "0.13.0" num = "0.4.3" + +[dev-dependencies] +criterion = "0.5" + +[[bench]] +name = "tensor_bench" +harness = false diff --git a/benches/tensor_bench.rs b/benches/tensor_bench.rs new file mode 100644 index 0000000..be8796a --- /dev/null +++ b/benches/tensor_bench.rs @@ -0,0 +1,81 @@ +use criterion::{criterion_group, criterion_main, Criterion}; +use feotensor::{Matrix, Shape, Tensor, Vector}; + +// Contraction Methods + +fn bench_sum(c: &mut Criterion) { + let shape = Shape::new(vec![500, 500]).unwrap(); + let tensor = Tensor::::ones(&shape); + c.bench_function("tensor_sum", |b| b.iter(|| tensor.sum(vec![]))); +} + +fn bench_mean(c: &mut Criterion) { + let shape = Shape::new(vec![500, 500]).unwrap(); + let tensor = Tensor::::ones(&shape); + c.bench_function("tensor_mean", |b| b.iter(|| tensor.mean(vec![]))); +} + +fn bench_var(c: &mut Criterion) { + let shape = Shape::new(vec![500, 500]).unwrap(); + let tensor = Tensor::::ones(&shape); + c.bench_function("tensor_var", |b| b.iter(|| tensor.var(vec![]))); +} + +fn bench_max(c: &mut Criterion) { + let shape = Shape::new(vec![500, 500]).unwrap(); + let tensor = Tensor::::ones(&shape); + c.bench_function("tensor_max", |b| b.iter(|| tensor.max(vec![]))); +} + +fn bench_min(c: &mut Criterion) { + let shape = Shape::new(vec![500, 500]).unwrap(); + let tensor = Tensor::::ones(&shape); + c.bench_function("tensor_min", |b| b.iter(|| tensor.min(vec![]))); +} + +// Tensor Product + +fn bench_tensor_product(c: &mut Criterion) { + let shape_a = Shape::new(vec![100, 100]).unwrap(); + let shape_b = Shape::new(vec![100, 100]).unwrap(); + let tensor_a = Tensor::::ones(&shape_a); + let tensor_b = Tensor::::ones(&shape_b); + c.bench_function("tensor_product", |b| b.iter(|| tensor_a.prod(&tensor_b))); +} + +// Matrix Multiplication + +fn bench_matmul(c: &mut Criterion) { + let shape_a = Shape::new(vec![100, 100]).unwrap(); + let shape_b = Shape::new(vec![100, 100]).unwrap(); + let matrix_a = Matrix::::ones(&shape_a).unwrap(); + let matrix_b = Matrix::::ones(&shape_b).unwrap(); + c.bench_function("matrix_multiplication", |b| { + b.iter(|| matrix_a.matmul(&matrix_b)) + }); +} + +// Vector Multiplication + +fn bench_vecmul(c: &mut Criterion) { + let shape = Shape::new(vec![100]).unwrap(); + let vector_a = Vector::::ones(&shape).unwrap(); + let vector_b = Vector::::ones(&shape).unwrap(); + c.bench_function("vector_multiplication", |b| { + b.iter(|| vector_a.vecmul(&vector_b)) + }); +} + + +criterion_group!( + benches, + bench_sum, + bench_mean, + bench_var, + bench_max, + bench_min, + bench_matmul, + bench_vecmul, + bench_tensor_product, +); +criterion_main!(benches); diff --git a/src/lib.rs b/src/lib.rs index 718f954..ba89caf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,3 +7,12 @@ pub mod shape; pub mod storage; pub mod tensor; pub mod vector; + +// Re-export important structs +pub use axes::Axes; +pub use shape::Shape; +pub use tensor::Tensor; +pub use vector::Vector; +pub use matrix::Matrix; +pub use coordinate::Coordinate; +pub use error::ShapeError; From 13c4542393acf78f987a22c89b970ab7bf0115f2 Mon Sep 17 00:00:00 2001 From: Angus Stewart Date: Sun, 30 Jun 2024 20:35:59 +0100 Subject: [PATCH 2/3] style: fmt changes --- benches/tensor_bench.rs | 1 - src/lib.rs | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/benches/tensor_bench.rs b/benches/tensor_bench.rs index be8796a..e6c2e2b 100644 --- a/benches/tensor_bench.rs +++ b/benches/tensor_bench.rs @@ -66,7 +66,6 @@ fn bench_vecmul(c: &mut Criterion) { }); } - criterion_group!( benches, bench_sum, diff --git a/src/lib.rs b/src/lib.rs index ba89caf..f8fdfeb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,9 +10,9 @@ pub mod vector; // Re-export important structs pub use axes::Axes; +pub use coordinate::Coordinate; +pub use error::ShapeError; +pub use matrix::Matrix; pub use shape::Shape; pub use tensor::Tensor; pub use vector::Vector; -pub use matrix::Matrix; -pub use coordinate::Coordinate; -pub use error::ShapeError; From 8ec90027415dbdff0695f3a5213a25e0f9382993 Mon Sep 17 00:00:00 2001 From: Angus Stewart Date: Sun, 30 Jun 2024 20:36:36 +0100 Subject: [PATCH 3/3] ci: add benchmarking --- .github/workflows/test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9031df9..02d1179 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,3 +19,6 @@ jobs: - name: Rust Test run: cargo test --all-features + + - name: Rust Bench + run: cargo bench --all-features