Mathematica 9 is now available
Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

ParallelDo and C-compiled routines

  • To: mathgroup at smc.vnet.net
  • Subject: [mg121732] ParallelDo and C-compiled routines
  • From: DmitryG <einschlag at gmail.com>
  • Date: Wed, 28 Sep 2011 02:46:17 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com

Hi All,

I am going to run several instances of a long calculation on different
cores of my computer and then average the results. The program looks
like this:

SetSharedVariable[Res];
ParallelDo[
 Res[[iKer]] = LongRoutine;
 , {iKer, 1, NKer}]

 LongRoutine is compiled. When compiled in C, it is two times faster
than when compiled in Mathematica. In the case of a Do cycle, this
speed difference can be seen, However, in the case of ParallelDo I
have the speed of the Mathematica-compiled routine independently of
the CompilationTarget in LongRoutine, even if I set NKer=1.

What does it mean? Are routines compiled in C unable of parallel
computing? Or there is a magic option to make them work? I tried
Parallelization->True but there is no result, and it seems this option
is for applying the routine to lists.

Here is an example:
************************************************************
NKer = 1;

(* Subroutine compiled in Mathematica *)
m = Compile[ {{x, _Real}, {n, _Integer}},
   	Module[ {sum, inc}, sum = 1.0; inc = 1.0;
    Do[inc = inc*x/i; sum = sum + inc, {i, n}]; sum]];

(* Subroutine compiled in C *)
c = Compile[ {{x, _Real}, {n, _Integer}},
   	Module[ {sum, inc}, sum = 1.0; inc = 1.0;
    Do[inc = inc*x/i; sum = sum + inc, {i, n}]; sum],
   CompilationTarget -> "C"];

(* There is a difference between Mathematica and C *)
Do[
 Print[AbsoluteTiming[m[1.5, 10000000]][[1]]];
 Print[AbsoluteTiming[c[1.5, 10000000]][[1]]];
 , {iKer, 1, NKer}]
Print[];

(* With ParallelDo there is no difference *)
ParallelDo[
 Print[AbsoluteTiming[m[1.5, 10000000]][[1]]];
 Print[AbsoluteTiming[c[1.5, 10000000]][[1]]];
 , {iKer, 1, NKer}]
**************************************************************

Any help?

Best,

Dmitry




  • Prev by Date: Re: How to distribute specific tasks to specific subkernels?
  • Previous by thread: Multiple WEBCAMS with' Mathematica's CurrentImage[]