{-# LANGUAGE FlexibleContexts #-}
module Main (main) where
import Criterion.Main
import qualified Data.Array.Accelerate as A
import Data.Array.Accelerate.KullbackLiebler
import qualified Data.Array.Accelerate.LLVM.Native as CPU
#ifdef ACCELERATE_GPU
import qualified Data.Array.Accelerate.LLVM.PTX as GPU
#endif
import Data.Array.Accelerate.Test
main :: IO ()
main = do
ps <- distEnv
qs <- distEnv
#ifdef ACCELERATE_GPU
let res = kullbackLieblerGPU ps qs -- TODO: better way to force this
#else
let res = kullbackLieblerCPU ps qs -- TODO: better way to force this
#endif
putStrLn (res `seq` "Setup complete")
defaultMain [
#ifdef ACCELERATE_GPU
bgroup "GPU"
[ bench "K-L (1e7)" $ nf (kullbackLieblerGPU ps) qs
, bench "entropy (1e7)" $ nf entropyGPU ps
]
, bgroup "CPU"
#else
bgroup "CPU"
#endif
[ bench "K-L (1e7)" $ nf (kullbackLieblerCPU ps) qs
, bench "entropy (1e7)" $ nf entropyCPU ps
]
]
where distEnv :: IO (A.Acc (A.Vector Double))
distEnv = randDist (A.Z A.:. 10000000)
#ifdef ACCELERATE_GPU
kullbackLieblerGPU ps qs = the $ GPU.run $ kullbackLiebler ps qs
entropyGPU = the . GPU.run . entropy
#endif
-- TODO: runQ
kullbackLieblerCPU ps qs = the $ CPU.run $ kullbackLiebler ps qs
entropyCPU = the . CPU.run . entropy