arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/base2k/benches/fft.rs
base2k/benches/fft.rsRaw
 1use base2k::ffi::reim::*;
 2use criterion::{BenchmarkId, Criterion, criterion_group, criterion_main};
 3use std::ffi::c_void;
 4
 5fn fft(c: &mut Criterion) {
 6    fn forward<'a>(m: u32, log_bound: u32, reim_fft_precomp: *mut reim_fft_precomp, a: &'a [i64]) -> Box<dyn FnMut() + 'a> {
 7        unsafe {
 8            let buf_a: *mut f64 = reim_fft_precomp_get_buffer(reim_fft_precomp, 0);
 9            reim_from_znx64_simple(m as u32, log_bound as u32, buf_a as *mut c_void, a.as_ptr());
10            Box::new(move || reim_fft(reim_fft_precomp, buf_a))
11        }
12    }
13
14    fn backward<'a>(m: u32, log_bound: u32, reim_ifft_precomp: *mut reim_ifft_precomp, a: &'a [i64]) -> Box<dyn FnMut() + 'a> {
15        Box::new(move || unsafe {
16            let buf_a: *mut f64 = reim_ifft_precomp_get_buffer(reim_ifft_precomp, 0);
17            reim_from_znx64_simple(m as u32, log_bound as u32, buf_a as *mut c_void, a.as_ptr());
18            reim_ifft(reim_ifft_precomp, buf_a);
19        })
20    }
21
22    let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> = c.benchmark_group("fft");
23
24    for log_n in 10..17 {
25        let n: usize = 1 << log_n;
26        let m: usize = n >> 1;
27        let log_bound: u32 = 19;
28
29        let mut a: Vec<i64> = vec![i64::default(); n];
30        a.iter_mut().enumerate().for_each(|(i, x)| *x = i as i64);
31
32        unsafe {
33            let reim_fft_precomp: *mut reim_fft_precomp = new_reim_fft_precomp(m as u32, 1);
34            let reim_ifft_precomp: *mut reim_ifft_precomp = new_reim_ifft_precomp(m as u32, 1);
35
36            let runners: [(String, Box<dyn FnMut()>); 2] = [
37                (format!("forward"), {
38                    forward(m as u32, log_bound, reim_fft_precomp, &a)
39                }),
40                (format!("backward"), {
41                    backward(m as u32, log_bound, reim_ifft_precomp, &a)
42                }),
43            ];
44
45            for (name, mut runner) in runners {
46                let id: BenchmarkId = BenchmarkId::new(name, format!("n={}", 1 << log_n));
47                b.bench_with_input(id, &(), |b: &mut criterion::Bencher<'_>, _| {
48                    b.iter(&mut runner)
49                });
50            }
51        }
52    }
53}
54
55criterion_group!(benches, fft,);
56criterion_main!(benches);