ドキュメンテーション

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

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

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

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

parfor (loopVar = initVal:endVal,opts); statements; end は、opts を使用して、ループ本体での 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);
for i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
toc

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

Elapsed time is 31.935373 seconds.

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

tic
n = 200;
A = 500;
a = zeros(1,n);
parfor i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
toc

新しいスクリプトを実行し、もう一度実行します。最初の実行は、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 workers
 y = 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);
parfor i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
tocBytes(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 を使用します。

例: opts = 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 の並列使用の詳細と例については、複数のシミュレーションの実行 (Simulink)を参照してください。

R2008a で導入