Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

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

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

X = 5;
parfor ii = 1:4
    eval('X');
end
X = 5;
spmd
    eval('X');
end

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

parfor ii = 1:4
    <statements...>
    clear('X')  % cannot clear: transparency violation
    <statements...>
end
spmd; clear('X'); end

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

parfor ii = 1:4
    <statements...>
    X = [];
    <statements...>
end

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

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

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

  • who および whos

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

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

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

メモ

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

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

並列の Simulink シミュレーション

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

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

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

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

参考

|

関連するトピック