arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/backend/src/implementation/cpu_spqlios/svp_ppol_fft64.rs
backend/src/implementation/cpu_spqlios/svp_ppol_fft64.rsRaw
  1use crate::{
  2    hal::{
  3        api::{ZnxInfos, ZnxSliceSize, ZnxView, ZnxViewMut},
  4        layouts::{
  5            Data, DataRef, Module, ScalarZnxToRef, SvpPPol, SvpPPolBytesOf, SvpPPolOwned, SvpPPolToMut, SvpPPolToRef, VecZnxDft,
  6            VecZnxDftToMut, VecZnxDftToRef,
  7        },
  8        oep::{SvpApplyImpl, SvpApplyInplaceImpl, SvpPPolAllocBytesImpl, SvpPPolAllocImpl, SvpPPolFromBytesImpl, SvpPrepareImpl},
  9    },
 10    implementation::cpu_spqlios::{
 11        ffi::{svp, vec_znx_dft::vec_znx_dft_t},
 12        module_fft64::FFT64,
 13    },
 14};
 15
 16const SVP_PPOL_FFT64_WORD_SIZE: usize = 1;
 17
 18impl<D: Data> SvpPPolBytesOf for SvpPPol<D, FFT64> {
 19    fn bytes_of(n: usize, cols: usize) -> usize {
 20        SVP_PPOL_FFT64_WORD_SIZE * n * cols * size_of::<f64>()
 21    }
 22}
 23
 24impl<D: Data> ZnxSliceSize for SvpPPol<D, FFT64> {
 25    fn sl(&self) -> usize {
 26        SVP_PPOL_FFT64_WORD_SIZE * self.n()
 27    }
 28}
 29
 30impl<D: DataRef> ZnxView for SvpPPol<D, FFT64> {
 31    type Scalar = f64;
 32}
 33
 34unsafe impl SvpPPolFromBytesImpl<Self> for FFT64 {
 35    fn svp_ppol_from_bytes_impl(n: usize, cols: usize, bytes: Vec<u8>) -> SvpPPolOwned<Self> {
 36        SvpPPolOwned::from_bytes(n, cols, bytes)
 37    }
 38}
 39
 40unsafe impl SvpPPolAllocImpl<Self> for FFT64 {
 41    fn svp_ppol_alloc_impl(n: usize, cols: usize) -> SvpPPolOwned<Self> {
 42        SvpPPolOwned::alloc(n, cols)
 43    }
 44}
 45
 46unsafe impl SvpPPolAllocBytesImpl<Self> for FFT64 {
 47    fn svp_ppol_alloc_bytes_impl(n: usize, cols: usize) -> usize {
 48        SvpPPol::<Vec<u8>, Self>::bytes_of(n, cols)
 49    }
 50}
 51
 52unsafe impl SvpPrepareImpl<Self> for FFT64 {
 53    fn svp_prepare_impl<R, A>(module: &Module<Self>, res: &mut R, res_col: usize, a: &A, a_col: usize)
 54    where
 55        R: SvpPPolToMut<Self>,
 56        A: ScalarZnxToRef,
 57    {
 58        unsafe {
 59            svp::svp_prepare(
 60                module.ptr(),
 61                res.to_mut().at_mut_ptr(res_col, 0) as *mut svp::svp_ppol_t,
 62                a.to_ref().at_ptr(a_col, 0),
 63            )
 64        }
 65    }
 66}
 67
 68unsafe impl SvpApplyImpl<Self> for FFT64 {
 69    fn svp_apply_impl<R, A, B>(module: &Module<Self>, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &B, b_col: usize)
 70    where
 71        R: VecZnxDftToMut<Self>,
 72        A: SvpPPolToRef<Self>,
 73        B: VecZnxDftToRef<Self>,
 74    {
 75        let mut res: VecZnxDft<&mut [u8], Self> = res.to_mut();
 76        let a: SvpPPol<&[u8], Self> = a.to_ref();
 77        let b: VecZnxDft<&[u8], Self> = b.to_ref();
 78        unsafe {
 79            svp::svp_apply_dft_to_dft(
 80                module.ptr(),
 81                res.at_mut_ptr(res_col, 0) as *mut vec_znx_dft_t,
 82                res.size() as u64,
 83                res.cols() as u64,
 84                a.at_ptr(a_col, 0) as *const svp::svp_ppol_t,
 85                b.at_ptr(b_col, 0) as *const vec_znx_dft_t,
 86                b.size() as u64,
 87                b.cols() as u64,
 88            )
 89        }
 90    }
 91}
 92
 93unsafe impl SvpApplyInplaceImpl for FFT64 {
 94    fn svp_apply_inplace_impl<R, A>(module: &Module<Self>, res: &mut R, res_col: usize, a: &A, a_col: usize)
 95    where
 96        R: VecZnxDftToMut<Self>,
 97        A: SvpPPolToRef<Self>,
 98    {
 99        let mut res: VecZnxDft<&mut [u8], Self> = res.to_mut();
100        let a: SvpPPol<&[u8], Self> = a.to_ref();
101        unsafe {
102            svp::svp_apply_dft_to_dft(
103                module.ptr(),
104                res.at_mut_ptr(res_col, 0) as *mut vec_znx_dft_t,
105                res.size() as u64,
106                res.cols() as u64,
107                a.at_ptr(a_col, 0) as *const svp::svp_ppol_t,
108                res.at_ptr(res_col, 0) as *const vec_znx_dft_t,
109                res.size() as u64,
110                res.cols() as u64,
111            )
112        }
113    }
114}