Main Content

parforループまたはspmdステートメント内での透過性の確保

parforループまたはspmdブロックの本体は "透過的"でなければなりません。透過性とは、変数への参照がすべて、コードのテキスト内で可視でなければならないことを意味します。

次の例で、変数Xはワーカーに転送されません。文字ベクトル'X'のみがevalに渡され、Xはループまたはブロックの本体において入力変数として不可視です。その結果、MATLAB®は実行時にエラーを発行します。

X = 5;parforii = 1:4 eval('X');end
X = 5;spmdeval('X');end

同様に、parforまたはspmdステートメント内でclearを実行して、ワークスペースから変数を消去することはできません。

parforii = 1:4 ...>clear('X')% cannot clear: transparency violation...>end
spmd; clear('X');end

別のやり方として、変数が不要になったときにその値を空にすることで、変数により使用されていたメモリを解放できます。

parforii = 1:4 ...>X = []; ...>end

spmdブロックの場合には,クライアントワークスペースから复合を消去できます。

一般に、任意のワーカーに変数全体が存在しない可能性があるため、透過性が要求される場合には変数へのすべての動的アクセスが制限されます。透過的なワークスペースでは、コード内に明示的に指定されていない変数の作成、削除、変更、アクセスまたはクエリはできません。

parforループ内での透過性に違反する他のアクションまたは関数の例には、以下が含まれます。

  • whoおよびwhos

  • workspace引数が'caller'として指定されているevalcevalinおよびassignin

  • loadの出力が変数に代入されない場合のsaveおよびload

  • スクリプトで親ワークスペースの変数の読み取りまたは書き込みが試行される場合、このスクリプトを実行すると透過性の違反につながることがあります。この問題を回避するには、スクリプトを関数に変換し、必要な変数を入力引数または出力引数として指定して、その関数を呼び出します。

メモ

透過性はparforまたはspmdの構成の直接的な本体のみに適用され、そこから呼び出される関数には適用されません。saveおよびload用の回避策は、saveおよびloadの呼び出しを関数内部に隠すことです。

MATLAB は、parfor本体から呼び出される関数に含まれるevalおよびevalcステートメントを正常に"実行します"。

並列の万博1manbetxシミュレーション

parforループを使用する代わりに、parsimコマンドを使用して Simulink®モデルを並列実行できます。Simulink の並列使用の詳細と例については、Running Multiple Simulations(Simulink)を参照してください。

  • Simulink モデルから.matファイルに含まれる変数にアクセスする必要がある場合、これらのパラメーターを各ワーカーのワークスペースに読み込まなければなりません。これは、parpoolを開いた後にparforループの前で行わなければなりません。このためには、例に示すようにspmdまたはparfevalOnAllを使用できます。

    spmdevalin('base','load(''path/to/file'')')end
    parfevalOnAll(@evalin, 0,'base','load(''path/to/file'')')

  • また、MATLAB スクリプト本体で定義された変数がモデルに必要な場合、parforの反復のたびにassigninまたはevalinを使用して、それらの変数を各ワーカーのベース ワークスペースに移動しなければなりません。

参考

|

関連するトピック