Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

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

MATLAB client connected to four MATLAB workers.

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

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

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

    Elapsed time is 31.935373 seconds.

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

    tic
    n = 200;
    A = 500;
    a = zeros(n);
    parfor i = 1:n
        a(i) = max(abs(eig(rand(A))));
    end
    toc

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

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

    Starting parallel pool (parpool) using the 'Processes' 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)を参照してください。

参考

| | |

関連するトピック