Main Content

parforを使用した対話形式でのループの並列実行

この例では、低速のforループから始めて、代わりにparforループを使用して計算を高速化します。parforは、forループ反復の実行を並列プール内のワーカーに分割します。

この例では、行列のスペクトル半径を計算し、forループをparforループに変換します。高速化の結果を測定する方法を確認します。

  1. MATLAB®エディターで、次のforループを入力します。経過時間を測定するために、tictocを追加します。

    tic n = 200; A = 500; a = zeros(n);fori = 1:n a(i) = max(abs(eig(rand(A))));endtoc
  2. スクリプトを実行し、経過時間を確認します。

    Elapsed time is 31.935373 seconds.

  3. スクリプト内のforループをparforループに置き換えます。

    tic n = 200; A = 500; a = zeros(n);parfori = 1:n a(i) = max(abs(eig(rand(A))));endtoc

  4. 新しいスクリプトを実行し、もう一度実行します。最初の実行は、2 回目の実行よりも遅くなります。これは、並列プールが起動して、コードをワーカーで使用可能にするのに時間がかかるためです。2 回目の実行の経過時間を確認します。

    既定では、MATLAB によって、ローカル マシン上に複数のワーカーからなる並列プールが自動的に開かれます。

    Starting parallel pool (parpool) using the 'local' profile ... connected to 4 workers. ... Elapsed time is 10.760068 seconds.
    4 つのワーカーでのparforの実行は、対応するforループの実行よりも約 3 倍高速です。高速化は、4 つのワーカーでの理想的な高速化の係数 4 よりも小さくなっています。これは、データをクライアントとワーカー間で転送するために必要な時間を含む、並列オーバーヘッドによるものです。この例では、並列オーバーヘッドが比較的小さい良好な高速化と、parforループに変換することの利点が示されています。すべてのforループ反復を、より高速なparforループに変換できるわけではありません。詳細については、parfor を使用するタイミングの決定を参照してください。

parforループを使用するための重要な要件の 1 つは、個々の反復が独立していなければならないことです。parfor処理に適している独立した問題には、モンテカルロ シミュレーションやパラメーター スイープなどがあります。以降の手順については、for ループから parfor ループへの変換を参照してください。

この例では、forループを 4 つのワーカー上のparforに変換することにより計算を高速化しました。並列プール内のワーカー数を増やすことにより、経過時間がさらに短縮される可能性があります。クラスターおよびクラウドへの parfor ループのスケールアップを参照してください。

クラスター プロファイルを変更すると、ループを実行するワーカーの数と、ワーカーをローカルまたはクラスターのどちらに配置するかを制御できます。プロファイルについての詳細は、クラスターの検出とクラスター プロファイルの使用を参照してください。

並列基本設定を変更して、並列プールを自動作成するかどうかと、タイムアウトまでの時間を制御することができます。基本設定についての詳細は、並列基本設定の指定を参照してください。

parforループを使用する代わりに、parsimコマンドを使用して Simulink®モデルを並列実行できます。Simulink の並列使用の詳細と例については、Running Multiple Simulations(Simulink)を参照してください。

参考

|||

関連するトピック