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:1parforを使用できません。ループ変数の値をアルゴリズムの求める整数値に変更して、この問題を解決することができます。parforループ変数のトラブルシューティングの次の手順については、parfor ループの変数が連続的に増加する整数であることの確認を参照してください。forループとは異なり、parforループを早期に終了することはできません。parforループの本体に return ステートメントや break ステートメントを含めないでください。通信がないため、ループを実行している他の MATLAB インスタンスには停止するタイミングが認識されません。代替策として、parfevalの使用を検討してください。forループからparforループへの変換でまだ問題がある場合は、parfor ループ内の変数のトラブルシューティングを参照してください。
ヒント
tic と toc を使用して、対応する for ループと比較して速度の上昇を測定し、parfor ループをプロファイリングすることができます。ticBytes と tocBytes を使用して、並列プール内のワーカーが送受信するデータ量を測定します。詳細と例については、parfor ループのプロファイリングを参照してください。