2

Ich renne Mathematica 7, und ich versuche, eine einfache Do Schleife parallel zu betreiben, mit ParallelDo. Der folgende Standard, sequentieller Code funktioniert gut:Warum arbeitet diese Mathematica 7 Do-Schleife sequenziell, erzeugt aber parallel Fehler (mit Paralleldo)?

len = 10; 

A = Table[0, {len}]; 

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

Wenn ich jedoch ParallelDo anstelle der Standard-Do verwende, gibt diesen Code Fehlermeldungen:

len = 10; 

A = Table[0, {len}]; 

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

Die Fehlermeldungen, die wir bekommen sind:

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. 

gibt es etwas, was ich tun kann diese do Schleife parallel laufen zu lassen?

Vielen Dank!

Andrew DeYoung

Carnegie Mellon University

Antwort

4

Ich bekomme keine Fehler auf Mathematica 8.0.1.0.

Der Code tut jedoch wahrscheinlich nicht, was Sie beabsichtigt haben, weil A in jeden Unterprozess kopiert wird (und Änderungen sind lokal für diesen Unterprozess). Daher

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

druckt

Mathematica result

und das Endergebnis ist A = {0, 0, ..., 0}.

Stattdessen sollten Sie nach der Initialisierung ASetSharedVariable[A] hinzufügen. Das Ergebnis ist jetzt {10,20,30,40,50,60,70,80,90,100}, wie erwartet.

4

Gibt es Gründe, keine ParallelTable zu benutzen?

ParallelTable[i*10,{i, 1, len}]