cufft-0.1.0.2: Foreign/CUDA/FFT/Execute.chs
{-# LANGUAGE CPP #-}
{-# LANGUAGE ForeignFunctionInterface #-}
module Foreign.CUDA.FFT.Execute (
execC2C,execZ2Z,
execR2C,execD2Z,
execC2R,execZ2D,
) where
-- Friends
import Foreign.CUDA.FFT.Error
import Foreign.CUDA.FFT.Plan
import Foreign.CUDA.FFT.Internal.C2HS
import Foreign.CUDA.Ptr
-- System
import Foreign
import Foreign.C
#include <cbits/wrap.h>
{# context lib="cufft" #}
-- | Executes a single-precision complex-to-complex transform plan in the
-- transform direction specified by the fourth argument
--
execC2C :: Handle -> DevicePtr Float -> DevicePtr Float -> Int -> IO ()
execC2C ctx i o dir = nothingIfOk =<< cufftExecC2C ctx i o dir
{# fun unsafe cufftExecC2C
{ useHandle `Handle'
, useDev `DevicePtr Float'
, useDev `DevicePtr Float'
, `Int' } -> `Result' cToEnum #}
where
useDev = useDevicePtr . castDevPtr
-- | Executes a double-precision complex-to-complex transform plan in the
-- transform direction specified by the fourth argument
--
execZ2Z :: Handle -> DevicePtr Double -> DevicePtr Double -> Int -> IO ()
execZ2Z ctx i o dir = nothingIfOk =<< cufftExecZ2Z ctx i o dir
{# fun unsafe cufftExecZ2Z
{ useHandle `Handle'
, useDev `DevicePtr Double'
, useDev `DevicePtr Double'
, `Int' } -> `Result' cToEnum #}
where
useDev = useDevicePtr . castDevPtr
-- | Executes a single-precision real-to-complex (implicitly forward)
-- transform plan
--
execR2C :: Handle -> DevicePtr Float -> DevicePtr Float -> IO ()
execR2C ctx i o = nothingIfOk =<< cufftExecR2C ctx i o
{# fun unsafe cufftExecR2C
{ useHandle `Handle'
, useDev `DevicePtr Float'
, useDev `DevicePtr Float' } -> `Result' cToEnum #}
where
useDev = useDevicePtr . castDevPtr
-- | Executes a double-precision real-to-complex (implicitly forward)
-- transform plan
--
execD2Z :: Handle -> DevicePtr Double -> DevicePtr Double -> IO ()
execD2Z ctx i o = nothingIfOk =<< cufftExecD2Z ctx i o
{# fun unsafe cufftExecD2Z
{ useHandle `Handle'
, useDev `DevicePtr Double'
, useDev `DevicePtr Double' } -> `Result' cToEnum #}
where
useDev = useDevicePtr . castDevPtr
-- | Executes a single-precision complex-to-real (implicitly forward)
-- transform plan
--
execC2R :: Handle -> DevicePtr Float -> DevicePtr Float -> IO ()
execC2R ctx i o = nothingIfOk =<< cufftExecC2R ctx i o
{# fun unsafe cufftExecC2R
{ useHandle `Handle'
, useDev `DevicePtr Float'
, useDev `DevicePtr Float' } -> `Result' cToEnum #}
where
useDev = useDevicePtr . castDevPtr
-- | Executes a double-precision complex-to-real (implicitly forward)
-- transform plan
--
execZ2D :: Handle -> DevicePtr Double -> DevicePtr Double -> IO ()
execZ2D ctx i o = nothingIfOk =<< cufftExecZ2D ctx i o
{# fun unsafe cufftExecZ2D
{ useHandle `Handle'
, useDev `DevicePtr Double'
, useDev `DevicePtr Double' } -> `Result' cToEnum #}
where
useDev = useDevicePtr . castDevPtr