module Data.Array.Accelerate.CUFFT.Batched (
Priv.Transform,
Priv.transform,
Handle,
plan1D,
plan2D,
plan3D,
RC.Real,
Mode,
Priv.forwardComplex, Priv.inverseComplex,
Priv.forwardReal, Priv.inverseReal,
Batch0, Batch1, Batch2, Batch3,
) where
import qualified Data.Array.Accelerate.CUFFT.Private as Priv
import Data.Array.Accelerate.CUFFT.Private
(Batch0, Batch1, Batch2, Batch3,
Mode, wrapFallback, Handle, makeHandle, )
import qualified Data.Array.Accelerate.CUFFT.RealClass as RC
import qualified Data.Array.Accelerate.Fourier.Planned as Fourier
import qualified Data.Array.Accelerate as A
import Data.Array.Accelerate (Elt, Shape, Slice, (:.)((:.)), )
import qualified Foreign.CUDA.FFT as CUFFT
plan1D ::
(Shape sh, Slice sh, Elt e, RC.Real e) =>
Mode (Batch1 sh) e a b -> Batch1 sh -> IO (Handle (Batch1 sh) e a b)
plan1D mode (batch:.width) =
makeHandle mode width
(\sign -> wrapFallback mode $ Fourier.transform sign width)
(\typ -> CUFFT.planMany [width] Nothing Nothing typ (A.arraySize batch))
plan2D ::
(Shape sh, Slice sh, Elt e, RC.Real e) =>
Mode (Batch2 sh) e a b -> Batch2 sh -> IO (Handle (Batch2 sh) e a b)
plan2D mode sh@(batch:.height:.width) =
makeHandle mode width
(wrapFallback mode . Priv.transform2D sh)
(\typ ->
CUFFT.planMany [height,width] Nothing Nothing typ (A.arraySize batch))
plan3D ::
(Shape sh, Slice sh, Elt e, RC.Real e) =>
Mode (Batch3 sh) e a b ->
Batch3 sh -> IO (Handle (Batch3 sh) e a b)
plan3D mode sh@(batch:.depth:.height:.width) =
makeHandle mode width
(wrapFallback mode . Priv.transform3D sh)
(\typ ->
CUFFT.planMany [depth,height,width]
Nothing Nothing typ (A.arraySize batch))