accelerate-fftw 1.0.0.1 → 1.0.1
raw patch · 3 files changed
+50/−60 lines, 3 filesdep ~acceleratedep ~accelerate-io
Dependency ranges changed: accelerate, accelerate-io
Files
- accelerate-fftw.cabal +7/−7
- src/Data/Array/Accelerate/CArray/Conversion.hs +37/−50
- src/Data/Array/Accelerate/FFTW/Manifest.hs +6/−3
accelerate-fftw.cabal view
@@ -1,10 +1,10 @@ Name: accelerate-fftw-Version: 1.0.0.1+Version: 1.0.1 License: BSD3 License-File: LICENSE Author: Henning Thielemann <haskell@henning-thielemann.de> Maintainer: Henning Thielemann <haskell@henning-thielemann.de>-Homepage: http://hub.darcs.net/thielema/accelerate-fftw/+Homepage: https://hub.darcs.net/thielema/accelerate-fftw/ Category: Math Synopsis: Accelerate frontend to the FFTW library (Fourier transform) Description:@@ -15,21 +15,21 @@ Build-Type: Simple Source-Repository this- Tag: 1.0.0.1+ Tag: 1.0.1 Type: darcs- Location: http://hub.darcs.net/thielema/accelerate-fftw/+ Location: https://hub.darcs.net/thielema/accelerate-fftw/ Source-Repository head Type: darcs- Location: http://hub.darcs.net/thielema/accelerate-fftw/+ Location: https://hub.darcs.net/thielema/accelerate-fftw/ Library Build-Depends: fft >=0.1.7 && <0.2, carray >=0.1.5 && <0.2, storable-complex >=0.2.1 && <0.3,- accelerate-io >=1.0 && <1.1,- accelerate >=1.0 && <1.2,+ accelerate-io >=1.2 && <1.3,+ accelerate >=1.2 && <1.3, base >=4.5 && <5 GHC-Options: -Wall -fwarn-missing-import-lists
src/Data/Array/Accelerate/CArray/Conversion.hs view
@@ -2,68 +2,62 @@ {-# LANGUAGE TypeOperators #-} module Data.Array.Accelerate.CArray.Conversion where -import qualified Data.Array.Accelerate.IO as AIO+import qualified Data.Array.Accelerate.IO.Foreign.ForeignPtr as AIO import qualified Data.Array.Accelerate as A import Data.Array.Accelerate.Array.Sugar (EltRepr) import Data.Array.Accelerate (Array, DIM1, DIM2, Z(Z), (:.)((:.))) import qualified Data.Array.CArray as CArray-import Data.Array.CArray (CArray, createCArray, withCArray, rangeSize)+import Data.Array.CArray (CArray, unsafeForeignPtrToCArray, rangeSize) import Data.Ix (Ix) import Foreign.Storable.Complex () import Data.Array.Accelerate.Data.Complex (Complex)-import qualified Data.Complex as Complex import System.IO.Unsafe (unsafePerformIO)-import Foreign.ForeignPtr (withForeignPtr)-import Foreign.Ptr (Ptr)+import Foreign.ForeignPtr (ForeignPtr,) import Foreign.Storable (Storable) -import Control.Monad ((<=<))-import Data.IORef (newIORef, writeIORef, readIORef) - accFromCArrayReal1D ::- (A.Elt a, Storable a, AIO.BlockPtrs (EltRepr a) ~ Ptr a) =>+ (A.Elt a, Storable a, AIO.ForeignPtrs (EltRepr a) ~ ForeignPtr a) => CArray Int a -> Array DIM1 a accFromCArrayReal1D arr = let (len, fptr) = CArray.toForeignPtr arr- in unsafePerformIO $- withForeignPtr fptr $ \ptr -> AIO.fromPtr (Z :. len) ptr+ in AIO.fromForeignPtrs (Z :. len) fptr accFromCArrayReal2D ::- (A.Elt a, Storable a, AIO.BlockPtrs (EltRepr a) ~ Ptr a) =>+ (A.Elt a, Storable a, AIO.ForeignPtrs (EltRepr a) ~ ForeignPtr a) => CArray (Int, Int) a -> Array DIM2 a accFromCArrayReal2D arr =- unsafePerformIO $- withCArray arr $ \ptr ->- AIO.fromPtr (accDimsFromArrayBounds2D $ CArray.bounds arr) ptr+ AIO.fromForeignPtrs+ (accDimsFromArrayBounds2D $ CArray.bounds arr)+ (snd $ CArray.toForeignPtr arr) accFromCArrayComplex1D ::- (A.Elt a, Storable a, RealFloat a, AIO.BlockPtrs (EltRepr a) ~ Ptr a) =>+ (Storable a, RealFloat a, Complex a ~ ac, A.Elt ac,+ AIO.ForeignPtrs (EltRepr ac) ~ ForeignPtr ac) => CArray Int (Complex a) -> Array DIM1 (Complex a) accFromCArrayComplex1D arr = accFromCArrayComplex (accDimsFromArrayBounds1D $ CArray.bounds arr) arr accFromCArrayComplex2D ::- (A.Elt a, Storable a, RealFloat a, AIO.BlockPtrs (EltRepr a) ~ Ptr a) =>+ (Storable a, RealFloat a, Complex a ~ ac, A.Elt ac,+ AIO.ForeignPtrs (EltRepr ac) ~ ForeignPtr ac) => CArray (Int, Int) (Complex a) -> Array DIM2 (Complex a) accFromCArrayComplex2D arr = accFromCArrayComplex (accDimsFromArrayBounds2D $ CArray.bounds arr) arr accFromCArrayComplex ::- (Ix i, A.Shape sh,- A.Elt a, Storable a, RealFloat a, AIO.BlockPtrs (EltRepr a) ~ Ptr a) =>- sh -> CArray i (Complex a) -> Array sh (Complex a)+ (Ix i, A.Shape sh, Storable a, RealFloat a, Complex a ~ ac, A.Elt ac,+ AIO.ForeignPtrs (EltRepr ac) ~ ForeignPtr ac) =>+ sh -> CArray i ac -> Array sh ac accFromCArrayComplex sh arr =- unsafePerformIO $- withCArray (CArray.amap Complex.realPart arr) $ \ptrReal ->- withCArray (CArray.amap Complex.imagPart arr) $ \ptrImag ->- AIO.fromPtr sh (((), ptrReal), ptrImag)+ AIO.fromForeignPtrs sh (snd $ CArray.toForeignPtr arr) + accDimsFromArrayBounds1D :: (CArray.Ix i) => (i, i) -> DIM1 accDimsFromArrayBounds1D bnds = Z :. rangeSize bnds @@ -74,49 +68,51 @@ cArrayFromAccReal1D ::- (A.Elt a, Storable a, AIO.BlockPtrs (EltRepr a) ~ Ptr a) =>+ (A.Elt a, Storable a, AIO.ForeignPtrs (EltRepr a) ~ ForeignPtr a) => Array DIM1 a -> CArray Int a cArrayFromAccReal1D arr = let (Z:.len) = A.arrayShape arr in unsafePerformIO $- createCArray (0,len-1) $ \ptr -> AIO.toPtr arr ptr+ unsafeForeignPtrToCArray (AIO.toForeignPtrs arr) (0,len-1) cArrayFromAccReal2D ::- (A.Elt a, Storable a, AIO.BlockPtrs (EltRepr a) ~ Ptr a) =>+ (A.Elt a, Storable a, AIO.ForeignPtrs (EltRepr a) ~ ForeignPtr a) => Array DIM2 a -> CArray (Int, Int) a cArrayFromAccReal2D arr = unsafePerformIO $- createCArray (arrayBounds2DFromAccDims $ A.arrayShape arr) $ \ptr ->- AIO.toPtr arr ptr+ unsafeForeignPtrToCArray (AIO.toForeignPtrs arr)+ (arrayBounds2DFromAccDims $ A.arrayShape arr) cArrayFromAccComplex1D ::- (A.Elt a, Storable a, RealFloat a, AIO.BlockPtrs (EltRepr a) ~ Ptr a) =>- Array DIM1 (Complex a) -> CArray Int (Complex a)+ (Storable a, RealFloat a, Complex a ~ ac, A.Elt ac,+ AIO.ForeignPtrs (EltRepr ac) ~ ForeignPtr ac) =>+ Array DIM1 ac -> CArray Int ac cArrayFromAccComplex1D arr = cArrayFromAccComplex (arrayBounds1DFromAccDims $ A.arrayShape arr) arr cArrayFromAccComplex2D ::- (A.Elt a, Storable a, RealFloat a, AIO.BlockPtrs (EltRepr a) ~ Ptr a) =>- Array DIM2 (Complex a) -> CArray (Int,Int) (Complex a)+ (Storable a, RealFloat a, Complex a ~ ac, A.Elt ac,+ AIO.ForeignPtrs (EltRepr ac) ~ ForeignPtr ac) =>+ Array DIM2 ac -> CArray (Int,Int) ac cArrayFromAccComplex2D arr = cArrayFromAccComplex (arrayBounds2DFromAccDims $ A.arrayShape arr) arr cArrayFromAccComplex :: (Ix i, A.Shape sh,- A.Elt a, Storable a, RealFloat a, AIO.BlockPtrs (EltRepr a) ~ Ptr a) =>- (i,i) -> Array sh (Complex a) -> CArray i (Complex a)-cArrayFromAccComplex bnds arr = unsafePerformIO $ do- fmap (uncurry (CArray.liftArray2 (Complex.:+))) $- createCArrayAdd bnds $ \ptrReal ->- createCArray bnds $ \ptrImag ->- AIO.toPtr arr (((), ptrReal), ptrImag)+ Storable a, RealFloat a, Complex a ~ ac, A.Elt ac,+ AIO.ForeignPtrs (EltRepr ac) ~ ForeignPtr ac) =>+ (i,i) -> Array sh ac -> CArray i ac+cArrayFromAccComplex bnds arr =+ unsafePerformIO $+ unsafeForeignPtrToCArray (AIO.toForeignPtrs arr) bnds withCArrayComplex :: (Ix i, A.Shape sh,- A.Elt a, Storable a, RealFloat a, AIO.BlockPtrs (EltRepr a) ~ Ptr a) =>+ Storable a, RealFloat a, Complex a ~ ac, A.Elt ac,+ AIO.ForeignPtrs (EltRepr ac) ~ ForeignPtr ac) => (sh -> (i,i)) -> (CArray i (Complex a) -> CArray i (Complex a)) -> Array sh (Complex a) -> Array sh (Complex a)@@ -124,15 +120,6 @@ let sh = A.arrayShape arr in accFromCArrayComplex sh $ f $ cArrayFromAccComplex (bndsFromSh sh) arr---createCArrayAdd ::- (Ix i, Storable e) =>- (i,i) -> (Ptr e -> IO a) -> IO (CArray i e, a)-createCArrayAdd bnds create = do- ref <- newIORef (error "uninitialized inner value")- arr <- createCArray bnds $ writeIORef ref <=< create- fmap ((,) arr) $ readIORef ref arrayBounds1DFromAccDims :: DIM1 -> (Int, Int)
src/Data/Array/Accelerate/FFTW/Manifest.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE ConstraintKinds #-} module Data.Array.Accelerate.FFTW.Manifest ( Transform,@@ -15,7 +16,7 @@ import qualified Data.Array.Accelerate.CArray.Conversion as Conv -import qualified Data.Array.Accelerate.IO as AIO+import qualified Data.Array.Accelerate.IO.Foreign.ForeignPtr as AIO import qualified Data.Array.Accelerate as A import Data.Array.Accelerate.Array.Sugar (EltRepr) import Data.Array.Accelerate (Array, (:.)((:.)))@@ -24,14 +25,16 @@ import Data.Array.Accelerate.Data.Complex (Complex) -import Foreign.Ptr (Ptr)+import Foreign.ForeignPtr (ForeignPtr) type Bounds i = (i,i) type Transform sh a = Array sh a -> Array sh a -type Element a = (FFTWReal a, A.Elt a, AIO.BlockPtrs (EltRepr a) ~ Ptr a)+type Element a =+ (FFTWReal a, A.Elt (Complex a),+ AIO.ForeignPtrs (EltRepr (Complex a)) ~ ForeignPtr (Complex a)) dft :: (A.Shape sh, Element a) =>