ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

プログラミングのヒント

MATLAB パス

spmd ステートメントを実行するすべてのワーカーは、共通のコード ブロック内で呼び出されるすべての関数を実行できるよう、クライアントと同じ MATLAB® 検索パスが設定されていなければなりません。このため、クライアントで cdaddpath または rmpath を使用する場合、そのコマンドは可能な範囲ですべてのワーカーでも実行されます。詳細は、parpool のリファレンス ページを参照してください。ワーカーをクライアントと異なるプラットフォームで実行する場合は、関数 pctRunOnAll を使用してすべてのワーカーに MATLAB パスを適切に設定してください。

エラー処理

spmd ステートメントの実行中にワーカーで発生したエラーは、クライアントにレポートされます。クライアントはすべてのワーカーでの実行の中断を試み、ユーザーにエラーをスローします。

ワーカーで生成されたエラーと警告にはワーカー ID (labindex) が付けられ、MATLAB クライアントで受信された順にクライアントのコマンド ウィンドウに表示されます。

lastwarnspmd 本体内で使用されている場合、その動作は spmd の最後では指定されません。

制限

透明度

spmd ステートメントの本体は "透明" でなければなりません。つまり、変数への参照はすべて "可視" である (すなわち、プログラムのソース コードに記述されている) 必要があります。

次の例で、Xspmd の本体において入力変数として可視でない (文字列 'X' のみが eval に渡されている) ため、ワーカーには転送されません。その結果、MATLAB は実行時にエラーを発します。

X = 5;
spmd
    eval('X');
end

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

spmd; clear('X'); end

ワーカーから特定の変数を消去するには、その Composite をクライアント ワークスペースから消去します。あるいは、spmd ステートメント内で変数が不要になったときにその値を空にすることで、変数によって使用されていたメモリの大部分を解放できます。

spmd
    <statements....>
    X = []; 
end

透明性を損なう他の関数の例は、workspace 引数が 'caller' として指定されている evalcevalin および assigninload の出力が変数に代入されない場合の save および load です。

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

入れ子関数

関数内では、spmd ステートメントの本体から「入れ子関数」を直接参照することはできません。ただし、入れ子関数の関数ハンドルとして定義された変数を使用して入れ子関数を呼び出すことはできます。

spmd 本体はワーカーで実行されるため、spmd ステートメント内で呼び出される入れ子関数で変数が更新されても、その変数は外部の関数のワークスペースでは更新されません。

無名関数

spmd ステートメントの本体では「無名関数」は定義できません。ただし、関数ハンドルを使用して無名関数を参照することはできます。

入れ子にされた spmd ステートメント

spmd ステートメントの本体に別の spmd を直接含めることはできません。ただし、別の spmd ステートメントを含む関数を呼び出すことはできます。内側の spmd ステートメントは別の並列プールでは並列実行されず、そのステートメントが含まれる関数を実行するワーカーの単一スレッドで逐次実行されます。

入れ子にされた parfor ループ

parfor ループの本体に spmd ステートメントを含めることはできず、spmd ステートメントに parfor ループを含めることはできません。

break および return ステートメント

spmd ステートメントの本体に、break または return ステートメントを含めることはできません。

グローバル変数および永続変数

spmd ステートメントの本体に、global または persistent の変数宣言を含めることはできません。

この情報は役に立ちましたか?