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);