repa-fftw-3.2.3.1: exec/bench.hs
{-# LANGUAGE FlexibleInstances #-}
{-|
Module : $Header$
CopyRight : (c) 8c6794b6, 2011, 2012
License : BSD3
Maintainer : 8c6794b6@gmail.com
Stability : experimental
Portability : portable
Benchmark for comparing FFT with repa-fftw to repa-algorithms.
-}
module Main where
import Control.DeepSeq (NFData(..))
import Data.Complex
import System.Random
import Criterion.Main
import Data.Array.Repa ((:.)(..), Array, U, DIM1, Z(..))
import Data.Array.Repa.Repr.ForeignPtr (F)
import qualified Data.Array.Repa as R
import qualified Data.Array.Repa.Eval as Eval
import qualified Data.Array.Repa.Algorithms.FFT as FFT
import qualified Data.Array.Repa.FFTW as FFTW
type RFFTArr = Array U DIM1 (Double, Double)
main :: IO ()
main = do
rs <- randomRs (0,1) `fmap` newStdGen
is <- randomRs (0,1) `fmap` newStdGen
let bench_fft n =
let mkarr ks = Eval.fromList (Z:.n) $ take n ks
ts = R.fromListUnboxed (Z:.n) $ take n $ zip rs is
cs = mkarr $ zipWith (:+) rs is
ra = FFT.fft1dP FFT.Forward :: RFFTArr -> IO RFFTArr
in ts `seq` cs `seq`
bgroup ("n="++show n)
[ bench "repa-algorithms" (nfIO (ra ts))
, bench "repa-fftw" (nf FFTW.fft cs)
]
defaultMain $ map (\k -> bench_fft (2^k)) [9..13::Int]
instance NFData (Array U DIM1 (Double, Double)) where
rnf arr = arr `R.deepSeqArray` ()
instance NFData (Array F DIM1 (Complex Double)) where
rnf arr = arr `R.deepSeqArray` ()