2

Mathematica 7 を実行しており、.Doを使用して単純なループを並列に実行しようとしていParallelDoます。次の標準的なシーケンシャル コードは正常に動作します。

len = 10;

A = Table[0, {len}];

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

ただし、ParallelDo標準の代わりに使用するとDo、次のコードでエラー メッセージが表示されます。

len = 10;

A = Table[0, {len}];

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

表示されるエラー メッセージは次のとおりです。

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.

このDoループを並行して実行するためにできることはありますか?

ありがとうございました!

アンドリュー・デヤング

カーネギーメロン大学

4

2 に答える 2

4

を使用しない理由はありParallelTableますか?

ParallelTable[i*10,{i, 1, len}]
于 2012-04-09T21:34:29.433 に答える
4

Mathematica 8.0.1.0 ではエラーが発生しません。

Aただし、コードは、各サブプロセスにコピーされる (そして変更はそのサブプロセスに対してローカルである)ため、意図したとおりに動作しない可能性があります。したがって

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

版画

Mathematica の結果

最終結果はA= {0, 0, ..., 0} です。

代わりに、SetSharedVariable[A]初期化後に追加する必要がありますA。期待どおり、結果は{10,20,30,40,50,60,70,80,90,100}になりました。

于 2012-04-09T23:05:51.873 に答える