poulpy/poulpy-cpu-ref/benches/fft.rs
poulpy-cpu-ref/benches/fft.rsRaw
1use std::hint::black_box;
2
3use criterion::{BenchmarkId, Criterion, criterion_group, criterion_main};
4use poulpy_hal::reference::fft64::reim::{ReimDFTExecute, ReimFFTRef, ReimFFTTable, ReimIFFTRef, ReimIFFTTable};
5
6pub fn bench_fft_ref(c: &mut Criterion) {
7 let group_name: String = "fft_ref".to_string();
8
9 let mut group = c.benchmark_group(group_name);
10
11 fn runner(m: usize) -> impl FnMut() {
12 let mut values: Vec<f64> = vec![0f64; m << 1];
13 let scale: f64 = 1.0f64 / (2 * m) as f64;
14 values
15 .iter_mut()
16 .enumerate()
17 .for_each(|(i, x)| *x = (i + 1) as f64 * scale);
18 let table: ReimFFTTable<f64> = ReimFFTTable::<f64>::new(m);
19 move || {
20 ReimFFTRef::reim_dft_execute(&table, &mut values);
21 black_box(());
22 }
23 }
24
25 for log_m in [9, 10, 11, 12, 13, 14, 15] {
26 let id: BenchmarkId = BenchmarkId::from_parameter(format!("n: {}", 2 << log_m));
27 let mut runner = runner(1 << log_m);
28 group.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
29 }
30
31 group.finish();
32}
33
34pub fn bench_ifft_ref(c: &mut Criterion) {
35 let group_name: String = "ifft_ref".to_string();
36
37 let mut group = c.benchmark_group(group_name);
38
39 fn runner(m: usize) -> impl FnMut() {
40 let mut values: Vec<f64> = vec![0f64; m << 1];
41 let scale: f64 = 1.0f64 / (2 * m) as f64;
42 values
43 .iter_mut()
44 .enumerate()
45 .for_each(|(i, x)| *x = (i + 1) as f64 * scale);
46 let table: ReimIFFTTable<f64> = ReimIFFTTable::<f64>::new(m);
47 move || {
48 ReimIFFTRef::reim_dft_execute(&table, &mut values);
49 black_box(());
50 }
51 }
52
53 for log_m in [9, 10, 11, 12, 13, 14, 15] {
54 let id: BenchmarkId = BenchmarkId::from_parameter(format!("n: {}", 2 << log_m));
55 let mut runner = runner(1 << log_m);
56 group.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
57 }
58
59 group.finish();
60}
61
62criterion_group!(benches, bench_fft_ref, bench_ifft_ref,);
63
64criterion_main!(benches);