MATLAB Distributed Computing Server


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

明示的な並列通信のプロファイル

この例では、最近傍のラボに対する明示的な通信をプロファイルする方法を示します。labSendlabReceive および labSendReceive の使用について説明し、このアルゴリズムを実装する遅い (正しくない) 方法と速い (最適の) 方法を示します。この問題は、並列プロファイラーを使用して検討します。

必要条件:

この例における図は、12 ノードのクラスターから作成されています。

例のコードには明示的な通信が使われています。MATLAB® では、明示的通信は Parallel Computing Toolbox の通信プリミティブ (たとえば、labSendlabReceivelabSendReceivelabBarrier) を直接使用することと同じ意味です。このタイプの通信に伴うパフォーマンスの問題は、基本のハードウェアに関連していない場合に調査が難しい可能性があります。並列プロファイラーを使うと、こうした問題の多くは対話的に特定できます。プログラムのさまざまな部分を別々の関数に分離できることを覚えておくことは大切です。データによっては関数ごとにしか収集できないものもあるため、これはプロファイル作成に際して役立ちます。

アルゴリズム

プロファイルの対象とするアルゴリズムは、最近傍の通信方式です。それぞれの MATLAB ワーカーは、それ自体と、隣接する 1 つのラボからのデータのみを必要とします。こうしたタイプのデータ並列パターンは多くの行列問題に適していますが、間違って扱うと、不必要に遅いものとなります。説明を加えるとすれば、各ラボは、隣接するラボで "既に" 使用可能となっているデータに依存しています。たとえば、4 つのラボからなるクラスターで、ラボ 1 はラボ 2 に何らかのデータを送信し、ラボ 4 からのデータを必要とするというように、各ラボは他の 1 つのラボのみに依存しています。

1 は 4 に依存

2 は 1 に依存

3 は 2 に依存

4 は 3 に依存

与えられた任意の通信アルゴリズムを labSend および labReceive を使用して実装することが可能です。labReceive は通信が完了するまで常にプログラムをブロックしますが、labSend はデータが小規模であればブロックしない可能性があります。しかし、labSend を最初に使用しても、ほとんどの場合は役立ちません。

このアルゴリズムを成り立たせるための 1 つの方法は、すべてのラボを受信用に待機させ、1 つのラボだけに送信とこれに続けて受信を 1 回ずつ実行することによりに通信チェーンを開始させることです。別の方法として labSendReceive を使用することもできますが、一見しただけではパフォーマンスに大きな違いがあるように見えない可能性があります。

pctdemo_aux_profbadcommpctdemo_aux_profbadcomm および pctdemo_aux_profcommpctdemo_aux_profcomm のコードを表示して、このアルゴリズムの詳細な実装を参照できます。最初のファイルを確認し、通信に labSendlabReceive が使用されていることに注意してください。

よくある誤りとして、必要もなく labSendlabReceive の観点から考え始めることがあります。この pctdemo_aux_profbadcomm の実装がどのように機能しているかを見ると、求めるべき対象をよりよく把握できるようになります。

labSend 実装のプロファイル

P>> labBarrier;% to ensures the labs all start at the same time
P>> mpiprofile reset;
P>> mpiprofile on;
P>> pctdemo_aux_profbadcomm;
1    sending to 2
     receive from 12
2    receive from 1
     sending to 3
3    receive from 2
     sending to 4
4    receive from 3
     sending to 5
5    receive from 4
     sending to 6
6    receive from 5
     sending to 7
7    receive from 6
     sending to 8
8    receive from 7
     sending to 9
9    receive from 8
     sending to 10
10    receive from 9
     sending to 11
11    receive from 10
     sending to 12
12    receive from 11
     sending to 1
P>> mpiprofile viewer;
1    Sending  pmode lab2client  to the MATLAB client for asynchronous evaluation.

関数のサマリー レポートが表示されます。このページでは、通信での待機に費やされた時間が、[合計時間プロット] の見出し下にオレンジのバーとして表示されます。下図のデータでは、かなりの時間が待機に費やされたことが示されています。並列プロファイラーが、こうした待機の原因特定にどのように役立つかを見てみましょう。

