arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-cpu-avx/benches/fft.rs
poulpy-cpu-avx/benches/fft.rsRaw
 1use std::hint::black_box;
 2
 3use criterion::{BenchmarkId, Criterion, criterion_group, criterion_main};
 4use poulpy_cpu_avx::{ReimFFTAvx, ReimIFFTAvx};
 5use poulpy_hal::reference::fft64::reim::{ReimDFTExecute, ReimFFTTable, ReimIFFTTable};
 6
 7pub fn bench_ifft_avx2_fma(c: &mut Criterion) {
 8    let group_name: String = "ifft_avx2_fma".to_string();
 9
10    let mut group = c.benchmark_group(group_name);
11
12    if std::is_x86_feature_detected!("avx2") {
13        fn runner(m: usize) -> impl FnMut() {
14            let mut values: Vec<f64> = vec![0f64; m << 1];
15
16            let scale = 1.0f64 / (2 * m) as f64;
17            values
18                .iter_mut()
19                .enumerate()
20                .for_each(|(i, x)| *x = (i + 1) as f64 * scale);
21
22            let table: ReimIFFTTable<f64> = ReimIFFTTable::<f64>::new(m);
23            move || {
24                ReimIFFTAvx::reim_dft_execute(&table, &mut values);
25                black_box(());
26            }
27        }
28
29        for log_m in [9, 10, 11, 12, 13, 14, 15] {
30            let id: BenchmarkId = BenchmarkId::from_parameter(format!("n: {}", 2 << log_m));
31
32            let mut runner = runner(1 << log_m);
33            group.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
34        }
35    } else {
36        eprintln!("skipping: CPU lacks avx2");
37        return;
38    }
39
40    group.finish();
41}
42
43pub fn bench_fft_avx2_fma(c: &mut Criterion) {
44    let group_name: String = "fft_avx2_fma".to_string();
45
46    let mut group = c.benchmark_group(group_name);
47
48    if std::is_x86_feature_detected!("avx2") {
49        fn runner(m: usize) -> impl FnMut() {
50            let mut values: Vec<f64> = vec![0f64; m << 1];
51
52            let scale = 1.0f64 / (2 * m) as f64;
53            values
54                .iter_mut()
55                .enumerate()
56                .for_each(|(i, x)| *x = (i + 1) as f64 * scale);
57
58            let table: ReimFFTTable<f64> = ReimFFTTable::<f64>::new(m);
59            move || {
60                ReimFFTAvx::reim_dft_execute(&table, &mut values);
61                black_box(());
62            }
63        }
64
65        for log_m in [9, 10, 11, 12, 13, 14, 15] {
66            let id: BenchmarkId = BenchmarkId::from_parameter(format!("n: {}", 2 << log_m));
67
68            let mut runner = runner(1 << log_m);
69            group.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
70        }
71    } else {
72        eprintln!("skipping: CPU lacks avx2");
73        return;
74    }
75
76    group.finish();
77}
78
79criterion_group!(benches_x86, bench_fft_avx2_fma, bench_ifft_avx2_fma,);
80criterion_main!(benches_x86);