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
ループ内での透過性に違反する他のアクションまたは関数の例には、以下が含まれます。
メモ
透過性は parfor
または spmd
の構成の直接的な本体のみに適用され、そこから呼び出される関数には適用されません。save
および load
用の 1 つの回避策は、save
および load
の呼び出しを関数内部に隠すことです。もう 1 つの回避策は、"-fromstruct"
オプションを指定して save
を呼び出すことです。詳細については、parfor ループ内の変数の保存を参照してください。
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
を使用して、それらの変数を各ワーカーのベース ワークスペースに移動しなければなりません。