クイックスタートの手順

  1. プロファイラーの関数のサマリー レポートで pctdemo_aux_profbadcommpctdemo_aux_profbadcomm エントリを見つけ、[比較 (合計時間の最長と最短)] をクリックします。関数 iRecFromPrevLab の項目で、オレンジの長い待ち時間が示されていることを確認します。これは、ネットワークの問題やアルゴリズムの問題のため、対応する送信において何かがおかしいことを兆候として示しています。

  2. 上部にあるツール バーの表で [Plot All Per Lab Communication] をクリックします。このビューの最初の図には、各ラボで受け取ったすべてのデータが表示されます。この例では、各ラボが先行するラボから同量のデータを受け取っており、問題点はデータ分散にはないように見えます。2 番目の図は、通信待機に費やされた時間を含む、さまざまな通信時間を表しています。3 番目の図で、[通信待機時間] プロットは待ち時間の段階的増加を示しています。12 ノードのクラスターを使用した [通信待機時間] プロットの例は、以下で参照できます。ソース ラボに戻り、そこで何が起こっているのかを確認することがよいでしょう。

  3. ラボ 1 で何が起こっているのかを参照します。a.) プロファイラーで [ホーム] をクリックします。b.) 最上位レベルの関数 pctdemo_aux_profbadcomm をクリックし、関数の詳細レポートに移動します。c.) [関数リストを表示] が選択されていることを確認します。d.) 下にスクロールして、ラボ 1 がどこで時間を費やし、どの行が対象となっているかを確認します。e.) 比較するために、時間のかかる行の表を参照し、[ワーカーに移動] リストボックスを使用して最後のラボを選択します。

コードのプロファイルされた行をすべて確認するには、ページ最後のアイテムまで下にスクロールします。この注釈の付いたコード リスティングの例は、以下に提示されています。

より大きなローカルでないクラスターを使用した通信プロット

labSendlabReceive の使用に伴う問題を明確にするため、次に示す 12 ノードのクラスターからの [通信待機時間] プロットを確認します。

上のプロットでは、[ワーカー間通信ごとのすべてをプロット] を使用して不要な待機を確認できます。この待ち時間が増加するのは、labReceive が、対となっている labSend の完了までブロックされるためです。したがって、後続のラボはすぐ隣の labindex から出力するデータのみを必要としているにもかかわらず、通信は順次行われることになります。

このアルゴリズムを実装するための labSendReceive の使用

labSendReceive を使用して、データ送信と依存対象のラボからのデータ受信を同時に行い、待ち時間を最小にすることができます。pctdemo_aux_profcomm に実装されている通信方式の修正バージョンでこのことを確認します。明らかに、送信前にデータを受信する必要がある場合、labSendReceive は使用できません。こうした場合は、labSendlabReceive を使用して時系列を確保します。しかし、この例のように送信前にデータを受信する必要がない場合は、labSendReceive を使用します。前のバージョンで集めたデータをリセットせずに、このバージョンをプロファイルしましょう (mpiprofile resume を使用)。

P>> labBarrier;
P>> mpiprofile resume;
P>> pctdemo_aux_profcomm;
1    sending to 2 receiving from 12
2    sending to 3 receiving from 1
3    sending to 4 receiving from 2
4    sending to 5 receiving from 3
5    sending to 6 receiving from 4
6    sending to 7 receiving from 5
7    sending to 8 receiving from 6
8    sending to 9 receiving from 7
9    sending to 10 receiving from 8
10    sending to 11 receiving from 9
11    sending to 12 receiving from 10
12    sending to 1 receiving from 11
P>> mpiprofile viewer;
1    Sending  pmode lab2client  to the MATLAB client for asynchronous evaluation.

この修正バージョンでは、待ち時間が実質的にゼロに減ります。これを確認するには、pctdemo_aux_profcomm を選択した "後に" [ワーカー間通信ごとのすべてをプロット] をクリックします。labSendReceive を使用すると、上で説明した同じ通信方式で待ち時間がほとんどなくなります (下に示す [通信待機時間] プロットを参照)。

プロットの配色

それぞれの 2 次元イメージ プロットにおいて、配色はその場のタスクに合わせて正規化されます。したがって、上記プロットの配色を他のプロットとの比較には使用しないでください。色は正規化されており、最大値 (右上に茶色で表示) によって左右されるからです。この例では、pctdemo_aux_profbadcomm ではなく pctdemo_aux_profcomm を使用する場合は、待ち時間の大きな差異を比較するために最大値を使用することが最もよい方法です。