3
$\begingroup$

First launch kernels

LaunchKernels[4]

{KernelObject[5, "local"], KernelObject[6, "local"], KernelObject[7, "local"], KernelObject[8, "local"]}

Then I calculate This cell

f1 = Table[ParallelSubmit[{j}, Sum[N@Gamma[i + j], {i, 10000}]], {j, 4}];
out1=AbsoluteTiming[WaitAll[f1]];out1[[1]]

The output is

4.025230

But when I just set a=0

a = 0;
f2 = Table[ParallelSubmit[{j}, Sum[N@Gamma[a + i + j], {i, 10000}]], {j, 4}];
out2 = AbsoluteTiming[WaitAll[f2]]; out2[[1]]

The output

0.729042

Is much speeder then before.

The result is same

out1[[2]] == out2[[2]]
True

Why? I'm very confused.

$\endgroup$
7
$\begingroup$

The definition a = 0 is not being distributed among the subkernels, therefore in f2 the Sum is evaluated symbolically. After the results are returned to the master kernel a is substituted in.

It happens that in this case a symbolic sum is much faster:

ClearAll[a]

Sum[N@Gamma[i + 1], {i, 10000}] // AbsoluteTiming

Sum[N@Gamma[a + i + 1], {i, 10000}] /. a -> 0 // AbsoluteTiming
{1.08047, 2.846544335353437*10^35659}

{0.0687247, 2.8465443354*10^35659}

The reason is that in the first line Gamma is being computed with exact arithmetic, then converted to machine precision with N. If we simply use 1` instead it is fast:

Sum[Gamma[i + 1`], {i, 10000}] // AbsoluteTiming
{0.0585066, 2.8465443354*10^35659}

The second case is fast because Gamma is does not have NHoldAll or similar, therefore 1 is converted to 1. which has the same effect:

N @ Gamma[a + i + 1]
Gamma[1. + a + i]

Reference: Converting to machine precision

| improve this answer | |
$\endgroup$
  • $\begingroup$ Beat me to it... (+1) $\endgroup$ – kale Jun 24 '15 at 2:25
  • $\begingroup$ @kale Sorry, but thank you. $\endgroup$ – Mr.Wizard Jun 24 '15 at 2:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.