最新のリリースでは,このページがまだ翻訳されていません。このページの最新版は英语でご覧になれます。

PARFORを使用するタイミングの决定

MATLABのPARFORループ

MATLAB®PARFORループは,ループ本体内にある一连のステートメントを并列で実行します.MATLABクライアントはPARFORコマンドを発行し,MATLABワーカーと连系して “并列プール”内のワーカー上でループ反复を実行します。クライアントはPARFORの处理に必要なデータを复数のワーカーに送信し,そこで计算の大部分が実行されます。结果はクライアントに送り返されて整理されます。

いくつかのMATLABワーカーが同一のループで同时に计算できるため,PARFORループは类似の对于ループよりもはるかにパフォーマンスが向上します。

PARFORループの本体の各実行は“反复”です.MATLABワーカーは特定の顺序を定めず,相互に无关系なものとして反复を评価します。各反复は独立しているため,反复が何らかの形で同期される保证はなく,またその必要もありません。ワーカー数がループ反复数と同じである场合,各ワーカーはループの1つの反复を実行します。ワーカーより多くの反复がある场合は,一部のワーカーが复数のループ反复を実行します。この场合,通信时间を短缩するために,ワーカーが一度に复数の反复を受け取る可能性があります。

PARFORを使用するタイミングの决定

低速の对于ループがある场合は,PARFORループが有用なことがあります。以下の场合はPARFORの使用を検讨してください。

  • 実行に长时间かかるループ反复がいくつかある场合。この场合,ワーカーは复数の长い反复を同时に実行できます。反复の数がワーカー数を超えていることを确认してください。そうでない场合,使用可能なワーカーの一部は使用されません。

  • モンテカルロシミュレーションやパラメータースイープなど,単纯な计算のループ反复が多数ある场合。PARFORはループ反复をグループに分割し,各ワーカーによって反复の総数の一部が実行されます。

以下の场合は,PARFORループが有用でない可能性があります。

  • ベクトル化により对于ループが取り除かれたコードの场合。一般に,コードをより高速で実行させるには,まずコードのベクトル化を试します。この方法の详细については,ベクトル化(MATLAB)を参照してください。コードのベクトル化では,多くの基础MATLABライブラリのマルチスレッド特性によって提供される,组み込み并列处理を活用できます。しかし,ベクトル化したコードがあり “ローカル”ワーカーにしかアクセスできない场合,PARFORループの実行は对于ループより遅くなることがあります。PARFORを使用できるようベクトル化したコードを元に戻すことはしないでください。通常,この解决法はうまく机能しません。

  • 実行时间の短いループ反复の场合。この场合,并列オーバーヘッドが计算の大半を占めます。

ループでの反复が他の反复の结果によって変わる场合,PARFORループは使用できません。个々の反复は他のすべての反复から独立していなければなりません。独立ループの处理についてのヘルプは,PARFORループ反复が独立していることの确认を参照してください。この规则の例外は,リダクション変数の使用によりループ内に値を累积する场合です。

PARFORを使用するタイミングの决定に际しては,并列オーバーヘッドについて検讨します。并列オーバーヘッドには,クライアントとワーカー间での通信,调整,およびデータ転送(データの送受信)に必要な时间が含まれます反复。が高速で评価される场合,このオーバーヘッドは合计时间の大きな部分を占める可能性があります0.2种类のループ反复について考えます。

  • 计算负荷の高いタスクを伴う对于ループ。これらのループは通常,PARFORループへの変换の优れた候补です。计算に必要な时间が,データ転送に必要な时间よりずっと长いためです。

  • 単纯な计算タスクを伴う对于ループ。これらのループでは通常,PARFORループへの変换が有利に働きません。计算に必要な时间と比较して,データ転送に必要な时间がかなりの长さとなるためです。

并列オーバーヘッドの小さいPARFORの例

この例では,对于ループ内の计算负荷の高いタスクから始めます。对于ループが低速なため,代わりにPARFORループを使用して计算を高速化します。PARFORは,对于ループの反复を并列プール内のワーカーに分割して実行します。

