linear-massiv-0.1.0.0: bench/Bench/Parallel.hs
{-# LANGUAGE AllowAmbiguousTypes #-}
-- | Benchmarks specifically for measuring parallelism scalability.
--
-- Runs matrix multiplication at various sizes with explicit thread counts
-- using massiv's ParN constructor.
module Bench.Parallel (parallelBenchmarks) where
import Criterion.Main
import qualified Data.Massiv.Array as M
import Data.Massiv.Array (Comp(..))
import GHC.TypeNats (KnownNat)
import Numeric.LinearAlgebra.Massiv.Types
import Numeric.LinearAlgebra.Massiv.Internal
import Numeric.LinearAlgebra.Massiv.BLAS.Level3 (matMulComp)
mkMatP :: forall m n. (KnownNat m, KnownNat n) => Matrix m n M.P Double
mkMatP = makeMatrix @m @n @M.P $ \i j -> fromIntegral (i * 7 + j * 3 + 1) / 100.0
-- | Benchmarks measuring how performance scales with thread count.
parallelBenchmarks :: [Benchmark]
parallelBenchmarks =
[ bgroup "scaling-gemm"
[ bgroup "100x100"
[ bench "Seq" $ nf (uncurry (matMulComp @100 @100 @100 Seq)) (mkMatP @100 @100, mkMatP @100 @100)
, bench "Par" $ nf (uncurry (matMulComp @100 @100 @100 Par)) (mkMatP @100 @100, mkMatP @100 @100)
, bench "ParN-1" $ nf (uncurry (matMulComp @100 @100 @100 (ParN 1))) (mkMatP @100 @100, mkMatP @100 @100)
, bench "ParN-2" $ nf (uncurry (matMulComp @100 @100 @100 (ParN 2))) (mkMatP @100 @100, mkMatP @100 @100)
, bench "ParN-4" $ nf (uncurry (matMulComp @100 @100 @100 (ParN 4))) (mkMatP @100 @100, mkMatP @100 @100)
, bench "ParN-8" $ nf (uncurry (matMulComp @100 @100 @100 (ParN 8))) (mkMatP @100 @100, mkMatP @100 @100)
, bench "ParN-16" $ nf (uncurry (matMulComp @100 @100 @100 (ParN 16))) (mkMatP @100 @100, mkMatP @100 @100)
, bench "ParN-20" $ nf (uncurry (matMulComp @100 @100 @100 (ParN 20))) (mkMatP @100 @100, mkMatP @100 @100)
]
, bgroup "200x200"
[ bench "Seq" $ nf (uncurry (matMulComp @200 @200 @200 Seq)) (mkMatP @200 @200, mkMatP @200 @200)
, bench "Par" $ nf (uncurry (matMulComp @200 @200 @200 Par)) (mkMatP @200 @200, mkMatP @200 @200)
, bench "ParN-1" $ nf (uncurry (matMulComp @200 @200 @200 (ParN 1))) (mkMatP @200 @200, mkMatP @200 @200)
, bench "ParN-2" $ nf (uncurry (matMulComp @200 @200 @200 (ParN 2))) (mkMatP @200 @200, mkMatP @200 @200)
, bench "ParN-4" $ nf (uncurry (matMulComp @200 @200 @200 (ParN 4))) (mkMatP @200 @200, mkMatP @200 @200)
, bench "ParN-8" $ nf (uncurry (matMulComp @200 @200 @200 (ParN 8))) (mkMatP @200 @200, mkMatP @200 @200)
, bench "ParN-16" $ nf (uncurry (matMulComp @200 @200 @200 (ParN 16))) (mkMatP @200 @200, mkMatP @200 @200)
, bench "ParN-20" $ nf (uncurry (matMulComp @200 @200 @200 (ParN 20))) (mkMatP @200 @200, mkMatP @200 @200)
]
]
]