summaryrefslogtreecommitdiff
path: root/testsuite/tests/concurrent/prog003/Collate.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/concurrent/prog003/Collate.hs')
-rw-r--r--testsuite/tests/concurrent/prog003/Collate.hs64
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"