poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/arithmetic/zn_arithmetic_private.h
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/arithmetic/zn_arithmetic_private.hRaw
1#ifndef SPQLIOS_ZN_ARITHMETIC_PRIVATE_H
2#define SPQLIOS_ZN_ARITHMETIC_PRIVATE_H
3
4#include "../commons_private.h"
5#include "zn_arithmetic.h"
6#include "zn_arithmetic_plugin.h"
7
8typedef struct main_z_module_precomp_t MAIN_Z_MODULE_PRECOMP;
9struct main_z_module_precomp_t {
10 // TODO
11};
12
13typedef union z_module_precomp_t Z_MODULE_PRECOMP;
14union z_module_precomp_t {
15 MAIN_Z_MODULE_PRECOMP main;
16};
17
18void main_init_z_module_precomp(MOD_Z* module);
19
20void main_finalize_z_module_precomp(MOD_Z* module);
21
22/** @brief opaque structure that describes the modules (RnX,ZnX,TnX) and the hardware */
23struct z_module_info_t {
24 Z_MODULE_TYPE mtype;
25 Z_MODULE_VTABLE vtable;
26 Z_MODULE_PRECOMP precomp;
27 void* custom;
28 void (*custom_deleter)(void*);
29};
30
31void init_z_module_info(MOD_Z* module, Z_MODULE_TYPE mtype);
32
33void main_init_z_module_vtable(MOD_Z* module);
34
35struct tndbl_approxdecomp_gadget_t {
36 uint64_t k;
37 uint64_t ell;
38 double add_cst; // 3.2^51-(K.ell) + 1/2.(sum 2^-(i+1)K)
39 int64_t and_mask; // (2^K)-1
40 int64_t sub_cst; // 2^(K-1)
41 uint8_t rshifts[64]; // 2^(ell-1-i).K for i in [0:ell-1]
42};
43
44/** @brief sets res = gadget_decompose(a) (int8_t* output) */
45EXPORT void default_i8_approxdecomp_from_tndbl_ref(const MOD_Z* module, // N
46 const TNDBL_APPROXDECOMP_GADGET* gadget, // gadget
47 int8_t* res, uint64_t res_size, // res (in general, size ell.a_size)
48 const double* a, uint64_t a_size); // a
49
50/** @brief sets res = gadget_decompose(a) (int16_t* output) */
51EXPORT void default_i16_approxdecomp_from_tndbl_ref(const MOD_Z* module, // N
52 const TNDBL_APPROXDECOMP_GADGET* gadget, // gadget
53 int16_t* res,
54 uint64_t res_size, // res (in general, size ell.a_size)
55 const double* a, uint64_t a_size); // a
56/** @brief sets res = gadget_decompose(a) (int32_t* output) */
57EXPORT void default_i32_approxdecomp_from_tndbl_ref(const MOD_Z* module, // N
58 const TNDBL_APPROXDECOMP_GADGET* gadget, // gadget
59 int32_t* res,
60 uint64_t res_size, // res (in general, size ell.a_size)
61 const double* a, uint64_t a_size); // a
62
63/** @brief prepares a vmp matrix (contiguous row-major version) */
64EXPORT void default_zn32_vmp_prepare_contiguous_ref( //
65 const MOD_Z* module,
66 ZN32_VMP_PMAT* pmat, // output
67 const int32_t* mat, uint64_t nrows, uint64_t ncols // a
68);
69
70/** @brief prepares a vmp matrix (mat[row]+col*N points to the item) */
71EXPORT void default_zn32_vmp_prepare_dblptr_ref( //
72 const MOD_Z* module,
73 ZN32_VMP_PMAT* pmat, // output
74 const int32_t** mat, uint64_t nrows, uint64_t ncols // a
75);
76
77/** @brief prepares the ith-row of a vmp matrix with nrows and ncols */
78EXPORT void default_zn32_vmp_prepare_row_ref( //
79 const MOD_Z* module,
80 ZN32_VMP_PMAT* pmat, // output
81 const int32_t* row, uint64_t row_i, uint64_t nrows, uint64_t ncols // a
82);
83
84/** @brief applies a vmp product (int32_t* input) */
85EXPORT void default_zn32_vmp_apply_i32_ref( //
86 const MOD_Z* module, //
87 int32_t* res, uint64_t res_size, // res
88 const int32_t* a, uint64_t a_size, // a
89 const ZN32_VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols); // prep matrix
90
91/** @brief applies a vmp product (int16_t* input) */
92EXPORT void default_zn32_vmp_apply_i16_ref( //
93 const MOD_Z* module, // N
94 int32_t* res, uint64_t res_size, // res
95 const int16_t* a, uint64_t a_size, // a
96 const ZN32_VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols); // prep matrix
97
98/** @brief applies a vmp product (int8_t* input) */
99EXPORT void default_zn32_vmp_apply_i8_ref( //
100 const MOD_Z* module, // N
101 int32_t* res, uint64_t res_size, // res
102 const int8_t* a, uint64_t a_size, // a
103 const ZN32_VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols); // prep matrix
104
105/** @brief applies a vmp product (int32_t* input) */
106EXPORT void default_zn32_vmp_apply_i32_avx( //
107 const MOD_Z* module, //
108 int32_t* res, uint64_t res_size, // res
109 const int32_t* a, uint64_t a_size, // a
110 const ZN32_VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols); // prep matrix
111
112/** @brief applies a vmp product (int16_t* input) */
113EXPORT void default_zn32_vmp_apply_i16_avx( //
114 const MOD_Z* module, // N
115 int32_t* res, uint64_t res_size, // res
116 const int16_t* a, uint64_t a_size, // a
117 const ZN32_VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols); // prep matrix
118
119/** @brief applies a vmp product (int8_t* input) */
120EXPORT void default_zn32_vmp_apply_i8_avx( //
121 const MOD_Z* module, // N
122 int32_t* res, uint64_t res_size, // res
123 const int8_t* a, uint64_t a_size, // a
124 const ZN32_VMP_PMAT* pmat, uint64_t nrows, uint64_t ncols); // prep matrix
125
126// explicit conversions
127
128/** reduction mod 1, output in torus32 space */
129EXPORT void dbl_to_tn32_ref(const MOD_Z* module, //
130 int32_t* res, uint64_t res_size, // res
131 const double* a, uint64_t a_size // a
132);
133
134/** real centerlift mod 1, output in double space */
135EXPORT void tn32_to_dbl_ref(const MOD_Z* module, //
136 double* res, uint64_t res_size, // res
137 const int32_t* a, uint64_t a_size // a
138);
139
140/** round to the nearest int, output in i32 space */
141EXPORT void dbl_round_to_i32_ref(const MOD_Z* module, //
142 int32_t* res, uint64_t res_size, // res
143 const double* a, uint64_t a_size // a
144);
145
146/** small int (int32 space) to double */
147EXPORT void i32_to_dbl_ref(const MOD_Z* module, //
148 double* res, uint64_t res_size, // res
149 const int32_t* a, uint64_t a_size // a
150);
151
152/** round to the nearest int, output in int64 space */
153EXPORT void dbl_round_to_i64_ref(const MOD_Z* module, //
154 int64_t* res, uint64_t res_size, // res
155 const double* a, uint64_t a_size // a
156);
157
158/** small int (int64 space) to double */
159EXPORT void i64_to_dbl_ref(const MOD_Z* module, //
160 double* res, uint64_t res_size, // res
161 const int64_t* a, uint64_t a_size // a
162);
163
164#endif // SPQLIOS_ZN_ARITHMETIC_PRIVATE_H