最新のリリースでは,このページがまだ翻訳されていません。このページの最新版は英语でご覧になれます。

PARFORループ反复が独立していることの确认

对于ループをPARFORループに変换したときにエラーが表示された场合は,PARFORループの反复が独立していることを确认します。PARFORループの反复には “确定的な顺序がない”一方で,对于ループは “逐次的”です。また,PARFORループの反复は并列プール内の异なるMATLAB®ワーカー上で実行されるため,反复间で情报が共有されません。したがって,PARFORループの反复は前の反复结果に依存してはなりません。この规则の唯一の例外は,リダクション変数の使用によりループ内に値を累积する场合です。

次の例では,左侧で对于ループを,右侧ではPARFORループを使用して同等な结果を得ています。この例をMATLABコマンドウィンドウで试してください。

明确一个对于I = 1:8 A(I)= I;结束一个
A = 1 2 3 4 5 6 7 8
明确一个PARFORI = 1:8 A(I)= I;结束一个
A = 1 2 3 4 5 6 7 8

一个の各要素はそのインデックスと等しくなっています。PARFORループは机能しますが,これは各要素がインデックス付きのループ変数のみにより决定され,他の変数には依存しないからです。独立したタスクを含む对于ループは,PARFORループの最适な候补です。

メモ:

既定では,并列プールがまだ起动していない场合,PARFORは自动的にワーカーの并列プールを起动します。并列设定が适切に设定されている场合,PARFORは既定のクラスタープロファイルを使用してプールを作成します。

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

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

明确一个d = 0;I = 0;对于I = 1:4 d = I * 2;A(1)= d;结束一d我
A = 2 4 6 8 d = 8 i = 4的
明确一个d = 0;I = 0;PARFORI = 1:4 d = I * 2;A(1)= d;结束一d我
A = 2 4 6 8 d = 0 I = 0

両方の例で一个の要素は同じですが,dの値は异なってます。对于ループでは反复が逐次実行されるため,実行后のdはループの最终反复で保持していた値を取ります。しかし,PARFORループでは反复が并列実行されるため,ループの终わりでdに明确な値を代入することは不可能です。この状况はループ変数一世にも当てはまります。したがって,PARFORループの动作は,ループ外の変数d一世に影响しないように定义されています。これらの値はループの前后で不変です。PARFORループ内の変数が独立でない场合,对于ループ内のものとは异なる结果になることがあります。つまり,PARFORループでは,それぞれの反复が他の反复とは独立している必要があります。PARFORステートメントに続くすべてのコードは,ループ反复の顺序に依存していてはなりません。

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

PARFORK = 2:10 X(K)= X(K-1)+ K;结束
MATLABエディターでコードアナライザーのメッセージを调べます。この场合,コードアナライザーは依存关系の问题をレポートします。

ただし,他の场合ではコードアナライザーは依存关系をマークできません。

その他一般的なPARFORの问题のヘルプについては,入れ子にされたPARFORループおよび用于ループ,およびその他のPARFORの要件を参照してください。

参考

关连する例

详细