/mobile Handheld Friendly website
x64 Ubuntu : Intel® Q6600® one core |
Each table row shows performance measurements for this Haskell GHC program with a particular command-line input value N.
| N | CPU secs | Elapsed secs | Memory KB | Code B | ≈ CPU Load |
|---|---|---|---|---|---|
| 10 | 1.96 | 1.96 | 3,368 | 808 | 0% 1% 0% 100% |
| 11 | 23.17 | 23.18 | 3,376 | 808 | 0% 0% 0% 100% |
| 12 | 288.46 | 288.56 | 3,376 | 808 | 0% 0% 0% 100% |
Read the ↓ make, command line, and program output logs to see how this program was run.
Read fannkuch-redux benchmark to see what this program should do.
llvm version 3.1-2ubuntu1
The Glorious Glasgow Haskell Compilation System, version 7.6.2
{- The Computer Language Benchmarks Game http://benchmarksgame.alioth.debian.org/ contributed by Miha Vučkovič -} import System.Environment import qualified Data.Vector.Unboxed as V import qualified Data.Vector.Unboxed.Mutable as MV import qualified Data.Vector.Generic.Mutable as GMV import Control.Monad (unless, void, forM_) import Control.Monad.ST import Control.Parallel import Control.Parallel.Strategies import Data.STRef flopST v flopCount = do h <- MV.unsafeRead v 0 if h == 1 then return flopCount else do GMV.reverse $ MV.unsafeSlice 0 h v flopST v (flopCount + 1) countFlops :: V.Vector Int -> Int countFlops v = runST $ do mv <- V.thaw v flopST mv 0 permut n = foldr permConcat [V.fromList [1..n]] [5..n] permConcat x lst = concat [take x $ iterate (rotate x) l | l <- lst] perm :: Int -> V.Vector Int -> [V.Vector Int] perm x l = take x $ iterate (rotate x) l rotate :: Int -> V.Vector Int -> V.Vector Int rotate 1 xs = xs rotate n v = runST $ do mv <- V.thaw v veryUnsafeV <- V.unsafeThaw v h <- MV.unsafeRead mv 0 MV.unsafeCopy (MV.unsafeSlice 0 (n-1) mv) (MV.unsafeSlice 1 (n-1) veryUnsafeV) MV.unsafeWrite mv (n-1) h V.unsafeFreeze mv calculateMaxAndChecksum :: [Int] -> (Int, Int) calculateMaxAndChecksum = go 0 0 where go !m !c [] = (m, c) go !m !c [x] = (max m x, c + x) go !m !c (x0:x1:xs) = go (max3 m x0 x1) (c + x0 - x1) xs max3 !a !b !c = max c (max a b) niceParallelMap :: NFData b => Int -> (a -> b) -> [a] -> [b] niceParallelMap bufferSize f xs = runEval $ parBuffer bufferSize rdeepseq $ map f xs main :: IO () main = do n <- fmap (read . head) getArgs let permutations = permut n flopCounts = concat $ niceParallelMap 50 (map countFlops . concatMap (perm 2) . concatMap (perm 3) . perm 4) permutations (mflops, checksum) = calculateMaxAndChecksum flopCounts putStrLn $ show checksum ++ "\nPfannkuchen(" ++ show n ++ ") = " ++ show mflops
Thu, 31 Jan 2013 08:12:38 GMT MAKE: mv fannkuchredux.ghc-2.ghc fannkuchredux.ghc-2.hs /usr/local/src/ghc-7.6.2/bin/ghc --make -fllvm -O2 -XBangPatterns -rtsopts fannkuchredux.ghc-2.hs -o fannkuchredux.ghc-2.ghc_run [1 of 1] Compiling Main ( fannkuchredux.ghc-2.hs, fannkuchredux.ghc-2.o ) Linking fannkuchredux.ghc-2.ghc_run ... rm fannkuchredux.ghc-2.hs 1.77s to complete and log all make actions COMMAND LINE: ./fannkuchredux.ghc-2.ghc_run 12 PROGRAM OUTPUT: 3968050 Pfannkuchen(12) = 65