Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

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

forx = 0:0.1:1fory = 2:10 A(y) = A(y-1) + y;endend

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

parforx = 0:0.1:1parfory = 2:10 A(y) = A(y-1) + y;endend

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

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

これらの問題を解決するには、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ループの変数は連続的に増加する整数でなければなりません。この例では、

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

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

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

ヒント

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

参考

||

関連するトピック