{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}
module Main where
import Data.Array.Accelerate
import Data.Array.Accelerate.System.Random.MWC as AMWC
-- import Data.Array.Accelerate.System.Random.SFMT as ASFMT
import System.Random.MWC as MWC
-- import System.Random.SFMT as SFMT
import System.Random.Mersenne as MT
import Data.Vector.Unboxed as U
import Criterion.Main
import Criterion.Types
import Data.Proxy
import Prelude as P
makeMWCArray :: forall e. Elt e => MWC.GenIO -> DIM1 AMWC.:~> e -> Benchmarkable
makeMWCArray mwc f = toBenchmarkable arr
where
arr :: Int64 -> IO ()
arr n = do
!_ <- AMWC.randomArrayWith mwc f (Z :. P.fromIntegral n) :: IO (Array DIM1 e)
return ()
-- makeSFMTArray :: forall e. Elt e => SFMT.GenIO -> DIM1 ASFMT.:~> e -> Benchmarkable
-- makeSFMTArray sfmt f = Benchmarkable arr
-- where
-- arr :: Int64 -> IO ()
-- arr n = do
-- !_ <- ASFMT.randomArrayWith sfmt f (Z :. P.fromIntegral n) :: IO (Array DIM1 e)
-- return ()
makeVector :: forall e. (MWC.Variate e, Unbox e) => MWC.GenIO -> Proxy e -> Benchmarkable
makeVector mwc _ = toBenchmarkable vec
where
vec :: Int64 -> IO ()
vec n = do
!_ <- MWC.uniformVector mwc (P.fromIntegral n) :: IO (U.Vector e)
return ()
#if !MIN_VERSION_criterion(1,2,0)
toBenchmarkable :: (Int64 -> IO ()) -> Benchmarkable
toBenchmarkable = Benchmarkable
#endif
main :: IO ()
main = do
mwc <- MWC.create
-- sfmt <- SFMT.create
mt <- MT.getStdGen
defaultMain
-- One letter group names are used so they will fit on the plot.
--
-- U - uniform
-- R - uniformR
-- D - distribution
--
[ bgroup "mersenne-random"
[ bgroup "U"
[ bench "Double" (whnfIO (MT.random mt :: IO Double))
, bench "Int" (whnfIO (MT.random mt :: IO Int))
, bench "Int8" (whnfIO (MT.random mt :: IO Int8))
, bench "Int16" (whnfIO (MT.random mt :: IO Int16))
, bench "Int32" (whnfIO (MT.random mt :: IO Int32))
, bench "Int64" (whnfIO (MT.random mt :: IO Int64))
, bench "Word" (whnfIO (MT.random mt :: IO Word))
, bench "Word8" (whnfIO (MT.random mt :: IO Word8))
, bench "Word16" (whnfIO (MT.random mt :: IO Word16))
, bench "Word32" (whnfIO (MT.random mt :: IO Word32))
, bench "Word64" (whnfIO (MT.random mt :: IO Word64))
]
]
-- stolen from MWC random benchmark suite
, bgroup "mwc-random"
[ bgroup "U"
[ bench "Double" (whnfIO (MWC.uniform mwc :: IO Double))
, bench "Float" (whnfIO (MWC.uniform mwc :: IO Float))
, bench "Int" (whnfIO (MWC.uniform mwc :: IO Int))
, bench "Int8" (whnfIO (MWC.uniform mwc :: IO Int8))
, bench "Int16" (whnfIO (MWC.uniform mwc :: IO Int16))
, bench "Int32" (whnfIO (MWC.uniform mwc :: IO Int32))
, bench "Int64" (whnfIO (MWC.uniform mwc :: IO Int64))
, bench "Word" (whnfIO (MWC.uniform mwc :: IO Word))
, bench "Word8" (whnfIO (MWC.uniform mwc :: IO Word8))
, bench "Word16" (whnfIO (MWC.uniform mwc :: IO Word16))
, bench "Word32" (whnfIO (MWC.uniform mwc :: IO Word32))
, bench "Word64" (whnfIO (MWC.uniform mwc :: IO Word64))
]
, bgroup "R"
-- I'm not entirely convinced that this is right way to test
-- uniformR. /A.Khudyakov/
[ bench "Double" (whnfIO (MWC.uniformR (-3.21,26) mwc :: IO Double))
, bench "Float" (whnfIO (MWC.uniformR (-3.21,26) mwc :: IO Float))
, bench "Int" (whnfIO (MWC.uniformR (-12,679) mwc :: IO Int))
, bench "Int8" (whnfIO (MWC.uniformR (-12,4) mwc :: IO Int8))
, bench "Int16" (whnfIO (MWC.uniformR (-12,679) mwc :: IO Int16))
, bench "Int32" (whnfIO (MWC.uniformR (-12,679) mwc :: IO Int32))
, bench "Int64" (whnfIO (MWC.uniformR (-12,679) mwc :: IO Int64))
, bench "Word" (whnfIO (MWC.uniformR (34,633) mwc :: IO Word))
, bench "Word8" (whnfIO (MWC.uniformR (34,63) mwc :: IO Word8))
, bench "Word16" (whnfIO (MWC.uniformR (34,633) mwc :: IO Word16))
, bench "Word32" (whnfIO (MWC.uniformR (34,633) mwc :: IO Word32))
, bench "Word64" (whnfIO (MWC.uniformR (34,633) mwc :: IO Word64))
]
, bgroup "vector"
[ bgroup "U"
[ bench "Double" (makeVector mwc (Proxy :: Proxy Double))
, bench "Float" (makeVector mwc (Proxy :: Proxy Float))
, bench "Int" (makeVector mwc (Proxy :: Proxy Int))
, bench "Int8" (makeVector mwc (Proxy :: Proxy Int8))
, bench "Int16" (makeVector mwc (Proxy :: Proxy Int16))
, bench "Int32" (makeVector mwc (Proxy :: Proxy Int32))
, bench "Int64" (makeVector mwc (Proxy :: Proxy Int64))
, bench "Word" (makeVector mwc (Proxy :: Proxy Word))
, bench "Word8" (makeVector mwc (Proxy :: Proxy Word8))
, bench "Word16" (makeVector mwc (Proxy :: Proxy Word16))
, bench "Word32" (makeVector mwc (Proxy :: Proxy Word32))
, bench "Word64" (makeVector mwc (Proxy :: Proxy Word64))
]
]
, bgroup "Acc"
[ bgroup "U"
[ bench "Double" (makeMWCArray mwc (AMWC.uniform :: DIM1 AMWC.:~> Double))
, bench "Float" (makeMWCArray mwc (AMWC.uniform :: DIM1 AMWC.:~> Float))
, bench "Int" (makeMWCArray mwc (AMWC.uniform :: DIM1 AMWC.:~> Int))
, bench "Int8" (makeMWCArray mwc (AMWC.uniform :: DIM1 AMWC.:~> Int8))
, bench "Int16" (makeMWCArray mwc (AMWC.uniform :: DIM1 AMWC.:~> Int16))
, bench "Int32" (makeMWCArray mwc (AMWC.uniform :: DIM1 AMWC.:~> Int32))
, bench "Int64" (makeMWCArray mwc (AMWC.uniform :: DIM1 AMWC.:~> Int64))
, bench "Word" (makeMWCArray mwc (AMWC.uniform :: DIM1 AMWC.:~> Word))
, bench "Word8" (makeMWCArray mwc (AMWC.uniform :: DIM1 AMWC.:~> Word8))
, bench "Word16" (makeMWCArray mwc (AMWC.uniform :: DIM1 AMWC.:~> Word16))
, bench "Word32" (makeMWCArray mwc (AMWC.uniform :: DIM1 AMWC.:~> Word32))
, bench "Word64" (makeMWCArray mwc (AMWC.uniform :: DIM1 AMWC.:~> Word64))
]
, bgroup "R"
[ bench "Double" (makeMWCArray mwc (AMWC.uniformR (-3.21,26) :: DIM1 AMWC.:~> Double))
, bench "Float" (makeMWCArray mwc (AMWC.uniformR (-3.21,26) :: DIM1 AMWC.:~> Float))
, bench "Int" (makeMWCArray mwc (AMWC.uniformR (-12,679) :: DIM1 AMWC.:~> Int))
, bench "Int8" (makeMWCArray mwc (AMWC.uniformR (-12,4) :: DIM1 AMWC.:~> Int8))
, bench "Int16" (makeMWCArray mwc (AMWC.uniformR (-12,679) :: DIM1 AMWC.:~> Int16))
, bench "Int32" (makeMWCArray mwc (AMWC.uniformR (-12,679) :: DIM1 AMWC.:~> Int32))
, bench "Int64" (makeMWCArray mwc (AMWC.uniformR (-12,679) :: DIM1 AMWC.:~> Int64))
, bench "Word" (makeMWCArray mwc (AMWC.uniformR (34,633) :: DIM1 AMWC.:~> Word))
, bench "Word8" (makeMWCArray mwc (AMWC.uniformR (34,63) :: DIM1 AMWC.:~> Word8))
, bench "Word16" (makeMWCArray mwc (AMWC.uniformR (34,633) :: DIM1 AMWC.:~> Word16))
, bench "Word32" (makeMWCArray mwc (AMWC.uniformR (34,633) :: DIM1 AMWC.:~> Word32))
, bench "Word64" (makeMWCArray mwc (AMWC.uniformR (34,633) :: DIM1 AMWC.:~> Word64))
]
]
]
{--
-- SFMT
, bgroup "sfmt"
[ bgroup "U"
[ bench "Double" (whnfIO (SFMT.uniform sfmt :: IO Double))
, bench "Float" (whnfIO (SFMT.uniform sfmt :: IO Float))
, bench "Int" (whnfIO (SFMT.uniform sfmt :: IO Int))
, bench "Int8" (whnfIO (SFMT.uniform sfmt :: IO Int8))
, bench "Int16" (whnfIO (SFMT.uniform sfmt :: IO Int16))
, bench "Int32" (whnfIO (SFMT.uniform sfmt :: IO Int32))
, bench "Int64" (whnfIO (SFMT.uniform sfmt :: IO Int64))
, bench "Word" (whnfIO (SFMT.uniform sfmt :: IO Word))
, bench "Word8" (whnfIO (SFMT.uniform sfmt :: IO Word8))
, bench "Word16" (whnfIO (SFMT.uniform sfmt :: IO Word16))
, bench "Word32" (whnfIO (SFMT.uniform sfmt :: IO Word32))
, bench "Word64" (whnfIO (SFMT.uniform sfmt :: IO Word64))
]
, bgroup "R"
[ bench "Double" (whnfIO (SFMT.uniformR (-3.21,26) sfmt :: IO Double))
, bench "Float" (whnfIO (SFMT.uniformR (-3.21,26) sfmt :: IO Float))
, bench "Int" (whnfIO (SFMT.uniformR (-12,679) sfmt :: IO Int))
, bench "Int8" (whnfIO (SFMT.uniformR (-12,4) sfmt :: IO Int8))
, bench "Int16" (whnfIO (SFMT.uniformR (-12,679) sfmt :: IO Int16))
, bench "Int32" (whnfIO (SFMT.uniformR (-12,679) sfmt :: IO Int32))
, bench "Int64" (whnfIO (SFMT.uniformR (-12,679) sfmt :: IO Int64))
, bench "Word" (whnfIO (SFMT.uniformR (34,633) sfmt :: IO Word))
, bench "Word8" (whnfIO (SFMT.uniformR (34,63) sfmt :: IO Word8))
, bench "Word16" (whnfIO (SFMT.uniformR (34,633) sfmt :: IO Word16))
, bench "Word32" (whnfIO (SFMT.uniformR (34,633) sfmt :: IO Word32))
, bench "Word64" (whnfIO (SFMT.uniformR (34,633) sfmt :: IO Word64))
]
, bgroup "Acc"
[ bgroup "U"
[ bench "Double" (makeSFMTArray sfmt (ASFMT.uniform :: DIM1 ASFMT.:~> Double))
, bench "Float" (makeSFMTArray sfmt (ASFMT.uniform :: DIM1 ASFMT.:~> Float))
, bench "Int" (makeSFMTArray sfmt (ASFMT.uniform :: DIM1 ASFMT.:~> Int))
, bench "Int8" (makeSFMTArray sfmt (ASFMT.uniform :: DIM1 ASFMT.:~> Int8))
, bench "Int16" (makeSFMTArray sfmt (ASFMT.uniform :: DIM1 ASFMT.:~> Int16))
, bench "Int32" (makeSFMTArray sfmt (ASFMT.uniform :: DIM1 ASFMT.:~> Int32))
, bench "Int64" (makeSFMTArray sfmt (ASFMT.uniform :: DIM1 ASFMT.:~> Int64))
, bench "Word" (makeSFMTArray sfmt (ASFMT.uniform :: DIM1 ASFMT.:~> Word))
, bench "Word8" (makeSFMTArray sfmt (ASFMT.uniform :: DIM1 ASFMT.:~> Word8))
, bench "Word16" (makeSFMTArray sfmt (ASFMT.uniform :: DIM1 ASFMT.:~> Word16))
, bench "Word32" (makeSFMTArray sfmt (ASFMT.uniform :: DIM1 ASFMT.:~> Word32))
, bench "Word64" (makeSFMTArray sfmt (ASFMT.uniform :: DIM1 ASFMT.:~> Word64))
]
, bgroup "R"
[ bench "Double" (makeSFMTArray sfmt (ASFMT.uniformR (-3.21,26) :: DIM1 ASFMT.:~> Double))
, bench "Float" (makeSFMTArray sfmt (ASFMT.uniformR (-3.21,26) :: DIM1 ASFMT.:~> Float))
, bench "Int" (makeSFMTArray sfmt (ASFMT.uniformR (-12,679) :: DIM1 ASFMT.:~> Int))
, bench "Int8" (makeSFMTArray sfmt (ASFMT.uniformR (-12,4) :: DIM1 ASFMT.:~> Int8))
, bench "Int16" (makeSFMTArray sfmt (ASFMT.uniformR (-12,679) :: DIM1 ASFMT.:~> Int16))
, bench "Int32" (makeSFMTArray sfmt (ASFMT.uniformR (-12,679) :: DIM1 ASFMT.:~> Int32))
, bench "Int64" (makeSFMTArray sfmt (ASFMT.uniformR (-12,679) :: DIM1 ASFMT.:~> Int64))
, bench "Word" (makeSFMTArray sfmt (ASFMT.uniformR (34,633) :: DIM1 ASFMT.:~> Word))
, bench "Word8" (makeSFMTArray sfmt (ASFMT.uniformR (34,63) :: DIM1 ASFMT.:~> Word8))
, bench "Word16" (makeSFMTArray sfmt (ASFMT.uniformR (34,633) :: DIM1 ASFMT.:~> Word16))
, bench "Word32" (makeSFMTArray sfmt (ASFMT.uniformR (34,633) :: DIM1 ASFMT.:~> Word32))
, bench "Word64" (makeSFMTArray sfmt (ASFMT.uniformR (34,633) :: DIM1 ASFMT.:~> Word64))
]
]
]
--}
]