parfor
ワーカーで for ループの反復を並列実行
構文
説明
parfor は、並列プール内のワーカーで loopVar = initVal:endVal; statements; end for ループの反復を並列実行します。
MATLAB® は、loopVar の値が initVal から endVal までの範囲に含まれる間、statements 内のループ本体のコマンドを実行します。loopVar は 1 ずつ増加する整数値のベクトルを指定します。Parallel Computing Toolbox™ がある場合は、マルチコア コンピューターまたはクラスター上のワーカーからなる並列プールで statements の反復を実行できます。for ループと同様、statements に単一または複数の行を含めることができます。
parfor がスループットの増加にどう役立つかについては、parfor を使用するタイミングの決定を参照してください。
parfor は、次の点で従来の for ループとは異なります。
ループの反復が非確定的な順序で並列実行されます。これは、
parforを使用するためにコードの変更が必要になる場合があるということです。詳しいヘルプは、for ループから parfor ループへの変換を参照してください。ループ反復は、連続的に増加する整数値でなければなりません。
parforループの本体は独立していなければなりません。あるループの反復が前の反復に依存していてはなりません。これは、反復が非確定的な順序で実行されるためです。詳しいヘルプは、parfor ループ反復が独立していることの確認を参照してください。ある
parforループを他のparforループ内で使用することはできません。詳しいヘルプは、入れ子にされた parfor ループおよび for ループ、およびその他の parfor の要件を参照してください。
parfor ( は loopVar = initVal:endVal,M); statements; end M を使用して、ループ本体で statements の評価に使用する並列プールの最大ワーカー数を指定します。M は非負の整数でなければなりません。
既定では、MATLAB は並列プール内で使用可能なワーカーを使用します。既定のプロファイルの PreferredPoolNumWorkers プロパティを使用して、並列プール内の既定のワーカー数を変更できます。既定のプール サイズに影響を及ぼす可能性のあるすべての要因については、プール サイズに影響する要因を参照してください。関数 parpool を使用して、並列プール内の既定のワーカー数をオーバーライドできます。プールに使用可能なワーカーがない場合や M が 0 の場合でも、MATLAB はループ本体を非確定的な順序で実行しますが、これは並列実行ではありません。コードをテストするときには、この構文を使用して並列実行と逐次実行を切り替えます。
この構文を使用して反復を並列で実行するには、ワーカーの並列プールが必要です。既定では、parfor を実行すると、既定のプロファイルで定義された並列環境にワーカーの並列プールが自動的に作成されます。既定の並列環境は [Processes] です。プロファイルは [並列設定] で変更できます。詳細については、並列設定の指定を参照してください。
parfor ( は、loopVar = initVal:endVal,opts); statements; endopts を使用して、ループ本体での statements の評価に使用するリソースを指定します。parfor のオプション セットを作成するには、関数 parforOptions を使用します。この方法では、最初に並列プールを作成せずに parfor をクラスター上で実行して、parfor により反復をワーカーのサブレンジに分割する方法を制御できます。
parfor ( は、並列プールを作成せずに、loopVar = initVal:endVal,cluster); statements; endcluster のワーカー上で statements を実行します。これは、parfor (loopVar = initVal:endVal,parforOptions(cluster)); statements; end の実行と等価です。
parfor ( は、loopVar = initVal:endVal,pool); statements; endparallel.Pool オブジェクト pool で指定された並列プールで statements を実行します。この構文は、gcp 関数から返されるプール以外のプールで parfor ステートメントを評価する場合に使用します。 (R2025a 以降)
例
入力引数
ヒント
以下の場合に
parforループを使用します。簡単な計算のループ反復が多数ある場合。
parforは、ループ反復をグループに分割し、各スレッドで 1 つのグループの反復を実行できるようにします。実行に長時間かかるループ反復がいくつかある場合。
ループの反復が他の反復の結果に依存する場合は、
parforループを使用しないでください。リダクションはこのルールの例外です。"リダクション" 変数は、すべての反復に全体として依存する一方で、反復順序には依存しない値を累積します。詳細については、リダクション変数を参照してください。
parforを使用する際、結果を取得するにはループが完了するまで待たなければなりません。クライアントの MATLAB がブロックされ、ループを早期に終了することができません。中間結果を取得する場合や、forループを早期終了する場合は、代わりにparfevalを試用してください。クラスター オブジェクトを指定しない限り、
parforループは既存の並列プールで実行されます。プールがない場合、並列設定でプールの自動起動が無効になっていなければ、parforにより新しい並列プールが起動されます。並列プールがなく、parforによる並列プールの起動もできない場合、ループはクライアント セッションで逐次実行されます。並列プールのクラスター プロファイルで
AutoAttachFilesプロパティがtrueに設定されている場合、MATLAB はparforループを解析して実行に必要なコード ファイルを決定します。listAutoAttachedFilesを参照してください。次に、MATLAB はそれらのファイルを自動で並列プールに加え、ワーカーでコードを使用できるようにします。スクリプトを
parforループ内で直接呼び出すことはできません。ただし、スクリプトを呼び出す関数を呼び出すことは可能です。parforループ内でを使用しないでください。ワークスペースの透過性に違反します。parfor ループまたは spmd ステートメント内での透過性の確保を参照してください。clearparforループを使用する代わりに、parsimコマンドを使用して Simulink® モデルを並列実行できます。Simulink の並列使用の詳細と例については、Running Multiple Simulations (Simulink)を参照してください。GPU 計算の場合:
GPU が 1 つであり、ループ反復ですべて同じ GPU を使用する場合は、
parforループを使用しないでください。GPU には、計算を並列実行できる多数のマイクロプロセッサが含まれており、parforループを使用して GPU 計算をさらに並列化しようとしても、コードが高速化される可能性はほとんどありません。複数の GPU があり、計算で GPU 対応関数を使用している場合は、
parforループを使用してください。parforループで複数の GPU を使用する方法の詳細については、複数の GPU での MATLAB 関数の実行を参照してください。
拡張機能
バージョン履歴
R2008a で導入参考
for | gcp | listAutoAttachedFiles | parpool | parfeval | ticBytes | tocBytes | send | afterEach | parforOptions