poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/reim/reim_fft_internal.h
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/reim/reim_fft_internal.hRaw
1#ifndef SPQLIOS_REIM_FFT_INTERNAL_H
2#define SPQLIOS_REIM_FFT_INTERNAL_H
3
4#include <math.h>
5#include <stdint.h>
6#include <stdlib.h>
7
8#include "reim_fft.h"
9
10EXPORT void reim_fftvec_addmul_fma(const REIM_FFTVEC_ADDMUL_PRECOMP* precomp, double* r, const double* a,
11 const double* b);
12EXPORT void reim_fftvec_addmul_ref(const REIM_FFTVEC_ADDMUL_PRECOMP* precomp, double* r, const double* a,
13 const double* b);
14
15EXPORT void reim_fftvec_mul_fma(const REIM_FFTVEC_MUL_PRECOMP* tables, double* r, const double* a, const double* b);
16EXPORT void reim_fftvec_mul_ref(const REIM_FFTVEC_MUL_PRECOMP* tables, double* r, const double* a, const double* b);
17
18EXPORT void reim_fftvec_add_ref(const REIM_FFTVEC_ADD_PRECOMP* tables, double* r, const double* a, const double* b);
19EXPORT void reim_fftvec_add_fma(const REIM_FFTVEC_ADD_PRECOMP* tables, double* r, const double* a, const double* b);
20
21EXPORT void reim_fftvec_sub_ref(const REIM_FFTVEC_SUB_PRECOMP* tables, double* r, const double* a, const double* b);
22EXPORT void reim_fftvec_sub_fma(const REIM_FFTVEC_SUB_PRECOMP* tables, double* r, const double* a, const double* b);
23
24/** @brief r = x from ZnX (coeffs as signed int32_t's ) to double */
25EXPORT void reim_from_znx32_ref(const REIM_FROM_ZNX32_PRECOMP* precomp, void* r, const int32_t* x);
26EXPORT void reim_from_znx32_avx2_fma(const REIM_FROM_ZNX32_PRECOMP* precomp, void* r, const int32_t* x);
27
28/** @brief r = x mod 1 (coeffs as double) */
29EXPORT void reim_to_tnx_ref(const REIM_TO_TNX_PRECOMP* tables, double* r, const double* x);
30EXPORT void reim_to_tnx_avx(const REIM_TO_TNX_PRECOMP* tables, double* r, const double* x);
31
32EXPORT void reim_from_znx64_ref(const REIM_FROM_ZNX64_PRECOMP* precomp, void* r, const int64_t* x);
33EXPORT void reim_from_znx64_bnd50_fma(const REIM_FROM_ZNX64_PRECOMP* precomp, void* r, const int64_t* x);
34
35EXPORT void reim_to_znx64_ref(const REIM_TO_ZNX64_PRECOMP* precomp, int64_t* r, const void* x);
36EXPORT void reim_to_znx64_avx2_bnd63_fma(const REIM_TO_ZNX64_PRECOMP* precomp, int64_t* r, const void* x);
37EXPORT void reim_to_znx64_avx2_bnd50_fma(const REIM_TO_ZNX64_PRECOMP* precomp, int64_t* r, const void* x);
38
39/**
40 * @brief compute the fft evaluations of P in place
41 * fft(data) = fft_rec(data, i);
42 * function fft_rec(data, omega) {
43 * if #data = 1: return data
44 * let s = sqrt(omega) w. re(s)>0
45 * let (u,v) = merge_fft(data, s)
46 * return [fft_rec(u, s), fft_rec(v, -s)]
47 * }
48 * @param tables precomputed tables (contains all the powers of omega in the order they are used)
49 * @param data vector of m complexes (coeffs as input, evals as output)
50 */
51EXPORT void reim_fft_ref(const REIM_FFT_PRECOMP* tables, double* data);
52EXPORT void reim_fft_avx2_fma(const REIM_FFT_PRECOMP* tables, double* data);
53
54/**
55 * @brief compute the ifft evaluations of P in place
56 * ifft(data) = ifft_rec(data, i);
57 * function ifft_rec(data, omega) {
58 * if #data = 1: return data
59 * let s = sqrt(omega) w. re(s)>0
60 * let (u,v) = data
61 * return split_fft([ifft_rec(u, s), ifft_rec(v, -s)],s)
62 * }
63 * @param itables precomputed tables (contains all the powers of omega in the order they are used)
64 * @param data vector of m complexes (coeffs as input, evals as output)
65 */
66EXPORT void reim_ifft_ref(const REIM_IFFT_PRECOMP* itables, double* data);
67EXPORT void reim_ifft_avx2_fma(const REIM_IFFT_PRECOMP* itables, double* data);
68
69/// new compressed implementation
70
71/** @brief naive FFT code mod X^m-exp(2i.pi.entry_pwr) */
72EXPORT void reim_naive_fft(uint64_t m, double entry_pwr, double* re, double* im);
73
74/** @brief 16-dimensional FFT with precomputed omegas */
75EXPORT void reim_fft16_neon(double* dre, double* dim, const void* omega);
76EXPORT void reim_fft16_avx_fma(double* dre, double* dim, const void* omega);
77EXPORT void reim_fft16_ref(double* dre, double* dim, const void* omega);
78
79/** @brief precompute omegas so that reim_fft16 functions */
80EXPORT void fill_reim_fft16_omegas(const double entry_pwr, double** omg);
81EXPORT void fill_reim_fft16_omegas_neon(const double entry_pwr, double** omg);
82
83/** @brief 8-dimensional FFT with precomputed omegas */
84EXPORT void reim_fft8_avx_fma(double* dre, double* dim, const void* omega);
85EXPORT void reim_fft8_ref(double* dre, double* dim, const void* omega);
86
87/** @brief precompute omegas so that reim_fft8 functions */
88EXPORT void fill_reim_fft8_omegas(const double entry_pwr, double** omg);
89
90/** @brief 4-dimensional FFT with precomputed omegas */
91EXPORT void reim_fft4_avx_fma(double* dre, double* dim, const void* omega);
92EXPORT void reim_fft4_ref(double* dre, double* dim, const void* omega);
93
94/** @brief precompute omegas so that reim_fft8 functions */
95EXPORT void fill_reim_fft4_omegas(const double entry_pwr, double** omg);
96
97/** @brief 2-dimensional FFT with precomputed omegas */
98// EXPORT void reim_fft4_avx_fma(double* dre, double* dim, const void* omega);
99EXPORT void reim_fft2_ref(double* dre, double* dim, const void* omega);
100
101/** @brief precompute omegas so that reim_fft8 functions */
102EXPORT void fill_reim_fft2_omegas(const double entry_pwr, double** omg);
103
104EXPORT void reim_fft_bfs_16_ref(uint64_t m, double* re, double* im, double** omg);
105EXPORT void fill_reim_fft_bfs_16_omegas(uint64_t m, double entry_pwr, double** omg);
106
107EXPORT void reim_fft_rec_16_ref(uint64_t m, double* re, double* im, double** omg);
108EXPORT void fill_reim_fft_rec_16_omegas(uint64_t m, double entry_pwr, double** omg);
109
110/** @brief naive FFT code mod X^m-exp(2i.pi.entry_pwr) */
111EXPORT void reim_naive_ifft(uint64_t m, double entry_pwr, double* re, double* im);
112
113/** @brief 16-dimensional FFT with precomputed omegas */
114EXPORT void reim_ifft16_avx_fma(double* dre, double* dim, const void* omega);
115EXPORT void reim_ifft16_ref(double* dre, double* dim, const void* omega);
116
117/** @brief precompute omegas so that reim_fft16 functions */
118EXPORT void fill_reim_ifft16_omegas(const double entry_pwr, double** omg);
119
120/** @brief 8-dimensional FFT with precomputed omegas */
121EXPORT void reim_ifft8_avx_fma(double* dre, double* dim, const void* omega);
122EXPORT void reim_ifft8_ref(double* dre, double* dim, const void* omega);
123
124/** @brief precompute omegas so that reim_fft8 functions */
125EXPORT void fill_reim_ifft8_omegas(const double entry_pwr, double** omg);
126
127/** @brief 4-dimensional FFT with precomputed omegas */
128EXPORT void reim_ifft4_avx_fma(double* dre, double* dim, const void* omega);
129EXPORT void reim_ifft4_ref(double* dre, double* dim, const void* omega);
130
131/** @brief precompute omegas so that reim_fft8 functions */
132EXPORT void fill_reim_ifft4_omegas(const double entry_pwr, double** omg);
133
134/** @brief 2-dimensional FFT with precomputed omegas */
135// EXPORT void reim_ifft2_avx_fma(double* dre, double* dim, const void* omega);
136EXPORT void reim_ifft2_ref(double* dre, double* dim, const void* omega);
137
138/** @brief precompute omegas so that reim_fft8 functions */
139EXPORT void fill_reim_ifft2_omegas(const double entry_pwr, double** omg);
140
141EXPORT void reim_ifft_bfs_16_ref(uint64_t m, double* re, double* im, double** omg);
142EXPORT void fill_reim_ifft_bfs_16_omegas(uint64_t m, double entry_pwr, double** omg);
143
144EXPORT void reim_ifft_rec_16_ref(uint64_t m, double* re, double* im, double** omg);
145EXPORT void fill_reim_ifft_rec_16_omegas(uint64_t m, double entry_pwr, double** omg);
146
147#endif // SPQLIOS_REIM_FFT_INTERNAL_H