poulpy/math/benches/ntt.rs
math/benches/ntt.rsRaw
1use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
2use math::modulus::WordOps;
3use math::ring::Ring;
4use math::poly::Poly;
5
6fn ntt(c: &mut Criterion) {
7
8 fn runner<'a, const INPLACE: bool, const LAZY:bool>(ring: &'a Ring<u64>) -> Box<dyn FnMut() + 'a > {
9 let mut a: Poly<u64> = ring.new_poly();
10 for i in 0..a.n() {
11 a.0[i] = i as u64;
12 }
13 if INPLACE{
14 Box::new(move || ring.ntt_inplace::<LAZY>(&mut a))
15 }else{
16 let mut b: Poly<u64> = ring.new_poly();
17 Box::new(move || ring.ntt::<LAZY>(&a, &mut b))
18 }
19 }
20
21 let q: u64 = 0x1fffffffffe00001u64;
22
23 let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> =
24 c.benchmark_group("ntt");
25
26 for log_n in 10..17 {
27
28 let ring = Ring::new(1<<log_n, q, 1);
29
30 let runners: [(String, Box<dyn FnMut()>); 4] = [
31 (format!("inplace=true/LAZY=true/q={}", q.log2()), { runner::<true, true>(&ring) }),
32 (format!("inplace=true/LAZY=false/q={}", q.log2()), { runner::<true, false>(&ring) }),
33 (format!("inplace=false/LAZY=true/q={}", q.log2()), { runner::<false, true>(&ring) }),
34 (format!("inplace=false/LAZY=false/q={}", q.log2()), { runner::<false, false>(&ring) }),
35 ];
36
37 for (name, mut runner) in runners {
38 let id: BenchmarkId = BenchmarkId::new(name, format!("n={}", 1 << log_n));
39 b.bench_with_input(id, &(), |b: &mut criterion::Bencher<'_>, _| b.iter(&mut runner));
40 }
41 }
42}
43
44fn intt(c: &mut Criterion) {
45
46 fn runner<'a, const INPLACE: bool, const LAZY:bool>(ring: &'a Ring<u64>) -> Box<dyn FnMut() + 'a > {
47 let mut a: Poly<u64> = ring.new_poly();
48 for i in 0..a.n() {
49 a.0[i] = i as u64;
50 }
51 if INPLACE{
52 Box::new(move || ring.intt_inplace::<LAZY>(&mut a))
53 }else{
54 let mut b: Poly<u64> = ring.new_poly();
55 Box::new(move || ring.intt::<LAZY>(&a, &mut b))
56 }
57 }
58
59 let q: u64 = 0x1fffffffffe00001u64;
60
61 let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> =
62 c.benchmark_group("intt");
63
64 for log_n in 10..17 {
65
66 let ring = Ring::new(1<<log_n, q, 1);
67
68 let runners: [(String, Box<dyn FnMut()>); 4] = [
69 (format!("inplace=true/LAZY=true/q={}", q.log2()), { runner::<true, true>(&ring) }),
70 (format!("inplace=true/LAZY=false/q={}", q.log2()), { runner::<true, false>(&ring) }),
71 (format!("inplace=false/LAZY=true/q={}", q.log2()), { runner::<false, true>(&ring) }),
72 (format!("inplace=false/LAZY=false/q={}", q.log2()), { runner::<false, false>(&ring) }),
73 ];
74
75 for (name, mut runner) in runners {
76 let id: BenchmarkId = BenchmarkId::new(name, format!("n={}", 1 << log_n));
77 b.bench_with_input(id, &(), |b: &mut criterion::Bencher<'_>, _| b.iter(&mut runner));
78 }
79 }
80}
81
82criterion_group!(
83 benches,
84 ntt,
85 intt,
86);
87criterion_main!(benches);