parfor
を使用した対話形式でのループの並列実行
この例では、低速の for
ループから始めて、代わりに parfor
ループを使用して計算を高速化します。parfor
は、for
ループ反復の実行を並列プール内のワーカーに分割します。
この例では、行列のスペクトル半径を計算し、for
ループを parfor
ループに変換します。高速化の結果を測定する方法を確認します。
MATLAB® エディターで、次の
for
ループを入力します。経過時間を測定するために、tic
とtoc
を追加します。tic n = 200; A = 500; a = zeros(n); for i = 1:n a(i) = max(abs(eig(rand(A)))); end toc
スクリプトを実行し、経過時間を確認します。
Elapsed time is 31.935373 seconds.
スクリプト内の
for
ループをparfor
ループに置き換えます。tic n = 200; A = 500; a = zeros(n); parfor i = 1:n a(i) = max(abs(eig(rand(A)))); end toc
新しいスクリプトを実行し、もう一度実行します。最初の実行は、2 回目の実行よりも遅くなります。これは、並列プールが起動して、コードをワーカーで使用可能にするのに時間がかかるためです。2 回目の実行の経過時間を確認します。
既定では、MATLAB によって、ローカル マシン上に複数のワーカーからなる並列プールが自動的に開かれます。
4 つのワーカーでのStarting parallel pool (parpool) using the 'Processes' profile ... connected to 4 workers. ... Elapsed time is 10.760068 seconds.
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)を参照してください。