poulpy/poulpy-backend/src/cpu_fft64_ref/svp.rs
poulpy-backend/src/cpu_fft64_ref/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::cpu_fft64_ref::{FFT64Ref, module::FFT64ModuleHandle};
11
12unsafe impl SvpPPolFromBytesImpl<Self> for FFT64Ref {
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 FFT64Ref {
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 FFT64Ref {
25 fn svp_ppol_alloc_bytes_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 FFT64Ref {
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 FFT64Ref {
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 FFT64Ref {
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}