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 エディターでコード アナライザーのメッセージを調べます。
次のコードには、for
ループを parfor
ループに変換するときの一般的な問題が示されています。
これらの問題を解決するには、parfor
を使用するようにコードを修正しなければなりません。parfor
ループの本体は、複数の MATLAB ワーカーを非確定的な順序で使用して、並列プール内で実行されます。したがって、parfor
ループの本体に関する以下の要件を満たさなければなりません。
parfor
ループの本体は独立していなければなりません。あるループの反復が前の反復に依存していてはなりません。反復が非確定的な順序で並列実行されるためです。この例では、は独立していないためA(y) = A(y-1) + y;
parfor
を使用できません。独立性の問題を扱う次のステップについては、parfor ループ反復が独立していることの確認を参照してください。ある
parfor
ループを別のparfor
ループの内側に入れ子にすることはできません。この例には入れ子にされた 2 つのfor
ループがあるため、1 つのfor
ループのみをparfor
ループに置き換えることができます。代わりに、parfor
ループを使用する関数を、もう一方のparfor
ループ本体内で呼び出すことができます。ただし、すべてのワーカーは最も外側のループの並列化に使用されるため、こうして入れ子にされたparfor
ループに計算上の利点はありません。入れ子にされたループの扱いについてのヘルプは、入れ子にされた parfor ループおよび for ループ、およびその他の parfor の要件を参照してください。parfor
ループの変数は連続的に増加する整数でなければなりません。この例では、のループ変数は非整数であるため、ここではparfor x = 0:0.1:1
parfor
を使用できません。ループ変数の値をアルゴリズムの求める整数値に変更して、この問題を解決することができます。parfor
ループ変数のトラブルシューティングの次の手順については、parfor ループの変数が連続的に増加する整数であることの確認を参照してください。for
ループとは異なり、parfor
ループを早期に終了することはできません。parfor
ループの本体に return ステートメントや break ステートメントを含めないでください。通信がないため、ループを実行している他の MATLAB インスタンスには停止するタイミングが認識されません。代替策として、parfeval
の使用を検討してください。for
ループからparfor
ループへの変換でまだ問題がある場合は、parfor ループ内の変数のトラブルシューティングを参照してください。
ヒント
tic
と toc
を使用して、対応する for
ループと比較して速度の上昇を測定し、parfor
ループをプロファイリングすることができます。ticBytes
と tocBytes
を使用して、並列プール内のワーカーが送受信するデータ量を測定します。詳細と例については、parfor ループのプロファイリングを参照してください。