packages feed

accelerate-kullback-liebler-0.1.0.0: bench/Bench.cpphs

{-# 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