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