packages feed

mwc-random-accelerate-0.2.0.0: bench/Main.hs

{-# 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))
          ]
        ]
      ]
--}
    ]