Main Content

parfor

ワーカーでforループの反復を並列実行

説明

parforloopVar=initVal:endVal;statements; endは、並列プール内のワーカーでforループの反復を並列実行します。

MATLAB®は、loopVarの値がinitValからendValまでの範囲に含まれる間、statements内のループ本体のコマンドを実行します。loopVarは 1 ずつ増加する整数値のベクトルを指定します。Parallel Computing Toolbox™ がある場合は、マルチコア コンピューターまたはクラスター上のワーカーからなる並列プールでstatementsの反復を実行できます。forループと同様、statementsに単一または複数の行を含めることができます。

parforがスループットの増加にどう役立つかについては、parfor を使用するタイミングの決定を参照してください。

parforは、次の点で従来のforループとは異なります。

parfor (loopVar=initVal:endVal,M);statements; endMを使用して、ループ本体でstatementsの評価に使用する並列プールの最大ワーカー数を指定します。Mは非負の整数でなければなりません。

既定では、MATLAB は並列プール内で使用可能なワーカーを使用します。[ホーム]タブの[環境]セクションで、[並列][並列基本設定]を選択してワーカー数を変更することができます。parpoolを使用して、並列プール内の既定のワーカー数をオーバーライドできます。プールに使用可能なワーカーがない場合やMが 0 の場合でも、MATLAB はループ本体を非確定的な順序で実行しますが、これは並列実行ではありません。コードをテストするときには、この構文を使用して並列実行と逐次実行を切り替えます。

この構文を使用して反復を並列で実行するには、ワーカーの並列プールが必要です。既定では、parforを実行すると、既定のクラスター プロファイルで定義されたクラスターにワーカーの並列プールが自動的に作成されます。既定のクラスターは[local]です。[並列基本設定]でクラスターを変更できます。詳細については、並列基本設定の指定を参照してください。

parfor (loopVar=initVal:endVal,选择);statements; endは、选择を使用して、ループ本体でのstatementsの評価に使用するリソースを指定します。parforのオプション セットを作成するには、関数parforOptionsを使用します。この方法では、最初に並列プールを作成せずにparforをクラスター上で実行して、parforにより反復をワーカーのサブレンジに分割する方法を制御できます。

parfor (loopVar=initVal:endVal,cluster);statements; endは、並列プールを作成せずに、clusterのワーカー上でstatementsを実行します。これは、parfor (loopVar = initVal:endVal,parforOptions(cluster)); statements; endの実行と等価です。

すべて折りたたむ

計算量の多いタスクについてparforループを作成し、得られた高速化を測定します。

MATLAB エディターで、次のforループを入力します。経過時間を測定するために、tictocを追加します。

tic n = 200; A = 500; a = zeros(1,n);fori = 1:n a(i) = max(abs(eig(rand(A))));endtoc

スクリプトを実行し、経過時間を確認します。

Elapsed time is 31.935373 seconds.

スクリプト内のforループをparforループに置き換えます。

tic n = 200; A = 500; a = zeros(1,n);parfori = 1:n a(i) = max(abs(eig(rand(A))));endtoc

新しいスクリプトを実行し、もう一度実行します。最初の実行は、2 回目の実行よりも遅くなります。これは、並列プールを起動して、コードをワーカーで使用可能にしなければならないためです。2 回目の実行の経過時間を確認します。

既定では、MATLAB によって、ローカル マシン上に複数のワーカーからなる並列プールが自動的に開かれます。

Elapsed time is 10.760068 seconds.

forループを 4 つのワーカー上のparforループに変換することにより,計算が高速になることを確認してください。並列プール内のワーカー数を増やすことにより、経過時間がさらに短縮される可能性があります。詳細については、for ループから parfor ループへの変換およびクラスターおよびクラウドへの parfor ループのスケールアップを参照してください。

1 つのparforループに対するワーカーの最大数Mを指定できます。M = 0を設定して、プールが開いている場合でも、ワーカーを使用せずにデスクトップの MATLAB でループ本体を実行します。M = 0の場合、MATLAB はループ本体を非確定的な順序で実行しますが、並列では実行しません。したがって、parforループが独立であり複数のワーカー上での実行に適しているかどうかをチェックできます。これは、parforループの内容をデバッグできる最も簡単な方法です。parforループ本体には直接ブレークポイントを設定できませんが、parforループ本体から呼び出される関数にブレークポイントを設定できます。

M = 0を指定して、プールが開いている場合でもデスクトップの MATLAB でparforループ本体を実行します。

M = 0;% M specifies maximum number of workersy = ones(1,100);parfor(i = 1:100,M) y(i) = i;end

並列プール内のワーカー数を制御するには、並列基本設定の指定およびparpoolを参照してください。

現在の並列プール内のワーカーが送受信するデータ量を測定するために、parforループの前にticBytes(gcp)、後にtocBytes(gcp)を追加します。gcpを引数として使用して、現在の並列プールを取得します。

現在の並列プールがまだある場合は、その並列プールを削除します。

delete(gcp('nocreate'))
tic ticBytes(gcp); n = 200; A = 500; a = zeros(1,n);parfori = 1:n a(i) = max(abs(eig(rand(A))));endtocBytes(gcp) toc

新しいスクリプトを実行し、もう一度実行します。最初の実行は、2 回目の実行よりも遅くなります。これは、並列プールを起動して、コードをワーカーで使用可能にしなければならないためです。

既定では、MATLAB によって、ローカル マシン上に複数のワーカーからなる並列プールが自動的に開かれます。

Starting parallel pool (parpool) using the 'local' profile ... connected to 4 workers. ... BytesSentToWorkers BytesReceivedFromWorkers __________________ ________________________ 1 15340 7024 2 13328 5712 3 13328 5704 4 13328 5728 Total 55324 24168

