poulpy/poulpy-hal/src/bench_suite/vmp.rs
poulpy-hal/src/bench_suite/vmp.rsRaw
1use std::hint::black_box;
2
3use criterion::{BenchmarkId, Criterion};
4use rand::RngCore;
5
6use crate::{
7 api::{
8 ModuleNew, ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxDftAlloc, VmpApplyDft, VmpApplyDftTmpBytes, VmpApplyDftToDft,
9 VmpApplyDftToDftAdd, VmpApplyDftToDftAddTmpBytes, VmpApplyDftToDftTmpBytes, VmpPMatAlloc, VmpPrepare, VmpPrepareTmpBytes,
10 },
11 layouts::{Backend, DataViewMut, MatZnx, Module, ScratchOwned, VecZnx, VecZnxDft, VmpPMat},
12 source::Source,
13};
14
15pub fn bench_vmp_prepare<B: Backend>(c: &mut Criterion, label: &str)
16where
17 Module<B>: ModuleNew<B> + VmpPMatAlloc<B> + VmpPrepare<B> + VmpPrepareTmpBytes,
18 ScratchOwned<B>: ScratchOwnedAlloc<B> + ScratchOwnedBorrow<B>,
19{
20 let group_name: String = format!("vmp_prepare::{label}");
21
22 let mut group = c.benchmark_group(group_name);
23
24 fn runner<B: Backend>(params: [usize; 5]) -> impl FnMut()
25 where
26 Module<B>: ModuleNew<B> + VmpPMatAlloc<B> + VmpPrepare<B> + VmpPrepareTmpBytes,
27 ScratchOwned<B>: ScratchOwnedAlloc<B> + ScratchOwnedBorrow<B>,
28 {
29 let module: Module<B> = Module::<B>::new(1 << params[0]);
30
31 let rows: usize = params[1];
32 let cols_in: usize = params[2];
33 let cols_out: usize = params[3];
34 let size: usize = params[4];
35
36 let mut source: Source = Source::new([0u8; 32]);
37
38 let mut scratch: ScratchOwned<B> = ScratchOwned::alloc(module.vmp_prepare_tmp_bytes(rows, cols_in, cols_out, size));
39
40 let mut mat: MatZnx<Vec<u8>> = MatZnx::alloc(module.n(), rows, cols_in, cols_out, size);
41 let mut pmat: VmpPMat<Vec<u8>, B> = module.vmp_pmat_alloc(rows, cols_in, cols_out, size);
42
43 source.fill_bytes(mat.data_mut());
44 source.fill_bytes(pmat.data_mut());
45
46 move || {
47 module.vmp_prepare(&mut pmat, &mat, scratch.borrow());
48 black_box(());
49 }
50 }
51
52 for params in [
53 [10, 2, 1, 2, 3],
54 [11, 4, 1, 2, 5],
55 [12, 7, 1, 2, 8],
56 [13, 15, 1, 2, 16],
57 [14, 31, 1, 2, 32],
58 ] {
59 let id = BenchmarkId::from_parameter(format!(
60 "{}x({}x{})x({}x{})",
61 1 << params[0],
62 params[2],
63 params[1],
64 params[3],
65 params[4]
66 ));
67 let mut runner = runner::<B>(params);
68 group.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
69 }
70
71 group.finish();
72}
73
74pub fn bench_vmp_apply_dft<B: Backend>(c: &mut Criterion, label: &str)
75where
76 Module<B>: ModuleNew<B> + VmpApplyDftTmpBytes + VmpApplyDft<B> + VmpPMatAlloc<B> + VecZnxDftAlloc<B>,
77 ScratchOwned<B>: ScratchOwnedAlloc<B> + ScratchOwnedBorrow<B>,
78{
79 let group_name: String = format!("vmp_apply_dft::{label}");
80
81 let mut group = c.benchmark_group(group_name);
82
83 fn runner<B: Backend>(params: [usize; 5]) -> impl FnMut()
84 where
85 Module<B>: ModuleNew<B> + VmpApplyDftTmpBytes + VmpApplyDft<B> + VmpPMatAlloc<B> + VecZnxDftAlloc<B>,
86 ScratchOwned<B>: ScratchOwnedAlloc<B> + ScratchOwnedBorrow<B>,
87 {
88 let module: Module<B> = Module::<B>::new(1 << params[0]);
89
90 let rows: usize = params[1];
91 let cols_in: usize = params[2];
92 let cols_out: usize = params[3];
93 let size: usize = params[4];
94
95 let mut source: Source = Source::new([0u8; 32]);
96
97 let mut scratch: ScratchOwned<B> = ScratchOwned::alloc(1 << 20);
98
99 let mut res: VecZnxDft<Vec<u8>, _> = module.vec_znx_dft_alloc(cols_out, size);
100 let mut a: VecZnx<Vec<u8>> = VecZnx::alloc(module.n(), cols_in, size);
101 let mut pmat: VmpPMat<Vec<u8>, B> = module.vmp_pmat_alloc(rows, cols_in, cols_out, size);
102
103 source.fill_bytes(pmat.data_mut());
104 source.fill_bytes(res.data_mut());
105 source.fill_bytes(a.data_mut());
106
107 move || {
108 module.vmp_apply_dft(&mut res, &a, &pmat, scratch.borrow());
109 black_box(());
110 }
111 }
112
113 for params in [
114 [10, 2, 1, 2, 3],
115 [11, 4, 1, 2, 5],
116 [12, 7, 1, 2, 8],
117 [13, 15, 1, 2, 16],
118 [14, 31, 1, 2, 32],
119 ] {
120 let id = BenchmarkId::from_parameter(format!(
121 "{}x({}x{})x({}x{})",
122 1 << params[0],
123 params[2],
124 params[1],
125 params[3],
126 params[4]
127 ));
128 let mut runner = runner::<B>(params);
129 group.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
130 }
131
132 group.finish();
133}
134
135pub fn bench_vmp_apply_dft_to_dft<B: Backend>(c: &mut Criterion, label: &str)
136where
137 Module<B>: ModuleNew<B> + VecZnxDftAlloc<B> + VmpPMatAlloc<B> + VmpApplyDftToDft<B> + VmpApplyDftToDftTmpBytes,
138 ScratchOwned<B>: ScratchOwnedAlloc<B> + ScratchOwnedBorrow<B>,
139{
140 let group_name: String = format!("vmp_apply_dft_to_dft::{label}");
141
142 let mut group = c.benchmark_group(group_name);
143
144 fn runner<B: Backend>(params: [usize; 5]) -> impl FnMut()
145 where
146 Module<B>: ModuleNew<B> + VecZnxDftAlloc<B> + VmpPMatAlloc<B> + VmpApplyDftToDft<B> + VmpApplyDftToDftTmpBytes,
147 ScratchOwned<B>: ScratchOwnedAlloc<B> + ScratchOwnedBorrow<B>,
148 {
149 let module: Module<B> = Module::<B>::new(1 << params[0]);
150
151 let rows: usize = params[1];
152 let cols_in: usize = params[2];
153 let cols_out: usize = params[3];
154 let size: usize = params[4];
155
156 let mut source: Source = Source::new([0u8; 32]);
157
158 let mut scratch: ScratchOwned<B> =
159 ScratchOwned::alloc(module.vmp_apply_dft_to_dft_tmp_bytes(size, size, rows, cols_in, cols_out, size));
160
161 let mut res: VecZnxDft<Vec<u8>, _> = module.vec_znx_dft_alloc(cols_out, size);
162 let mut a: VecZnxDft<Vec<u8>, _> = module.vec_znx_dft_alloc(cols_in, size);
163
164 let mut pmat: VmpPMat<Vec<u8>, B> = module.vmp_pmat_alloc(rows, cols_in, cols_out, size);
165
166 source.fill_bytes(pmat.data_mut());
167 source.fill_bytes(res.data_mut());
168 source.fill_bytes(a.data_mut());
169
170 move || {
171 module.vmp_apply_dft_to_dft(&mut res, &a, &pmat, scratch.borrow());
172 black_box(());
173 }
174 }
175
176 for params in [
177 [10, 2, 1, 2, 3],
178 [11, 4, 1, 2, 5],
179 [12, 7, 1, 2, 8],
180 [13, 15, 1, 2, 16],
181 [14, 31, 1, 2, 32],
182 ] {
183 let id = BenchmarkId::from_parameter(format!(
184 "{}x({}x{})x({}x{})",
185 1 << params[0], // n
186 params[2], // cols_in
187 params[1], // size_in (=rows)
188 params[3], // cols_out
189 params[4] // size_out
190 ));
191 let mut runner = runner::<B>(params);
192 group.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
193 }
194
195 group.finish();
196}
197
198pub fn bench_vmp_apply_dft_to_dft_add<B: Backend>(c: &mut Criterion, label: &str)
199where
200 Module<B>: ModuleNew<B> + VecZnxDftAlloc<B> + VmpPMatAlloc<B> + VmpApplyDftToDftAdd<B> + VmpApplyDftToDftAddTmpBytes,
201 ScratchOwned<B>: ScratchOwnedAlloc<B> + ScratchOwnedBorrow<B>,
202{
203 let group_name: String = format!("vmp_apply_dft_to_dft_add::{label}");
204
205 let mut group = c.benchmark_group(group_name);
206
207 fn runner<B: Backend>(params: [usize; 5]) -> impl FnMut()
208 where
209 Module<B>: ModuleNew<B> + VecZnxDftAlloc<B> + VmpPMatAlloc<B> + VmpApplyDftToDftAdd<B> + VmpApplyDftToDftAddTmpBytes,
210 ScratchOwned<B>: ScratchOwnedAlloc<B> + ScratchOwnedBorrow<B>,
211 {
212 let module: Module<B> = Module::<B>::new(1 << params[0]);
213
214 let rows: usize = params[1];
215 let cols_in: usize = params[2];
216 let cols_out: usize = params[3];
217 let size: usize = params[4];
218
219 let mut source: Source = Source::new([0u8; 32]);
220
221 let mut scratch: ScratchOwned<B> =
222 ScratchOwned::alloc(module.vmp_apply_dft_to_dft_add_tmp_bytes(size, size, rows, cols_in, cols_out, size));
223
224 let mut res: VecZnxDft<Vec<u8>, _> = module.vec_znx_dft_alloc(cols_out, size);
225 let mut a: VecZnxDft<Vec<u8>, _> = module.vec_znx_dft_alloc(cols_in, size);
226
227 let mut pmat: VmpPMat<Vec<u8>, B> = module.vmp_pmat_alloc(rows, cols_in, cols_out, size);
228
229 source.fill_bytes(pmat.data_mut());
230 source.fill_bytes(res.data_mut());
231 source.fill_bytes(a.data_mut());
232
233 move || {
234 module.vmp_apply_dft_to_dft_add(&mut res, &a, &pmat, 1, scratch.borrow());
235 black_box(());
236 }
237 }
238
239 for params in [
240 [10, 2, 1, 2, 3],
241 [11, 4, 1, 2, 5],
242 [12, 7, 1, 2, 8],
243 [13, 15, 1, 2, 16],
244 [14, 31, 1, 2, 32],
245 ] {
246 let id = BenchmarkId::from_parameter(format!(
247 "{}x({}x{})x({}x{})",
248 1 << params[0],
249 params[2],
250 params[1],
251 params[3],
252 params[4]
253 ));
254 let mut runner = runner::<B>(params);
255 group.bench_with_input(id, &(), |b, _| b.iter(&mut runner));
256 }
257
258 group.finish();
259}