fork download
module Main where
 
import Data.Array.Repa hiding (map)
import Criterion.Main
import Criterion.Types
import System.IO.Unsafe


type DIM1_U_D = Array U DIM1 Double
type DIM1_D_D = Array D DIM1 Double
type DIM2_D_D = Array D DIM2 Double

calc :: DIM1_U_D -> DIM1_U_D -> DIM1_D_D
calc k b = let sizeB = size (extent b)
               sizeK = size (extent k)
               p kp bp (Z:.ic) = sum $ map
                                 (\i -> kp (Z:.i) * bp (Z:.ic+i))
                                 [0..sizeK-1]
           in traverse2 k b (\_ _ -> Z:.sizeB-sizeK+1) p

calc0, calc1, calc2 :: DIM1_U_D -> DIM1_U_D -> DIM1_U_D
calc0 k b = unsafePerformIO $ computeP $ calc k b 

calc1 k b = let
    Z :. ks = extent k
    Z :. bs = extent b
    sh = Z :. bs - ks + 1 :. ks
    k', b' :: DIM2_D_D
    k' = traverse k (const sh) (\f (Z :. _ :. j) -> f (Z :. j))
    b' = traverse b (const sh) (\f (Z :. i :. j) -> f (Z :. (i+j)))
  in unsafePerformIO $ sumP $ k' *^ b'

calc2 k b = let
    s (Z :. ks) (Z :. bs) = Z :. bs - ks + 1 :. ks
    f kf bf (Z :. i :. j) = kf (Z :. j) * bf (Z :. (i+j))
  in unsafePerformIO $ sumP $ traverse2 k b s f

kernel, base :: [Double]
-- (kernel, base) = ([6, 3, 5], [3, 5, 2, 9, 4])
-- (kernel, base) = ([1..10], [1..100])
(kernel, base) = ([1..200], [1..40000])



main = do
  k <- return $! fromListUnboxed (Z :. length kernel) kernel
  b <- return $! fromListUnboxed (Z :. length base) base
--  test1 k b
  test2 k b

test1 k b = do
  print $ calc0 k b
  print $ calc1 k b
  print $ calc2 k b

test2 k b =
  defaultMain [bench "calc0" $ whnf (calc0 k) b,
               bench "calc1" $ whnf (calc1 k) b,
               bench "calc2" $ whnf (calc2 k) b]

{- COMMAND
ghc -O2 -rtsopts -threaded --make 265.hs
sleep 100
./265 +RTS -N
-}

{- RESULT
-}
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty