Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

parforループ反復が独立していることの確認

forループをparforループに変換したときにエラーが表示された場合は、parforループの反復が独立していることを確認します。parforループの反復には "確定的な順序がない"一方で、forループは "逐次的"です。また、parforループの反復は並列プール内の異なる MATLAB®ワーカー上で実行されるため、反復間で情報が共有されません。したがって、parforループの反復は前の反復結果に依存してはなりません。この規則の唯一の例外は、リダクション変数の使用によりループ内に値を累積する場合です。

次の例では、左側でforループを、右側ではparforループを使用して同等な結果を得ています。この例を MATLAB コマンド ウィンドウで試してください。

clearAfori = 1:8 A(i) = i;endA
A = 1 2 3 4 5 6 7 8
clearAparfori = 1:8 A(i) = i;endA
A = 1 2 3 4 5 6 7 8

Aの各要素はそのインデックスと等しくなっています。parforループは機能しますが、これは各要素がインデックス付きのループ変数のみにより決定され、他の変数には依存しないからです。独立したタスクを含むforループは、parforループの最適な候補です。

メモ:

既定では、並列プールがまだ起動していない場合、parforは自動的にワーカーの並列プールを起動します。並列基本設定が適切に設定されている場合、parforは既定のクラスター プロファイルを使用してプールを作成します。

この例では、forループとまったく同様に、parforループの後で配列要素がクライアント ワークスペース内で使用可能になります。

ここで、インデックスが付いていない変数か、またはインデックスがループ変数iに依存しない変数をループ内で使用します。以下の例を実行し、その後dおよびiの値を確認します。

clearAd = 0; i = 0;fori = 1:4 d = i*2; A(i) = d;endA d i
A = 2 4 6 8 d = 8 i = 4
clearAd = 0; i = 0;parfori = 1:4 d = i*2; A(i) = d;endA d i
A = 2 4 6 8 d = 0 i = 0

両方の例でAの要素は同じですが、dの値は異なってます。forループでは反復が逐次実行されるため、実行後のdはループの最終反復で保持していた値を取ります。しかし、parforループでは反復が並列実行されるため、ループの終わりでdに明確な値を代入することは不可能です。この状況はループ変数iにも当てはまります。したがって、parforループの動作は、ループ外の変数diに影響しないように定義されています。これらの値はループの前後で不変です。parforループ内の変数が独立でない場合、forループ内のものとは異なる結果になることがあります。つまり、parforループでは、それぞれの反復が他の反復とは独立している必要があります。parforステートメントに続くすべてのコードは、ループ反復の順序に依存していてはなりません。

コードアナライザーは,ループの反復が依存的かどうかの診断に役立ちます。例のコードでは,反復が前の反復によって定義されています。

parfork = 2:10 x(k) = x(k-1) + k;end
MATLAB エディターでコード アナライザーのメッセージを調べます。この場合、コード アナライザーは依存関係の問題をレポートします。

ただし、他の場合ではコード アナライザーは依存関係をマークできません。

その他一般的なparforの問題のヘルプについては、入れ子にされた parfor ループおよび for ループ、およびその他の parfor の要件を参照してください。

参考

関連する例

詳細