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