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