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