arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/benches/operations.rs
benches/operations.rsRaw
 1use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
 2use math::ring::Ring;
 3use math::modulus::Operations;
 4use math::modulus::montgomery::Montgomery;
 5use math::modulus::{NONE, ONCE};
 6
 7const CHUNK: usize= 8;
 8
 9fn add_vec_unary(c: &mut Criterion) {
10    fn runner(r: Ring<u64>) -> Box<dyn FnMut()> {
11        
12        let mut p0: math::poly::Poly<u64> = r.new_poly();
13        let mut p1: math::poly::Poly<u64> = r.new_poly();
14        for i in 0..p0.n(){
15            p0.0[i] = i as u64;
16            p1.0[i] = i as u64;
17        }
18        Box::new(move || {
19            r.modulus.add_vec_unary_assign::<CHUNK, ONCE>(&p0.0, &mut p1.0);
20        })
21    }
22
23    let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> = c.benchmark_group("add_vec_unary");
24    for log_n in 11..17 {
25
26        let n: usize = 1<<log_n as usize;
27        let q_base: u64 = 0x1fffffffffe00001u64;
28        let q_power: usize = 1usize;
29        let r: Ring<u64> = Ring::<u64>::new(n, q_base, q_power);
30        let runners = [
31            ("prime", {
32                runner(r)
33            }),
34        ];
35        for (name, mut runner) in runners {
36            let id = BenchmarkId::new(name, n);
37            b.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
38        }
39    }
40}
41
42fn mul_vec_montgomery_external_unary_assign(c: &mut Criterion) {
43    fn runner(r: Ring<u64>) -> Box<dyn FnMut()> {
44        
45        let mut p0: math::poly::Poly<Montgomery<u64>> = r.new_poly_montgomery();
46        let mut p1: math::poly::Poly<u64> = r.new_poly();
47        for i in 0..p0.n(){
48            p0.0[i] = r.modulus.montgomery.prepare::<ONCE>(i as u64);
49            p1.0[i] = i as u64;
50        }
51        Box::new(move || {
52            r.modulus.mul_vec_montgomery_external_unary_assign::<CHUNK, NONE>(&p0.0, &mut p1.0);
53        })
54    }
55
56    let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> = c.benchmark_group("mul_vec_montgomery_external_unary_assign");
57    for log_n in 11..17 {
58
59        let n: usize = 1<<log_n as usize;
60        let q_base: u64 = 0x1fffffffffe00001u64;
61        let q_power: usize = 1usize;
62        let r: Ring<u64> = Ring::<u64>::new(n, q_base, q_power);
63        let runners = [
64            ("prime", {
65                runner(r)
66            }),
67        ];
68        for (name, mut runner) in runners {
69            let id = BenchmarkId::new(name, n);
70            b.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
71        }
72    }
73}
74
75criterion_group!(benches, add_vec_unary, mul_vec_montgomery_external_unary_assign);
76criterion_main!(benches);