ticBytestocBytesの結果を使用して、並列プール内のワーカーが送受信したデータ量を調べることができます。この例では、データ転送量はわずかです。parforループの詳細については、parfor を使用するタイミングの決定およびfor ループから parfor ループへの変換を参照してください。

関数parclusterを使用してクラスター オブジェクトを作成し、このクラスター オブジェクトを使用してparforのオプション セットを作成します。既定で、parclusterは既定のクラスター プロファイルを使用します。既定のプロファイルは、MATLAB の[ホーム]タブの[並列][既定のクラスターの選択]で確認します。

cluster = parcluster;

クラスター内で直接parforの計算を実行するには、クラスター オブジェクトをparforの 2 番目の入力引数として渡します。

この方法を使用すると、parforはクラスター内の使用可能なすべてのワーカーを使用でき、ワーカーはループの完了後すぐに使用可能になります。この方法は、クラスターが並列プールをサポートしていない場合にも役立ちます。反復の分割などの他のオプションを制御する場合は、parforOptionsを使用します。

values = [3 3 3 7 3 3 3];parfor(i=1:numel(values),cluster) out(i) = norm(pinv(rand(values(i)*1e3)));end

必要以上に長い時間ワーカーを使用することなく、大規模なクラスター上で parfor を実行するには、この構文を使用します。

入力引数

すべて折りたたむ

初期値initValと最終値endValを持つループ インデックス変数。変数は任意の数値型にすることができますが、値は整数でなければなりません。

parforループの変数は必ず、連続的に増加する整数にしてください。詳しいヘルプは、parfor ループ内の変数のトラブルシューティングを参照してください。

parforループ変数の範囲は、サポートされている範囲を超えてはなりません。詳しいヘルプは、parfor ループでのオーバーフローの回避を参照してください。

データ型:single|double|int8|int16|int32|int64|uint8|uint16|uint32|uint64

ループ インデックス変数loopVarの初期値。変数は任意の数値型にすることができますが、値は整数でなければなりません。endValparforの範囲ベクトルを指定する場合は、M:Nの形式にしなければなりません。

データ型:single|double|int8|int16|int32|int64|uint8|uint16|uint32|uint64

ループ インデックス変数loopVarの最終値。変数は任意の数値型にすることができますが、値は整数でなければなりません。initValparforの範囲ベクトルを指定する場合は、M:Nの形式にしなければなりません。

データ型:single|double|int8|int16|int32|int64|uint8|uint16|uint32|uint64

ループ本体。テキストとして指定します。parforループで実行する一連の MATLAB コマンド。

parforループを使用するために、コードを変更しなければならないことがあります。詳しいヘルプは、for ループから parfor ループへの変換を参照してください。

parforループを入れ子にしないでください。入れ子にされた parfor ループおよび for ループ、およびその他の parfor の要件を参照してください。

並列実行するワーカーの最大数。非負の整数として指定します。上限を指定すると、追加のワーカーが使用可能な場合でも、MATLAB は上限までの数しか使用しません。使用可能なワーカー数より多くのワーカーを要求すると、MATLAB は、呼び出し時に使用可能な最大数のワーカーを使用します。ループの反復数がワーカー数より少ない場合、一部のワーカーは作業を行いません。

parforループが複数のワーカーで実行できない場合 (たとえば、使用可能なコアが 1 つのみであるか、Mが 0 の場合)、MATLAB はループを逐次的に実行します。この場合でも、MATLAB はループ本体を非確定的な順序で実行します。コードをテストするときには、この構文を使用して並列と逐次を切り替えます。

parforのオプション。ClusterOptionsオブジェクトとして指定します。parforのオプション セットを作成するには、関数parforOptionsを使用します。

例:选择= parforOptions(parcluster);

クラスター。parforが実行されるparallel.Clusterオブジェクトとして指定します。クラスター オブジェクトを作成するには、関数parclusterを使用します。

例:cluster = parcluster('local')

データ型:parallel.Cluster

ヒント

  • 以下の場合にparforループを使用します。

    • 簡単な計算のループ反復が多数ある場合。parforは、ループ反復をグループに分割し、各スレッドで 1 つのグループの反復を実行できるようにします。

    • 実行に長時間かかるループ反復がいくつかある場合。

  • ループの反復が他の反復の結果に依存する場合は、parforループを使用しないでください。

    リダクションはこのルールの例外です。"リダクション"変数は、すべての反復に全体として依存する一方で、反復順序には依存しない値を累積します。詳細については、リダクション変数を参照してください。

  • parforを使用する際、結果を取得するにはループが完了するまで待たなければなりません。クライアントの MATLAB がブロックされ、ループを早期に終了することができません。中間結果を取得する場合や、forループを早期終了する場合は、代わりにparfevalを試用してください。

  • クラスター オブジェクトを指定しない限り、parforループは既存の並列プールで実行されます。プールがない場合、並列基本設定でプールの自動起動が無効になっていなければ、parforにより新しい並列プールが起動されます。並列プールがなく、parforによる並列プールの起動もできない場合、ループはクライアント セッションで逐次実行されます。

  • 並列プールのクラスター プロファイルでAutoAttachFilesプロパティがtrueに設定されている場合、MATLAB はparforループを解析して実行に必要なコード ファイルを決定します。listAutoAttachedFilesを参照してください。次に、MATLAB はそれらのファイルを自動で並列プールに加え、ワーカーでコードを使用できるようにします。

  • スクリプトをparforループ内で直接呼び出すことはできません。ただし、スクリプトを呼び出す関数を呼び出すことは可能です。

  • parforループ内でclearを使用しないでください。ワークスペースの透過性に違反します。parfor ループまたは spmd ステートメント内での透過性の確保を参照してください。

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

バージョン履歴

R2008a で導入