{- | Simple manual implementation of embedding cufft functionality in the @accelerate@ framework. In this example, a plan is created for every transform and is run within 'CUDA.run1'. -} module Main where import qualified Data.Array.Accelerate.CUDA.Foreign as AF import qualified Data.Array.Accelerate.CUDA as CUDA import qualified Foreign.CUDA.FFT as CUFFT import qualified Data.Array.Accelerate as A import Data.Array.Accelerate (Acc, Vector, Z(Z), (:.)((:.)), ) transformForeign :: Vector Float -> AF.CIO (Vector Float) transformForeign input = let (Z:.inlen) = A.arrayShape input outlen = (div inlen 2 + 1) * 2 in do output <- AF.allocateArray (Z:.outlen) ((), iptr) <- AF.devicePtrsOfArray input ((), optr) <- AF.devicePtrsOfArray output AF.liftIO $ do h <- CUFFT.plan1D inlen CUFFT.R2C 1 CUFFT.execR2C h iptr optr return output transform :: Acc (Vector Float) -> Acc (Vector Float) transform = A.foreignAcc (AF.CUDAForeignAcc "transformForeign" $ const transformForeign) (error "no fft fallback implemented") main :: IO () main = print $ CUDA.run1 transform $ A.fromList (Z:.5) [1,0,0,0,0]