/mobile Handheld Friendly website

 performance measurements

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
101.701.713,288808  1% 1% 0% 99%
1119.7419.753,280808  0% 1% 1% 100%
12254.40254.513,284808  0% 1% 1% 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.

 notes

The Glorious Glasgow Haskell Compilation System, version 7.8.1

 fannkuch-redux Haskell GHC #2 program source code

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

 make, command-line, and program output logs

Thu, 10 Apr 2014 04:35:01 GMT

MAKE:
mv fannkuchredux.ghc-2.ghc fannkuchredux.ghc-2.hs
/usr/local/src/ghc-7.8.1/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.70s to complete and log all make actions

COMMAND LINE:
./fannkuchredux.ghc-2.ghc_run  12

PROGRAM OUTPUT:
3968050
Pfannkuchen(12) = 65

Revised BSD license

  Home   Conclusions   License   Play