packages feed

ADPfusion-0.1.0.0: ADP/Fusion/GAPlike/Criterion.hs

{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE PackageImports #-}

module ADP.Fusion.GAPlike.Criterion where

import Control.Monad.ST
import Criterion.Main
import Data.Char
import qualified Data.Vector.Fusion.Stream.Monadic as S
import qualified Data.Vector.Fusion.Stream as SP

import Data.PrimitiveArray
import Data.PrimitiveArray.Unboxed.VectorZero as UVZ
import Data.PrimitiveArray.Unboxed.Zero as UZ
import "PrimitiveArray" Data.Array.Repa.Index
import "PrimitiveArray" Data.Array.Repa.Shape

import ADP.Fusion.GAPlike
import ADP.Fusion.GAPlike.DevelCommon



criterionMain = defaultMain
  [ bgroup "testTTT3"
    [ bench "  10" (whnf (testTTT 0)   10)
    , bench " 100" (whnf (testTTT 0)  100)
    , bench "1000" (whnf (testTTT 0) 1000)
    ]
  , bgroup "testTTTT4"
    [ bench "  10" (whnf (testTTTT 0)   10)
    , bench " 100" (whnf (testTTTT 0)  100)
    , bench "1000" (whnf (testTTTT 0) 1000)
    ]
  , bgroup "testTTTT4ga"
    [ bench "  10" (whnf (testTTTTga 0)   10)
    , bench " 100" (whnf (testTTTTga 0)  100)
    , bench "1000" (whnf (testTTTTga 0) 1000)
    ]
  , bgroup "testTTTT4gaPA"
    [ bench "  10" (whnf (testTTTTgaPA 0)   10)
    , bench " 100" (whnf (testTTTTgaPA 0)  100)
    , bench "1000" (whnf (testTTTTgaPA 0) 1000)
    ]
  , bgroup "testTTTT4gaImmu"
    [ bench "  10" (whnf (testTTTTgaImmu 0)   10)
    , bench " 100" (whnf (testTTTTgaImmu 0)  100)
    , bench "1000" (whnf (testTTTTgaImmu 0) 1000)
    ]
  , bgroup "testTTTT4gaImmuPA"
    [ bench "  10" (whnf (testTTTTgaImmuPA 0)   10)
    , bench " 100" (whnf (testTTTTgaImmuPA 0)  100)
    , bench "1000" (whnf (testTTTTgaImmuPA 0) 1000)
    ]
  ]



-- * Criterion tests

testC :: Int -> Int -> Int
testC i j = runST doST where
  doST :: ST s Int
  doST = do
    let c = Chr dvu
    (gord1 <<< c ... ghsum) (i,j)
{-# NOINLINE testC #-}

gTestC (ord1,hsum) c =
  (ord1 <<< c ... hsum)

aTestC = (ord1,hsum) where
  ord1 = gord1
  hsum = ghsum

testCC :: Int -> Int -> Int
testCC i j = runST doST where
  doST :: ST s Int
  doST = do
    let c = Chr dvu
    let d = Chr dvu
    (gord2 <<< c % d ... ghsum) (i,j)
{-# NOINLINE testCC #-}

type TBL s = Tbl N (UVZ.MArr0 s DIM2 Int)

testT :: Int -> Int -> Int
testT i j = runST doST where
  doST :: ST s Int
  doST = do
    tbl :: TBL s <- Tbl `fmap` fromAssocsM (Z:.0:.0) (Z:.j:.j) 1 []
    (id <<< tbl ... ghsum) (i,j)
{-# NOINLINE testT #-}

testTT :: Int -> Int -> Int
testTT i j = runST doST where
  doST :: ST s Int
  doST = do
    tbl :: TBL s <- Tbl `fmap` fromAssocsM (Z:.0:.0) (Z:.j:.j) 1 []
    (gplus2 <<< tbl % tbl ... ghsum) (i,j)
  {-# INLINE doST #-}
{-# NOINLINE testTT #-}

testTTT :: Int -> Int -> Int
testTTT i j = runST doST where
  doST :: ST s Int
  doST = do
    tbl :: TBL s <- Tbl `fmap` fromAssocsM (Z:.0:.0) (Z:.j:.j) 1 []
    (gplus3 <<< tbl % tbl % tbl ... ghsum) (i,j)
{-# NOINLINE testTTT #-}

testTTTT :: Int -> Int -> Int
testTTTT i j = runST doST where
  doST :: ST s Int
  doST = do
    tbl :: TBL s <- Tbl `fmap` fromAssocsM (Z:.0:.0) (Z:.j:.j) (1::Int) []
    (gplus4 <<< tbl % tbl % tbl % tbl ... ghsum) (i,j)
  {-# INLINE doST #-}
{-# NOINLINE testTTTT #-}

testTTTTga :: Int -> Int -> Int
testTTTTga i j = runST doST where
  doST :: ST s Int
  doST = do
    tbl :: TBL s <- Tbl `fmap` fromAssocsM (Z:.0:.0) (Z:.j:.j) (1::Int) []
    gTTTga aTTTga tbl (i,j)
  {-# INLINE doST #-}
{-# NOINLINE testTTTTga #-}

testTTTTgaPA :: Int -> Int -> Int
testTTTTgaPA i j = runST doST where
  doST :: ST s Int
  doST = do
    tbl :: Tbl N (UZ.MArr0 s DIM2 Int) <- Tbl `fmap` fromAssocsM (Z:.0:.0) (Z:.j:.j) (1::Int) []
    gTTTga aTTTga tbl (i,j)
  {-# INLINE doST #-}
{-# NOINLINE testTTTTgaPA #-}

testTTTTgaImmu :: Int -> Int -> Int
testTTTTgaImmu i j =
    let tbl = (Tbl $ fromAssocs (Z:.0:.0) (Z:.j:.j) 1 []) :: Tbl N (UVZ.Arr0 DIM2 Int) 
    in tbl `seq` gTTTga aTTTgaImmu tbl (i,j)
{-# NOINLINE testTTTTgaImmu #-}

testTTTTgaImmuPA :: Int -> Int -> Int
testTTTTgaImmuPA i j =
    let tbl = (Tbl $ fromAssocs (Z:.0:.0) (Z:.j:.j) 1 []) :: Tbl N (UZ.Arr0 DIM2 Int) 
    in tbl `seq` gTTTga aTTTgaImmu tbl (i,j)
{-# NOINLINE testTTTTgaImmuPA #-}

gTTTga (plus4, hsum) tbl =
  (plus4 <<< tbl % tbl % tbl % tbl ... hsum)
{-# INLINE gTTTga #-}

aTTTga = (plus4, hsum) where
  plus4 = gplus4
  hsum = ghsum

aTTTgaImmu = (plus4, hsum) where
  plus4 = gplus4
  hsum = gihsum
{-# INLINE aTTTgaImmu #-}

gord1 a = ord a

gord2 a b = ord a + ord b

gord3 a b c = ord a + ord b + ord c

gplus2 a b = a+b

gplus3 a b c = a+b+c

gplus4 a b c d = a+b+c+d

ghsum :: S.Stream (ST s) Int -> ST s Int
ghsum = S.foldl' (+) 0

gihsum :: SP.Stream Int -> Int
gihsum = SP.foldl' (+) 0