poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/arithmetic/vec_rnx_arithmetic_private.h
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/arithmetic/vec_rnx_arithmetic_private.hRaw
1#ifndef SPQLIOS_VEC_RNX_ARITHMETIC_PRIVATE_H
2#define SPQLIOS_VEC_RNX_ARITHMETIC_PRIVATE_H
3
4#include "../commons_private.h"
5#include "../reim/reim_fft.h"
6#include "vec_rnx_arithmetic.h"
7#include "vec_rnx_arithmetic_plugin.h"
8
9typedef struct fft64_rnx_module_precomp_t FFT64_RNX_MODULE_PRECOMP;
10struct fft64_rnx_module_precomp_t {
11 REIM_FFT_PRECOMP* p_fft;
12 REIM_IFFT_PRECOMP* p_ifft;
13 REIM_FFTVEC_ADD_PRECOMP* p_fftvec_add;
14 REIM_FFTVEC_MUL_PRECOMP* p_fftvec_mul;
15 REIM_FFTVEC_ADDMUL_PRECOMP* p_fftvec_addmul;
16};
17
18typedef union rnx_module_precomp_t RNX_MODULE_PRECOMP;
19union rnx_module_precomp_t {
20 FFT64_RNX_MODULE_PRECOMP fft64;
21};
22
23void fft64_init_rnx_module_precomp(MOD_RNX* module);
24
25void fft64_finalize_rnx_module_precomp(MOD_RNX* module);
26
27/** @brief opaque structure that describes the modules (RnX,ZnX,TnX) and the hardware */
28struct rnx_module_info_t {
29 uint64_t n;
30 uint64_t m;
31 RNX_MODULE_TYPE mtype;
32 RNX_MODULE_VTABLE vtable;
33 RNX_MODULE_PRECOMP precomp;
34 void* custom;
35 void (*custom_deleter)(void*);
36};
37
38void init_rnx_module_info(MOD_RNX* module, //
39 uint64_t, RNX_MODULE_TYPE mtype);
40
41void finalize_rnx_module_info(MOD_RNX* module);
42
43void fft64_init_rnx_module_vtable(MOD_RNX* module);
44
45///////////////////////////////////////////////////////////////////
46// prepared gadget decompositions (optimized) //
47///////////////////////////////////////////////////////////////////
48
49struct tnx32_approxdec_gadget_t {
50 uint64_t k;
51 uint64_t ell;
52 int32_t add_cst; // 1/2.(sum 2^-(i+1)K)
53 int32_t rshift_base; // 32 - K
54 int64_t and_mask; // 2^K-1
55 int64_t or_mask; // double(2^52)
56 double sub_cst; // double(2^52 + 2^(K-1))
57 uint8_t rshifts[8]; // 32 - (i+1).K
58};
59
60struct tnx32x2_approxdec_gadget_t {
61 // TODO
62};
63
64struct tnxdbl_approxdecomp_gadget_t {
65 uint64_t k;
66 uint64_t ell;
67 double add_cst; // double(3.2^(51-ell.K) + 1/2.(sum 2^(-iK)) for i=[0,ell[)
68 uint64_t and_mask; // uint64(2^(K)-1)
69 uint64_t or_mask; // double(2^52)
70 double sub_cst; // double(2^52 + 2^(K-1))
71};
72
73EXPORT void vec_rnx_add_ref( //
74 const MOD_RNX* module, // N
75 double* res, uint64_t res_size, uint64_t res_sl, // res
76 const double* a, uint64_t a_size, uint64_t a_sl, // a
77 const double* b, uint64_t b_size, uint64_t b_sl // b
78);
79EXPORT void vec_rnx_add_avx( //
80 const MOD_RNX* module, // N
81 double* res, uint64_t res_size, uint64_t res_sl, // res
82 const double* a, uint64_t a_size, uint64_t a_sl, // a
83 const double* b, uint64_t b_size, uint64_t b_sl // b
84);
85
86/** @brief sets res = 0 */
87EXPORT void vec_rnx_zero_ref( //
88 const MOD_RNX* module, // N
89 double* res, uint64_t res_size, uint64_t res_sl // res
90);
91
92/** @brief sets res = a */
93EXPORT void vec_rnx_copy_ref( //
94 const MOD_RNX* module, // N
95 double* res, uint64_t res_size, uint64_t res_sl, // res
96 const double* a, uint64_t a_size, uint64_t a_sl // a
97);
98
99/** @brief sets res = -a */
100EXPORT void vec_rnx_negate_ref( //
101 const MOD_RNX* module, // N
102 double* res, uint64_t res_size, uint64_t res_sl, // res
103 const double* a, uint64_t a_size, uint64_t a_sl // a
104);
105
106/** @brief sets res = -a */
107EXPORT void vec_rnx_negate_avx( //
108 const MOD_RNX* module, // N
109 double* res, uint64_t res_size, uint64_t res_sl, // res
110 const double* a, uint64_t a_size, uint64_t a_sl // a
111);
112
113/** @brief sets res = a - b */
114EXPORT void vec_rnx_sub_ref( //
115 const MOD_RNX* module, // N
116 double* res, uint64_t res_size, uint64_t res_sl, // res
117 const double* a, uint64_t a_size, uint64_t a_sl, // a
118 const double* b, uint64_t b_size, uint64_t b_sl // b
119);
120
121/** @brief sets res = a - b */
122EXPORT void vec_rnx_sub_avx( //
123 const MOD_RNX* module, // N
124 double* res, uint64_t res_size, uint64_t res_sl, // res
125 const double* a, uint64_t a_size, uint64_t a_sl, // a
126 const double* b, uint64_t b_size, uint64_t b_sl // b
127);
128
129/** @brief sets res = a . X^p */
130EXPORT void vec_rnx_rotate_ref( //
131 const MOD_RNX* module, // N
132 const int64_t p, // rotation value
133 double* res, uint64_t res_size, uint64_t res_sl, // res
134 const double* a, uint64_t a_size, uint64_t a_sl // a
135);
136
137/** @brief sets res = a(X^p) */
138EXPORT void vec_rnx_automorphism_ref( //
139 const MOD_RNX* module, // N
140 int64_t p, // X -> X^p
141 double* res, uint64_t res_size, uint64_t res_sl, // res
142 const double* a, uint64_t a_size, uint64_t a_sl // a
143);
144
145/** @brief number of bytes in a RNX_VMP_PMAT (for manual allocation) */
146EXPORT uint64_t fft64_bytes_of_rnx_vmp_pmat(const MOD_RNX* module, // N
147 uint64_t nrows, uint64_t ncols);
148
149EXPORT void fft64_rnx_vmp_apply_dft_to_dft_ref( //
150 const MOD_RNX* module, // N
151 double* res, uint64_t res_size, uint64_t res_sl, // res
152 const double* a_dft, uint64_t a_size, uint64_t a_sl, // a
153 const RNX_VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols, // prep matrix
154 uint8_t* tmp_space // scratch space (a_size*sizeof(reim4) bytes)
155);
156EXPORT void fft64_rnx_vmp_apply_dft_to_dft_avx( //
157 const MOD_RNX* module, // N
158 double* res, uint64_t res_size, uint64_t res_sl, // res
159 const double* a_dft, uint64_t a_size, uint64_t a_sl, // a
160 const RNX_VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols, // prep matrix
161 uint8_t* tmp_space // scratch space (a_size*sizeof(reim4) bytes)
162);
163EXPORT uint64_t fft64_rnx_vmp_apply_dft_to_dft_tmp_bytes_ref( //
164 const MOD_RNX* module, // N
165 uint64_t res_size, // res
166 uint64_t a_size, // a
167 uint64_t nrows, uint64_t ncols // prep matrix
168);
169EXPORT uint64_t fft64_rnx_vmp_apply_dft_to_dft_tmp_bytes_avx( //
170 const MOD_RNX* module, // N
171 uint64_t res_size, // res
172 uint64_t a_size, // a
173 uint64_t nrows, uint64_t ncols // prep matrix
174);
175EXPORT void fft64_rnx_vmp_prepare_contiguous_ref( //
176 const MOD_RNX* module, // N
177 RNX_VMP_PMAT* pmat, // output
178 const double* mat, uint64_t nrows, uint64_t ncols, // a
179 uint8_t* tmp_space // scratch space
180);
181EXPORT void fft64_rnx_vmp_prepare_contiguous_avx( //
182 const MOD_RNX* module, // N
183 RNX_VMP_PMAT* pmat, // output
184 const double* mat, uint64_t nrows, uint64_t ncols, // a
185 uint8_t* tmp_space // scratch space
186);
187EXPORT void fft64_rnx_vmp_prepare_dblptr_ref( //
188 const MOD_RNX* module, // N
189 RNX_VMP_PMAT* pmat, // output
190 const double** mat, uint64_t nrows, uint64_t ncols, // a
191 uint8_t* tmp_space // scratch space
192);
193EXPORT void fft64_rnx_vmp_prepare_dblptr_avx( //
194 const MOD_RNX* module, // N
195 RNX_VMP_PMAT* pmat, // output
196 const double** mat, uint64_t nrows, uint64_t ncols, // a
197 uint8_t* tmp_space // scratch space
198);
199EXPORT void fft64_rnx_vmp_prepare_row_ref( //
200 const MOD_RNX* module, // N
201 RNX_VMP_PMAT* pmat, // output
202 const double* mat, uint64_t row_i, uint64_t nrows, uint64_t ncols, // a
203 uint8_t* tmp_space // scratch space
204);
205EXPORT void fft64_rnx_vmp_prepare_row_avx( //
206 const MOD_RNX* module, // N
207 RNX_VMP_PMAT* pmat, // output
208 const double* mat, uint64_t row_i, uint64_t nrows, uint64_t ncols, // a
209 uint8_t* tmp_space // scratch space
210);
211EXPORT uint64_t fft64_rnx_vmp_prepare_tmp_bytes_ref(const MOD_RNX* module);
212EXPORT uint64_t fft64_rnx_vmp_prepare_tmp_bytes_avx(const MOD_RNX* module);
213
214EXPORT void fft64_rnx_vmp_apply_tmp_a_ref( //
215 const MOD_RNX* module, // N
216 double* res, uint64_t res_size, uint64_t res_sl, // res (addr must be != a)
217 double* tmpa, uint64_t a_size, uint64_t a_sl, // a (will be overwritten)
218 const RNX_VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols, // prep matrix
219 uint8_t* tmp_space // scratch space
220);
221EXPORT void fft64_rnx_vmp_apply_tmp_a_avx( //
222 const MOD_RNX* module, // N
223 double* res, uint64_t res_size, uint64_t res_sl, // res (addr must be != a)
224 double* tmpa, uint64_t a_size, uint64_t a_sl, // a (will be overwritten)
225 const RNX_VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols, // prep matrix
226 uint8_t* tmp_space // scratch space
227);
228
229EXPORT uint64_t fft64_rnx_vmp_apply_tmp_a_tmp_bytes_ref( //
230 const MOD_RNX* module, // N
231 uint64_t res_size, // res
232 uint64_t a_size, // a
233 uint64_t nrows, uint64_t ncols // prep matrix
234);
235EXPORT uint64_t fft64_rnx_vmp_apply_tmp_a_tmp_bytes_avx( //
236 const MOD_RNX* module, // N
237 uint64_t res_size, // res
238 uint64_t a_size, // a
239 uint64_t nrows, uint64_t ncols // prep matrix
240);
241
242/// gadget decompositions
243
244/** @brief sets res = gadget_decompose(a) */
245EXPORT void rnx_approxdecomp_from_tnxdbl_ref( //
246 const MOD_RNX* module, // N
247 const TNXDBL_APPROXDECOMP_GADGET* gadget, // output base 2^K
248 double* res, uint64_t res_size, uint64_t res_sl, // res
249 const double* a); // a
250EXPORT void rnx_approxdecomp_from_tnxdbl_avx( //
251 const MOD_RNX* module, // N
252 const TNXDBL_APPROXDECOMP_GADGET* gadget, // output base 2^K
253 double* res, uint64_t res_size, uint64_t res_sl, // res
254 const double* a); // a
255
256EXPORT void vec_rnx_mul_xp_minus_one_ref( //
257 const MOD_RNX* module, // N
258 const int64_t p, // rotation value
259 double* res, uint64_t res_size, uint64_t res_sl, // res
260 const double* a, uint64_t a_size, uint64_t a_sl // a
261);
262
263EXPORT void vec_rnx_to_znx32_ref( //
264 const MOD_RNX* module, // N
265 int32_t* res, uint64_t res_size, uint64_t res_sl, // res
266 const double* a, uint64_t a_size, uint64_t a_sl // a
267);
268
269EXPORT void vec_rnx_from_znx32_ref( //
270 const MOD_RNX* module, // N
271 double* res, uint64_t res_size, uint64_t res_sl, // res
272 const int32_t* a, uint64_t a_size, uint64_t a_sl // a
273);
274
275EXPORT void vec_rnx_to_tnx32_ref( //
276 const MOD_RNX* module, // N
277 int32_t* res, uint64_t res_size, uint64_t res_sl, // res
278 const double* a, uint64_t a_size, uint64_t a_sl // a
279);
280
281EXPORT void vec_rnx_from_tnx32_ref( //
282 const MOD_RNX* module, // N
283 double* res, uint64_t res_size, uint64_t res_sl, // res
284 const int32_t* a, uint64_t a_size, uint64_t a_sl // a
285);
286
287EXPORT void vec_rnx_to_tnxdbl_ref( //
288 const MOD_RNX* module, // N
289 double* res, uint64_t res_size, uint64_t res_sl, // res
290 const double* a, uint64_t a_size, uint64_t a_sl // a
291);
292
293EXPORT uint64_t fft64_bytes_of_rnx_svp_ppol(const MOD_RNX* module); // N
294
295/** @brief prepares a svp polynomial */
296EXPORT void fft64_rnx_svp_prepare_ref(const MOD_RNX* module, // N
297 RNX_SVP_PPOL* ppol, // output
298 const double* pol // a
299);
300
301/** @brief apply a svp product, result = ppol * a, presented in DFT space */
302EXPORT void fft64_rnx_svp_apply_ref( //
303 const MOD_RNX* module, // N
304 double* res, uint64_t res_size, uint64_t res_sl, // output
305 const RNX_SVP_PPOL* ppol, // prepared pol
306 const double* a, uint64_t a_size, uint64_t a_sl // a
307);
308
309#endif // SPQLIOS_VEC_RNX_ARITHMETIC_PRIVATE_H