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

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

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

parfor のご利用の前に

MATLAB の parfor ループ

MATLAB® ソフトウェアにおける parfor ループの基本概念は、標準的な MATLAB の for ループと同じです。MATLAB は値の範囲に対して一連のステートメント (ループ本体) を実行します。parfor 本体の一部は (その parfor が発行される) MATLAB クライアントで実行され、一部は "並列プール" として複数の MATLAB ワーカーで並列に実行されます。parfor の動作に必要なデータはクライアントから複数のワーカーに送信され、そこで計算の大部分が行われ、結果がクライアントに返送されて連結されます。

いくつかの MATLAB ワーカーが同一のループで同時に計算できるため、parfor ループは類似の for ループよりもはるかに優れたパフォーマンスを提供できます。

parfor ループの本体の各実行は "反復" です。MATLAB ワーカーは特定の順序を定めず、相互に無関係なものとして反復を評価します。各反復は独立しているため、反復が何らかの形で同期される保証はなく、またその必要もありません。ワーカー数がループ反復数と同じである場合、各ワーカーはループの 1 つの反復を実行します。ワーカーより多くの反復がある場合は、一部のワーカーが複数のループ反復を実行します。この場合、通信時間を短縮するために、ワーカーが一度に複数の反復を受け取る可能性があります。

parfor をいつ使用するかの決定

モンテ カルロ シミュレーションなど、単純な計算の多数のループ反復が必要な場合は、parfor ループが役に立ちます。parfor は各ワーカーが全体の反復数の一部分を実行するように、ループ反復をグループに分割します。ワーカーは反復を同時に実行できるため、parfor ループは、実行に長時間を要するループ反復がある場合にも役立ちます。

ループでの反復が他の反復の結果によって変わる場合、parfor ループは使用できません。個々の反復は他のすべての反復から独立していなければなりません。parfor ループでは通信の負荷がかかるため、少数の単純計算があるだけの場合には使用してもメリットがないかもしれません。この節にある例の目的は、parfor ループの動作を説明することだけであり、必ずしもこのループに最適な適用例を示すことではありません。

parfor ループの作成

parfor ループについては、ループの各反復が異なる MATLAB ワーカーにより評価されるとするのが最も安全な前提となります。すべての反復がお互いに完全に独立している for ループがある場合、このループは parfor ループの適切な候補となります。基本的に、1 つの反復が別の反復の結果に依存する場合、これらの反復は独立しておらず、並行して評価できないため、そのループは parfor ループへの変換には適しません。

次の例では、左側の for ループと右側の parfor ループで同等な結果が得られます。MATLAB コマンド ウィンドウで両方を入力してみてください。

clear A
for i = 1:8
   A(i) = i;
end
A
clear A
parfor i = 1:8
   A(i) = i;
end
A

A の各要素がそのインデックスと等価であることに注目してください。各要素が自身のループの反復のみに依存し、他の反復には依存していないため、parfor ループは機能します。このような独立したタスクのみを繰り返す for ループは、parfor ループの最適な候補です。

    メモ:    並列プールが実行されていない場合、並列設定が適切に設定されていれば、parfor は既定のクラスター プロファイルを使用してプールを作成します。

for ループと parfor ループの違い

parfor ループは for ループと完全には同じでないため、注意を要する特殊な動作があります。前の例で見たように、インデックスを付けることによりループ内の配列変数 (前の例の A など) にループ変数を割り当てる場合、for ループの場合と同様、その配列の要素はループ処理後に使用可能となります。

これに対して、インデックスが付いていない変数か、またはインデックスがループ変数 i に依存しない変数をループ内で使用する場合を考えます。以下の例を実行し、その後で d および i の値に注目します。

clear A
d = 0; i = 0;
for i = 1:4
   d = i*2;
   A(i) = d;
end
A
d
i
clear A
d = 0; i = 0;
parfor i = 1:4
   d = i*2;
   A(i) = d;
end
A
d
i

両方の例で、A の要素は同じになりますが、d の値は同じになりません。上記左の for ループでは反復が逐次実行されるため、実行後、d にはループの最終反復で保持していた値が設定されます。右側の parfor ループでは、反復が逐次でなく並列に実行されるため、ループの最後に d に確定値を代入することはできません。このことはループの変数 i にも当てはまります。したがって、parfor ループの動作はループ外で変数 di に影響しないように定義されており、これら変数の値はループの前と後で不変です。このため、parfor ループでは個々の反復が他の反復から独立していて、parfor ループの後に続くコードが一切ループ反復シーケンスに依存しないようにすることが求められます。

リダクション代入: 反復ごとに更新される値

次の 2 つの例では、リダクション代入を使用した parfor ループを示します。リダクションはループの反復を通しての累積値です。左側の例では、x を使用して、ループの 10 回の反復にわたる合計を累積します。右側の例では、連結した配列 1:10 を生成します。どちらの例でも、ワーカー上の反復の実行順は結果に影響しません。ワーカーが個々の結果を計算する一方で、クライアントはループの最終結果を適切に累積し、まとめます。

x = 0;
parfor i = 1:10
   x = x + i;
end
x
x2 = [];
n = 10;
parfor i = 1:n
   x2 = [x2, i];
end
x2

ループ反復がランダムな順序で動作する場合、右側の例の連結シーケンスが不連続になると思われるかもしれません。しかし、MATLAB では連結操作が認識され、確定的な結果が出力されます。

フィボナッチ数の計算を試みる次の例は、有効な parfor ループではありません。ある反復における f の要素の値が、他の反復で計算された f の他の要素の値に依存するためです。

f = zeros(1,50);
f(1) = 1;
f(2) = 2;
parfor n = 3:50
    f(n) = f(n-1) + f(n-2);
end

ループの例での作業が終わったら、ワークスペースをクリアしてワーカーの並列プールを削除します。

clear
delete(gcp)

以下の節では、parfor ループのプログラミング上の考慮事項と制限に関する追加の情報を示します。

出力の表示

並列プールで parfor ループを実行する場合、ワーカーからのコマンド ライン出力は変数割り当てからの出力を除いてすべてクライアントのコマンド ウィンドウに表示されます。ワーカーは表示のない MATLAB セッションであるため、プールからはグラフィカルな出力 (Figure ウィンドウなど) は一切表示されません。

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