arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-cpu-avx/src/svp.rs
poulpy-cpu-avx/src/svp.rsRaw
 1use poulpy_hal::{
 2    layouts::{Backend, Module, ScalarZnxToRef, SvpPPolOwned, SvpPPolToMut, SvpPPolToRef, VecZnxDftToMut, VecZnxDftToRef},
 3    oep::{
 4        SvpApplyDftToDftImpl, SvpApplyDftToDftInplaceImpl, SvpPPolAllocBytesImpl, SvpPPolAllocImpl, SvpPPolFromBytesImpl,
 5        SvpPrepareImpl,
 6    },
 7    reference::fft64::svp::{svp_apply_dft_to_dft, svp_apply_dft_to_dft_inplace, svp_prepare},
 8};
 9
10use crate::{FFT64Avx, module::FFT64ModuleHandle};
11
12unsafe impl SvpPPolFromBytesImpl<Self> for FFT64Avx {
13    fn svp_ppol_from_bytes_impl(n: usize, cols: usize, bytes: Vec<u8>) -> SvpPPolOwned<Self> {
14        SvpPPolOwned::from_bytes(n, cols, bytes)
15    }
16}
17
18unsafe impl SvpPPolAllocImpl<Self> for FFT64Avx {
19    fn svp_ppol_alloc_impl(n: usize, cols: usize) -> SvpPPolOwned<Self> {
20        SvpPPolOwned::alloc(n, cols)
21    }
22}
23
24unsafe impl SvpPPolAllocBytesImpl<Self> for FFT64Avx {
25    fn svp_ppol_bytes_of_impl(n: usize, cols: usize) -> usize {
26        Self::layout_prep_word_count() * n * cols * size_of::<f64>()
27    }
28}
29
30unsafe impl SvpPrepareImpl<Self> for FFT64Avx {
31    fn svp_prepare_impl<R, A>(module: &Module<Self>, res: &mut R, res_col: usize, a: &A, a_col: usize)
32    where
33        R: SvpPPolToMut<Self>,
34        A: ScalarZnxToRef,
35    {
36        svp_prepare(module.get_fft_table(), res, res_col, a, a_col);
37    }
38}
39
40unsafe impl SvpApplyDftToDftImpl<Self> for FFT64Avx {
41    fn svp_apply_dft_to_dft_impl<R, A, B>(
42        _module: &Module<Self>,
43        res: &mut R,
44        res_col: usize,
45        a: &A,
46        a_col: usize,
47        b: &B,
48        b_col: usize,
49    ) where
50        R: VecZnxDftToMut<Self>,
51        A: SvpPPolToRef<Self>,
52        B: VecZnxDftToRef<Self>,
53    {
54        svp_apply_dft_to_dft(res, res_col, a, a_col, b, b_col);
55    }
56}
57
58unsafe impl SvpApplyDftToDftInplaceImpl for FFT64Avx {
59    fn svp_apply_dft_to_dft_inplace_impl<R, A>(_module: &Module<Self>, res: &mut R, res_col: usize, a: &A, a_col: usize)
60    where
61        R: VecZnxDftToMut<Self>,
62        A: SvpPPolToRef<Self>,
63    {
64        svp_apply_dft_to_dft_inplace(res, res_col, a, a_col);
65    }
66}