arnaucube
arnaucube/poulpyPublic Self-hosted repository
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