diff options
Diffstat (limited to 'testsuite/tests/concurrent/prog003/Collate.hs')
-rw-r--r-- | testsuite/tests/concurrent/prog003/Collate.hs | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/testsuite/tests/concurrent/prog003/Collate.hs b/testsuite/tests/concurrent/prog003/Collate.hs new file mode 100644 index 0000000000..2c1879d450 --- /dev/null +++ b/testsuite/tests/concurrent/prog003/Collate.hs @@ -0,0 +1,64 @@ +{-# LANGUAGE PatternGuards #-} +module Main (main) where + +import qualified Data.Map as M +import Data.Map (Map) + +import System.Environment +import System.IO +import Text.Regex +import Data.List +import Control.Monad +import Data.Maybe + +type RawResults = Map (String,Int) [Double] + +main = do + [time,speedup] <- getArgs + s <- getContents + let raw = slurp_raw (lines s) + avg = M.map calc_average raw + + let keys = M.keys avg + modes = nub (map fst keys) + cores = sort (nub (map snd keys)) + + h <- openFile time WriteMode + forM modes $ \m -> do + hPutStrLn h (m ++ concatMap (',':) [ show (fromJust (M.lookup (m,n) avg)) + | n <- cores ]) + hClose h + + let + baselines = M.fromList [ (m, fromJust (M.lookup (m,1) avg)) | m <- modes ] + spd = M.mapWithKey (calc_speedup baselines) avg + + h <- openFile speedup WriteMode + forM modes $ \m -> do + hPutStrLn h (m ++ concatMap (',':) [ show (fromJust (M.lookup (m,n) spd)) + | n <- cores ]) + hClose h + +calc_average :: [Double] -> Double +calc_average = foldl f 0 . zip [(1::Int)..] + where f mean (i,x) = mean + (x - mean) / fromIntegral i + +calc_speedup :: Map String Double -> (String,Int) -> Double -> Double +calc_speedup baselines (mode,_) result = base / result + where Just base = M.lookup mode baselines + +slurp_raw :: [String] -> RawResults +slurp_raw lines = add_results ("",1) M.empty lines + where + add_results m results [] = results + add_results m results (line:lines) + | Just [mode,cores] <- matchRegex header line + = add_results (mode, read cores :: Int) results lines + | Just [time] <- matchRegex result line + = let t = read time :: Double in + add_results m (M.insertWith (\_ o -> t:o) m [t] results) lines + | otherwise + = add_results m results lines + +header = mkRegex "run\\.([^\\.]*)\\.N([0-9]*)" +result = mkRegex "time: ([0-9\\.]+)s" |