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);