2

I am running Mathematica 7, and I am trying to run a simple Do loop in parallel, using ParallelDo. The following standard, sequential code works fine:

len = 10;

A = Table[0, {len}];

Do[
 A[[i]] = i*10;
 , {i, 1, len}]

However, if I use ParallelDo instead of the standard Do, this code gives error messages:

len = 10;

A = Table[0, {len}];

ParallelDo[
 A[[i]] = i*10;
 , {i, 1, len}]

The error messages that I get are:

Set::noval: Symbol A in part assignment does not have an immediate value.
Set::noval: Symbol A in part assignment does not have an immediate value.
Set::noval: Symbol A in part assignment does not have an immediate value.
Set::noval: Symbol A in part assignment does not have an immediate value.
Set::noval: Symbol A in part assignment does not have an immediate value.
Set::noval: Symbol A in part assignment does not have an immediate value.
General::stop: Further output of Set::noval will be suppressed during this calculation.
General::stop: Further output of Set::noval will be suppressed during this calculation.
Set::noval: Symbol A in part assignment does not have an immediate value.
Set::noval: Symbol A in part assignment does not have an immediate value.
Set::noval: Symbol A in part assignment does not have an immediate value.
Set::noval: Symbol A in part assignment does not have an immediate value.

Is there anything I can do to run this Do loop in parallel?

Thank you!

Andrew DeYoung

Carnegie Mellon University

Saro Taşciyan
  • 5,210
  • 5
  • 31
  • 50
Andrew
  • 1,499
  • 9
  • 25
  • 37

2 Answers2

4

Any reason not to use a ParallelTable?

ParallelTable[i*10,{i, 1, len}]
Eli Lansey
  • 1,130
  • 2
  • 15
  • 28
4

I get no errors on Mathematica 8.0.1.0.

However, the code probably doesn't do what you intended, because A is copied to each subprocess (and changes are local to that subprocess). Hence

ParallelDo[A[[i]] = i*10; Print@A, {i, 1, len}]

prints

Mathematica result

and the final result is A = {0, 0, ..., 0}.

Instead, you should add SetSharedVariable[A] after initializing A. The result is now {10,20,30,40,50,60,70,80,90,100}, as expected.

Mechanical snail
  • 29,755
  • 14
  • 88
  • 113