The Computer Language
Benchmarks Game

thread-ring Haskell GHC program

source code

-- The Computer Language Benchmarks Game
-- Contributed by Jed Brown with improvements by Spencer Janssen, Don Stewart and Alex Mason
-- Compile with: <ghc> --make -O2 -threaded threadring.ghc-4.hs -o threadring.ghc-4.ghc_run

import Control.Monad
import Control.Concurrent
import System.Environment
import GHC.Conc

ring = 503

new ret l i = do
  r <- newEmptyMVar
  forkOn numCapabilities (thread ret i l r)
  return r

thread :: MVar () -> Int -> MVar Int -> MVar Int -> IO ()
thread ret i l r = go
  where go = do
          m <- takeMVar l
          if m > 1
              then (putMVar r $! m - 1) >> go
              else print i >> putMVar ret ()

main = do
  a <- newMVar . read . head =<< getArgs
  ret <- newEmptyMVar
  z <- foldM (new ret) a [2..ring]
  forkOn numCapabilities (thread ret 1 z a)
  takeMVar ret

notes, command-line, and program output

64-bit Ubuntu quad core
The Glorious Glasgow Haskell Compilation System, version 8.2.1

Tue, 14 Nov 2017 22:41:52 GMT

mv threadring.ghc threadring.hs
/opt/src/ghc-8.2.1/bin/ghc --make -fllvm -O2 -XBangPatterns -threaded -rtsopts  threadring.hs -o threadring.ghc_run
[1 of 1] Compiling Main             ( threadring.hs, threadring.o )
You are using an unsupported version of LLVM!
Currently only 3.9 is supported.
We will try though...
Linking threadring.ghc_run ...
rm threadring.hs

1.35s to complete and log all make actions

./threadring.ghc_run +RTS -N4 -RTS 50000000