[erlang-questions] performance on multicore computer

Jiansen He jiansenhe@REDACTED
Sat Oct 23 01:07:39 CEST 2010


Thank you so much.

my program is actually 200 lines long.  I posted related parts as follows.


%% -- generate all sequences of length exactly n starting at index i or
later
%% gen_ :: Int -> Int -> [String] -> AssocList [String] Int
gen_ (_, _, [], From) -> From ! {seq, []};
gen_ (I, N, [H | T], From) ->
 if
    N > length([H | T]) -> From ! {seq, []};
    true ->
       gen_(I+1, N, T, self()),
       receive
         {seq, Seq} ->
           From ! {seq, insert({takeN(N, [H | T]), I}, Seq)};
         Msg ->
           io:format("unrecognized message in gen_/4: ~n")
       end
 end.

%% -- generate all sequences of length at most n
%% gen :: Int -> [String] -> AssocList [String] Int
gen(0, _, From) ->
    From ! {seq, []};
gen(N, L, From) ->
    spawn(concordance_1_1, gen_, [0, N, L, self()]),
    spawn(concordance_1_1, gen, [(N-1), L, self()]),
    gen_loop(2, [], From).

gen_loop(0, Seq, From) ->
    From ! {seq, Seq};
gen_loop(N, Seq, From) ->
    receive
      {seq, Seq_} ->
        gen_loop(N-1, merge(Seq, Seq_), From);
      Msg ->
           io:format("f unrecognized message in gen_loop/3: ")
    end.

In Haskell, I could simply write code like this:

-- generate all sequences of length at most n
gen :: Int -> [String] -> AssocList [String] Int
gen 0 _ = []
--gen n l = merge sqs_len_n sqs_up_to_n1
gen n l = sqs_len_n `par` sqs_up_to_n1 `pseq` (merge sqs_len_n sqs_up_to_n1)
            where sqs_up_to_n1 = (gen (n-1) l)
                       sqs_len_n = (gen' 0 n l)



Please let me know if you have difficulty to understand my code.  Many
thanks again.

Jiansen




On Fri, Oct 22, 2010 at 11:51 PM, Jesper Louis Andersen <
jesper.louis.andersen@REDACTED> wrote:

> On Sat, Oct 23, 2010 at 12:42 AM, Jiansen He <jiansenhe@REDACTED>
> wrote:
>
> > Erlang R14B (erts-5.8.1) [source] [smp:4:4] [rq:4] [async-threads:0]
> [hipe]
> > [kernel-poll:false]
>
> The smp:4:4 part should mean you have access to all (logical) CPUs.
>
> > My program should be parallel.  I have a similar Haskell program which
> could
> > consume 380% CPU!
>
> Haskell is different from Erlang, and its parallellism-constructions
> are much different. I wonder if you can give the program or at least
> tell us the strategy is uses for obtaining parallel evaluation. It may
> be here the problem lies (at least that is my hunch)
>
> --
> J.
>


More information about the erlang-questions mailing list