haskell-cnc-0.1: examples/threadring_onestep.hs
{-
- Intel Concurrent Collections for Haskell
- Copyright (c) 2010, Intel Corporation.
-
- This program is free software; you can redistribute it and/or modify it
- under the terms and conditions of the GNU Lesser General Public License,
- version 2.1, as published by the Free Software Foundation.
-
- This program is distributed in the hope it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
- more details.
-
- You should have received a copy of the GNU Lesser General Public License along with
- this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-
-}
-- Author: Ryan Newton
-- #define INCLUDEMETHOD
-- -- #define MEMOIZE
-- #include "CncPure.hs"
-- -- #include "Cnc.hs"
import System.Environment
#include <haskell_cnc.h>
-- This simple microbenchmark is drawn from the "Great Language Shootout".
-- It passes token(s) around a ring.
-- This implementation is for comparison with the C++ CnC implementation.a
threadring hops agents 1 =
do tags :: TagCol Int <- newTagCol
items :: ItemCol Int Int <- newItemCol
answer :: ItemCol Int Int <- newItemCol
prescribe tags
(\n -> do let next = n+1
let myid = n `mod` agents
--putStr$ "Actor executing, id "++ show myid ++"\n"
token <- get items n
--putStr$ " token "++ show token ++"\n"
if token == 0
then put answer 0 myid
else do put items next (token-1)
putt tags next )
initialize $
do put items 0 hops; putt tags 0
-- MAKE SURE THIS WORKS ALSO:
-- ([2009.08.12] It currently does with CncPure but not Cnc)
-- do putt tags 0; put items 0 hops
finalize $ get answer 0
--finalize $ return ()
main =
do ls <- getArgs
let v = runGraph $
case Prelude.map read ls of
[] -> threadring 17 503 1
[h] -> threadring h 503 1
[h,a] -> threadring h a 1
[h,a,t] -> threadring h a t
putStrLn (show v)
{-
NOTES:
[2009.08.12]
With CncPure we get a horrible score: 24.17s for only 5M rounds
(plus 1.1gb of mem)! (I didn't even test 50M.) Well we have the
same problem CnC/C++ does, of course, we leak memory like crazy.
Turning MEMOIZE off, it peaks out at 560mb of mem and takes 12.15s
(for 5M).
How much do we spend in GC? Running with "+RTS -sstderr":
____
Switching to Cnc.hs ... hah, well first that gives me a stack space overflow.
That should NOT happen.
That's a good hint though... Need to strictify some folds probably.
(Btw, if I just force the stack size up to 100mb, it runs... but
very slowly. It takes >23.5 minutes... and, well it stack
overflowed the 100mb after using 1.3gb heap. Egad.)
-}