[Haskell-cafe] Parallel compilation and execution?

michael rice nowgate at yahoo.com
Thu May 26 14:47:04 CEST 2011


Thank, Daniel
Multiple threads are in evidence in my system monitor, but I wonder why I'm getting two different answers, one twice the other. The first is the parallel solution and the second is the non.
Michael
===========
{-import Control.Parallel
nfib :: Int -> Intnfib n | n <= 1 = 1       | otherwise = par n1 (pseq n2 (n1 + n2 + 1))                     where n1 = nfib (n-1)                           n2 = nfib (n-2)-}
nfib :: Int -> Intnfib n | n <= 1 = 1       | otherwise = nfib (n-1) + nfib (n-2)
main = do putStrLn $ show $ nfib 39
=============
[michael at hostname ~]$ ghc --make -threaded nfib.hs[1 of 1] Compiling Main             ( nfib.hs, nfib.o )Linking nfib ...[michael at hostname ~]$ ./nfib +RTS -N3204668309[michael at hostname ~]$ ghc --make nfib.hs[1 of 1] Compiling Main             ( nfib.hs, nfib.o )Linking nfib ...[michael at hostname ~]$ ./nfib102334155[michael at hostname ~]$ 

--- On Thu, 5/26/11, Daniel Fischer <daniel.is.fischer at googlemail.com> wrote:

From: Daniel Fischer <daniel.is.fischer at googlemail.com>
Subject: Re: [Haskell-cafe] Parallel compilation and execution?
To: haskell-cafe at haskell.org
Cc: "michael rice" <nowgate at yahoo.com>
Date: Thursday, May 26, 2011, 8:16 AM

On Thursday 26 May 2011 13:24:09, michael rice wrote:
> How do I compile and run this parallel program?
> Michael
> ===========================
> import Control.Parallel
> nfib :: Int -> Int
> nfib n | n <= 1 = 1       
>        | otherwise = par n1 (seq n2 (n1 + n2 + 1))

The 'seq' here should be a 'pseq' to ensure that n2 is (started to be) 
calculated before (n1 + n2 +1) is evaluated (iirc, currently, both work 
with ghc, but it's not guaranteed for seq).
 
>          where 
>            n1 = nfib (n-1)               
>            n2 = nfib (n-2)
>  {-nfib :: Int -> Intnfib n | n <= 1 = 1
>           | otherwise = nfib (n-1) + nfib (n-2)-}
> 
> main = do putStrLn $ show $ nfib 39
> ===========================
> [michael at hostname ~]$ ghc --make -threaded nfib.hs
> [michael at hostname ~]$ ./nfib +RTS -N3

In principle, that is the correct way to compile and run it (note that with 
ghc-7, you don't need the --make).

> nfib: the flag -N3 requires the program to be built with
> -threaded

Have you previously compiled the programme without -threaded?
Unless you snipped the compilation messages, their absence strongly 
indicates so.

If that is the case, you fell victim to ghc's recompilation-avoidance which 
doesn't keep track of the flags a programme/module was compiled with, so it 
saw that nothing [as far as it knows] changed, hence didn't recompile.

Then removing .o and .hi or passing -fforce-recomp will make it recompile 
and link with the threaded runtime.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20110526/ab9d94f3/attachment.htm>


More information about the Haskell-Cafe mailing list