Skip to content

Commit 6637ddc

Browse files
authored
Benchmark for fft (#92)
1 parent 294ee35 commit 6637ddc

File tree

6 files changed

+66
-1
lines changed

6 files changed

+66
-1
lines changed

math/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,7 @@ harness = false
2121
[[bench]]
2222
name = "field_benchmarks"
2323
harness = false
24+
25+
[[bench]]
26+
name = "fft_benchmarks"
27+
harness = false

math/benches/all_benchmarks.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ mod benchmarks;
44

55
fn run_all_benchmarks(c: &mut Criterion) {
66
benchmarks::field::u64_benchmark(c);
7+
benchmarks::fft::fft_benchmark(c);
8+
benchmarks::fft::inverse_fft_benchmark(c);
79
}
810

911
criterion_group!(benches, run_all_benchmarks);

math/benches/benchmarks/fft.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
use const_random::const_random;
2+
use criterion::{black_box, Criterion};
3+
use lambdaworks_math::fft::fft_cooley_tukey::{fft, inverse_fft};
4+
use lambdaworks_math::field::element::FieldElement;
5+
use lambdaworks_math::field::test_fields::u64_test_field::U64TestField;
6+
use rand::Rng;
7+
8+
// Mersenne prime numbers
9+
// https://www.math.utah.edu/~pa/math/mersenne.html
10+
const PRIMES: [u64; 39] = [
11+
13, 17, 19, 31, 61, 89, 107, 127, 521, 607, 1279, 2203, 2281, 3217, 4253, 4423, 9689, 9941,
12+
11213, 19937, 21701, 23209, 44497, 86243, 110503, 132049, 216091, 756839, 859433, 1257787,
13+
1398269, 2976221, 3021377, 6972593, 13466917, 20996011, 24036583, 25964951, 30402457,
14+
];
15+
16+
const MODULUS: u64 = PRIMES[const_random!(usize) % PRIMES.len()];
17+
type FE = FieldElement<U64TestField<MODULUS>>;
18+
19+
pub fn fft_benchmark(c: &mut Criterion) {
20+
c.bench_function("fft", |bench| {
21+
let mut rng = rand::thread_rng();
22+
let coeffs_size = 1 << rng.gen_range(1..8);
23+
let mut coeffs: Vec<FE> = vec![];
24+
25+
for _ in 0..coeffs_size {
26+
coeffs.push(FE::new(rng.gen_range(1..=u64::MAX)));
27+
}
28+
29+
bench.iter(|| fft(black_box(&coeffs)));
30+
});
31+
}
32+
33+
pub fn inverse_fft_benchmark(c: &mut Criterion) {
34+
c.bench_function("inverse_fft", |bench| {
35+
let mut rng = rand::thread_rng();
36+
let coeffs_size = 1 << rng.gen_range(1..8);
37+
let mut coeffs: Vec<FE> = vec![];
38+
39+
for _ in 0..coeffs_size {
40+
coeffs.push(FE::new(rng.gen_range(1..=u64::MAX)));
41+
}
42+
43+
let evaluations = fft(&coeffs).unwrap();
44+
45+
bench.iter(|| inverse_fft(black_box(&evaluations)));
46+
});
47+
}

math/benches/benchmarks/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
#![allow(dead_code)]
22

3+
pub mod fft;
34
pub mod field;

math/benches/fft_benchmarks.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
use criterion::{criterion_group, criterion_main, Criterion};
2+
3+
mod benchmarks;
4+
5+
fn run_fft_benchmarks(c: &mut Criterion) {
6+
benchmarks::fft::fft_benchmark(c);
7+
benchmarks::fft::inverse_fft_benchmark(c);
8+
}
9+
10+
criterion_group!(benches, run_fft_benchmarks);
11+
criterion_main!(benches);

math/src/field/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ pub mod extensions;
55
/// Implementation of particular cases of fields.
66
pub mod fields;
77
/// Field for test purposes.
8-
pub(crate) mod test_fields;
8+
pub mod test_fields;
99
/// Common behaviour for field elements.
1010
pub mod traits;

0 commit comments

Comments
 (0)