[erlang-questions] Parallel Shootout & a style question

Kevin Scaldeferri <>
Tue Sep 2 02:33:47 CEST 2008


First,  I don't think it's been mentioned here, but the language  
benchmarks shootout finally got some multi-core hardware!

http://shootout.alioth.debian.org/u64q/

At the moment, though, there are almost no submissions of parallelized  
code, so the results are about the same as the existing hardware.

I figured (slightly spurred on by the Haskell community) that we  
should try to submit some modified versions that actually use the  
multiple cores.  So, for example, I made a slight change to the binary  
trees code and got a nearly 2x speedup on my 2-core machine.  In doing  
so, I did run into one of those little things that I've never really  
known the preferred approach for.  My modified function looks like this:

depthLoop(D,M) when D > M -> ok;
depthLoop(D,M) ->
     Self = self(),
     spawn(fun() ->
                   N = 1 bsl (M-D + ?Min),
                   io:fwrite("~w\t trees of depth ~w\t check: ~w~n",
                             [ 2*N, D, sumLoop(N,D,0) ]),
                   Self ! done
           end),
     depthLoop (D+2,M),
     receive done -> done end.


parallelizing would only require the addition of the spawn, except  
that if I do that, the function finishes executing and the program  
exits before most of the processes run at all.  So, I need to add the  
call to self(), the send, and the receive in order to prevent  
premature termination.  So, what I'm wondering is, is there a better  
idiom for achieving this goal?


Thanks,

-kevin



More information about the erlang-questions mailing list