Main Content

for ループから parfor ループへの変換

場合によっては、for ループを parfor ループに変換するためにコードを修正しなければなりません。この例では、単純な入れ子にされた for ループを使用して parfor ループの問題点を診断し、修正する方法を説明します。次のコードを MATLAB® で実行し、その結果を調べます。

for x = 0:0.1:1
    for y = 2:10
        A(y) = A(y-1) + y;
    end
end

コードを高速化するために、for ループを parfor ループに変換してみます。次のコードではエラーが出ることを確認してください。

parfor x = 0:0.1:1
    parfor y = 2:10
        A(y) = A(y-1) + y;
    end
end

この場合、修正なしで for ループを parfor ループに単純に変換することはできません。これを機能させるには、コードの数箇所を変更しなければなりません。問題点を診断するために、MATLAB エディターでコード アナライザーのメッセージを調べます。

Example MATLAB Code Analyzer messages indicating that parfor or spmd cannot be used inside another parfor loop and that the parfor-loop cannot run due to the way variable x is used.

次のコードには、for ループを parfor ループに変換するときの一般的な問題が示されています。

Parfor-loop example code showing common problems, including using a noninteger as the parfor loop variable, using nested parfor loops, and making an iteration of a parfor-loop dependent on a previous iteration.

これらの問題を解決するには、parfor を使用するようにコードを修正しなければなりません。parfor ループの本体は、複数の MATLAB ワーカーを非確定的な順序で使用して、並列プール内で実行されます。したがって、parfor ループの本体に関する以下の要件を満たさなければなりません。

  1. parfor ループの本体は独立していなければなりません。あるループの反復が前の反復に依存していてはなりません。反復が非確定的な順序で並列実行されるためです。この例では、

    A(y) = A(y-1) + y;
    は独立していないため parfor を使用できません。独立性の問題を扱う次のステップについては、parfor ループ反復が独立していることの確認を参照してください。

  2. ある parfor ループを別の parfor ループの内側に入れ子にすることはできません。この例には入れ子にされた 2 つの for ループがあるため、1 つの for ループのみを parfor ループに置き換えることができます。代わりに、parfor ループを使用する関数を、もう一方の parfor ループ本体内で呼び出すことができます。ただし、すべてのワーカーは最も外側のループの並列化に使用されるため、こうして入れ子にされた parfor ループに計算上の利点はありません。入れ子にされたループの扱いについてのヘルプは、入れ子にされた parfor ループおよび for ループ、およびその他の parfor の要件を参照してください。

  3. parfor ループの変数は連続的に増加する整数でなければなりません。この例では、

    parfor x = 0:0.1:1
    のループ変数は非整数であるため、ここでは parfor を使用できません。ループ変数の値をアルゴリズムの求める整数値に変更して、この問題を解決することができます。parfor ループ変数のトラブルシューティングの次の手順については、parfor ループの変数が連続的に増加する整数であることの確認を参照してください。

  4. for ループとは異なり、parfor ループを早期に終了することはできません。parfor ループの本体に return ステートメントや break ステートメントを含めないでください。通信がないため、ループを実行している他の MATLAB インスタンスには停止するタイミングが認識されません。代替策として、parfeval の使用を検討してください。

    for ループから parfor ループへの変換でまだ問題がある場合は、parfor ループ内の変数のトラブルシューティングを参照してください。

ヒント

tictoc を使用して、対応する for ループと比較して速度の上昇を測定し、parfor ループをプロファイリングすることができます。ticBytestocBytes を使用して、並列プール内のワーカーが送受信するデータ量を測定します。詳細と例については、parfor ループのプロファイリングを参照してください。

参考

| |

関連するトピック