poulpy/benches/operations.rs
benches/operations.rsRaw
1use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
2use math::ring::Ring;
3use math::modulus::VecOperations;
4use math::modulus::montgomery::Montgomery;
5use math::modulus::{BARRETT, ONCE};
6
7const CHUNK: usize= 8;
8
9fn vec_add_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.vec_add_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 vec_mul_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();
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.vec_mul_montgomery_external_unary_assign::<CHUNK, ONCE>(&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
75fn vec_mul_montgomery_external_binary_assign(c: &mut Criterion) {
76 fn runner(r: Ring<u64>) -> Box<dyn FnMut()> {
77
78 let mut p0: math::poly::Poly<Montgomery<u64>> = r.new_poly();
79 let mut p1: math::poly::Poly<u64> = r.new_poly();
80 let mut p2: math::poly::Poly<u64> = r.new_poly();
81 for i in 0..p0.n(){
82 p0.0[i] = r.modulus.montgomery.prepare::<ONCE>(i as u64);
83 p1.0[i] = i as u64;
84 }
85 Box::new(move || {
86 r.modulus.vec_mul_montgomery_external_binary_assign::<CHUNK,ONCE>(&p0.0, & p1.0, &mut p2.0);
87 })
88 }
89
90 let mut b: criterion::BenchmarkGroup<'_, criterion::measurement::WallTime> = c.benchmark_group("mul_vec_montgomery_external_binary_assign");
91 for log_n in 11..17 {
92
93 let n: usize = 1<<log_n as usize;
94 let q_base: u64 = 0x1fffffffffe00001u64;
95 let q_power: usize = 1usize;
96 let r: Ring<u64> = Ring::<u64>::new(n, q_base, q_power);
97 let runners = [
98 ("prime", {
99 runner(r)
100 }),
101 ];
102 for (name, mut runner) in runners {
103 let id = BenchmarkId::new(name, n);
104 b.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
105 }
106 }
107}
108
109criterion_group!(benches, vec_add_unary, vec_mul_montgomery_external_unary_assign, vec_mul_montgomery_external_binary_assign);
110criterion_main!(benches);