この例では,行列のスペクトル半径を计算し,对于ループをPARFORループに変换します。高速化の结果と,并列プール内のワーカーが送受信するデータ量を测定する方法を调べます。

  1. MATLABエディターで,次の对于ループを入力します。计算时间を测定するために,抽搐TOCを追加します。

    抽动N = 200;A = 500;一个零=(N);对于I = 1:N A(I)= MAX(ABS(EIG(RAND(A))));结束TOC
  2. スクリプトを実行し,経过时间を确认します。

    经过时间是31.935373秒。

  3. スクリプト内の对于ループをPARFORループに置き换えます。并列プール内のワーカーが送受信するデータ量を测定するために,ticBytestocBytesを追加します。

    抽动ticBytes(GCP);N = 200;A = 500;一个零=(N);PARFORI = 1:N A(I)= MAX(ABS(EIG(RAND(A))));结束tocBytes(GCP)TOC

  4. 新しいスクリプトを4つのワーカーで実行し,もう一度実行します。最初の実行は,2回目の実行よりも遅くなります。これは,并列プールが起动して,コードをワーカーで使用可能にするのに时间がかかるためです0.2回目の実行でのデータ転送量と経过时间を确认します。

    既定では,MATLABによって,ローカルマシン上に复数のワーカーからなる并列プールが自动的に开かれます。

    开始使用“本地”的个人资料...连接到4名工人并行池(parpool)。... BytesSentToWorkers BytesReceivedFromWorkers __________________ ________________________ 1 15340 7024 2 13328 5712 3 13328 5704 4 13328 5728 55324合计24168经过时间10.760068秒。
    4つのワーカーでのPARFORの実行は,対応する对于ループの计算よりも约3倍高速です。高速化は,4つのワーカーでの理想的な高速化の系数4よりも小さくなっています。これは,データをクライアントとワーカー间で転送するために必要な时间を含む,并列オーバーヘッドによるものです。ticBytestocBytesの结果を使用して,データ転送量を调べます。データ転送に必要な时间はデータのサイズに比例すると仮定します。この概算により,データ転送に必要な时间の指标が得られ,并列オーバーヘッドを他のPARFORループの反复と比较できるようになります。この例では,データ転送量と并列オーバーヘッドが,次の例と比较して小さくなっています。

现在の例では并列オーバーヘッドが小さく,PARFORループへの変换が有利に働いています。この例を,次の例(并列オーバーヘッドの高いPARFORの例を参照)にある単纯なループ反复と比较します。

计算负荷の高いタスクを含むPARFORループの他の例は,入れ子にされたPARFORループおよび用于ループ,およびその他のPARFORの要件を参照してください。

并列オーバーヘッドの高いPARFORの例

この例では,単纯な正弦波を作るループを作成します。对于ループをPARFORループに置き换えても,计算は速く “なりません”。このループには多くの反复がなく,実行に长くはかからないため,実行速度の上升は确认されません。この例では并列オーバーヘッドが高く,PARFORループへの変换が有利に働きません。

  1. 正弦波を作るループを作成します。抽搐TOCを使用して経过时间を测定します。

    抽动N = 1024;A =零(N);对于I = 1:N A(I,:) =(1:N)* SIN(I * 2 * PI / 1024);结束TOC
    经过时间是0.012501秒。
  2. 对于ループをPARFORループに置き换えます。并列プール内のワーカーが送受信するデータ量を测定するために,ticBytestocBytesを追加します。

    抽动ticBytes(GCP);N = 1024;A =零(N);PARFOR(I = 1:N)A(I,:) =(1:N)* SIN(I * 2 * PI / 1024);结束tocBytes(GCP)TOC

  3. 4つのワーカーでスクリプトを実行してから,コードをもう一度実行します。最初の実行は,2回目の実行よりも遅くなります。これは,并列プールが起动して,コードをワーカーで使用可能にするのに时间がかかるためです0.2回目の実行でのデータ転送量と経过时间を确认します。

    BytesSentToWorkers BytesReceivedFromWorkers __________________ ________________________ 1 13176 2.0615e + 06 2 15188 2.0874e + 06 3 13176 2.4056e + 06 4 13176 1.8567e + 06总计54716 8.4112e + 06]经过时间是0.743855秒。
    逐次的な对于ループでは,経过时间が4つのワーカー上でのPARFORループよりはるかに短くなっています。この例では,对于ループをPARFORループに変换することが有利に働きません。その理由は,前述の例(并列オーバーヘッドの小さいPARFORの例を参照)よりもデータ転送量がはるかに多いためです。现在の例では,并列オーバーヘッドが计算时间の大半を占めています。そのため,正弦波の反复ではPARFORループへの変换が有利に働きません。

この例は,并列オーバーヘッドの高い计算でPARFORループへの変换が有利に働かない理由を示しています。コードの高速化の详细については,对于ループからPARFORループへの変换を参照してください。

参考

||

关连するトピック