arnaucube
arnaucube/poulpyPublic Self-hosted repository
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);