Main Content

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

負荷が不均衡な対話型分散配列のプロファイル

この例では、不均衡な分散配列を使用する際に発生する暗黙的な通信をプロファイルする方法を示します。並列プロファイルを始めるには、並列コードのプロファイルを参照してください。

この例では、不均衡な分散配列において並列プロファイラーを使用する方法を示します。対話型分散配列を作成する最も簡単な方法は、rand(N, codistributor) のように、codistributor を引数として渡すことです。これにより、サイズ N の行列が MATLAB® ワーカー間に均等に分散されます。不均衡なデータ分散を行うために、対話型分散配列のいくつかの列数を spmdIndex の関数として取得できます。

この例のデータ転送プロットは、12 のワーカーをもつローカル クラスターを使用して作成されています。他のすべては、4 つのワーカーをもつローカル クラスターでの実行内容が示されています。

アルゴリズム

この対話型分散配列用に選択されたアルゴリズムは、比較的単純です。最初のラボを除き、それぞれのラボにおよそ 512 行 512 列の部分行列が割り当てられるよう、大きな行列を生成します。最初のラボは部分行列の 1 つの列のみを受け取り、他の列は最後のラボに割り当てられます。したがって、4 つのラボからなるクラスターでは、ラボ 1 は 512 行 1 列の列だけを保持し、ラボ 2 とラボ 3 は割り当てられた分割を担当し、ラボ 4 は割り当てられた分割に追加列 (ラボ 1 の残り分) を加えたものを担当します。最終結果は、通信ゼロの要素単位の演算 (sin など) およびデータの並列演算を伴う通信遅延 (codistributed/mtimes など) を行うときの不均衡な作業負荷です。ここではまずデータの並列演算 (codistributed/mtimes) から開始します。次に、ループで sqrtsin および内積の演算を実行しますが、そのすべては行列の個々の要素のみに作用します。

この例の MATLAB ファイル コードは pctdemo_aux_profdistarray に含まれています。

この例での行列のサイズは、MATLAB ワーカーの数 (spmdSize) によって異なります。ただし、この例をどのクラスターで実行しても計算時間 (通信を含まない) はほぼ同じであるため、比較的大規模なクラスターを使用しても長時間待たされることはありません。

spmd
    spmdBarrier; % synchronize all the labs
    mpiprofile reset
    mpiprofile on
    pctdemo_aux_profdistarray();
end
Worker 1: 
  This lab has 1024 rows and 1 columns of a codistributed array
Worker 2: 
  This lab has 1024 rows and 256 columns of a codistributed array
Worker 3: 
  This lab has 1024 rows and 256 columns of a codistributed array
Worker 4: 
  This lab has 1024 rows and 511 columns of a codistributed array
Worker 1: 
  Calling mtimes on codistributed arrays
  Calling embarrassingly parallel math functions (i.e. no communication is required)
  on a codistributed array.
  Done
Worker 2: 
  Calling mtimes on codistributed arrays
  Calling embarrassingly parallel math functions (i.e. no communication is required)
  on a codistributed array.
  Done
Worker 3: 
  Calling mtimes on codistributed arrays
  Calling embarrassingly parallel math functions (i.e. no communication is required)
  on a codistributed array.
  Done
Worker 4: 
  Calling mtimes on codistributed arrays
  Calling embarrassingly parallel math functions (i.e. no communication is required)
  on a codistributed array.
  Done
mpiprofile viewer

まず [並列プロファイル概要] を参照し、[合計時間] 列をクリックして、実行時間によって並べ替えられていることを確認します。次に、関数 pctdemo_aux_profdistarray のリンクをたどって関数の詳細レポートを参照します。

関数の詳細レポートの時間のかかる行の表

MATLAB 関数エントリごとに独自の [時間のかかる行] の表があり、複数のプログラムや例を同時にプロファイルする場合に便利です。

  • 関数の詳細レポートで、実行済みの MATLAB コードの通信情報を行ごとに確認します。

  • プロファイル情報を比較するには、アプリのツールストリップの [ビュー] セクションで [時間のかかる行] ボタンをクリックします。ツールストリップの [比較] セクションで [最長と最短合計時間] ボタンをクリックし、[ワーカーに移動] および [比較] メニューで比較するワーカーの数を選択します。[時間のかかる行] の表を調べ、どの行番号に最も時間がかかったかを確認します。このコードには for ループがなく、複雑度の増加もありません。しかしそれでも、ラボ間には計算負荷の大きな違いがあります。35 行目を見ると、コード sqrt( sin( D .* D ) ); があります。

この要素単位の演算に通信は不要ですが、一部のラボが他のラボよりも多くの作業を行っているため、パフォーマンスは最適ではありません。2 番目の行 (D*D*D) では、要した合計時間が両方のラボで同じです。しかし、[受信データ] 列と [送信データ] 列には、送信データと受信データの量における大きな違いが示されています。この mtimes 演算に要した時間はすべてのラボで同程度の値になっていますが、これは、対話型分散配列の通信によりラボ間の通信が暗黙的に同期されるためです。

[時間のかかる行] の表の最終列には、選択したフィールドのパーセンテージが棒グラフで示されます。また、これらの棒グラフはメイン ラボと比較対象ラボの [合計時間] や、[送信データ] または [受信データ] を視覚的に比較するためにも使用できます。

プロットを使用して対話型分散配列演算を観察

対話型分散配列演算についてより具体的な情報を得るには、関数の詳細レポートで該当する関数名をクリックします。

ラボ間の通信データを得るには、ツールストリップの [プロット] セクションで [ヒートマップ] をクリックします。最初の図で、ラボ 1 が最大量のデータを転送し、最後のラボ (ラボ 12) が最小量のデータを転送していることがわかります。

ヒートマップを使用して、各ラボ間で交換されたデータの量を確認することもできます。この量は、最初と最後のラボを除き、すべてのラボで一定です。明示的な通信がない場合、これは分散に問題があることを示しています。通常の対話型分散配列の mtimes 演算では、データ量の最も少ないラボ (たとえば、ラボ 1) が、隣接するラボ (たとえば、ラボ 2) から必要なデータをすべて受け取ります。

転送データ プロット

転送データ プロットでは、最後のラボに転送されるデータ量が大幅に減少し、最初のラボに転送される量が増加しています。通信時間プロット (表示なし) を調べると、最初のラボではさらに別の事態が進行していることがわかります。すなわち、最初のラボでは通信に最大の時間が費やされています。

このように、行列の不均等な分散は、データ並列の対話型分散配列演算や、(通信なしの) タスク並列演算による不均等な負荷分散を使用する際に不必要な通信遅延の原因となります。また、より多くのデータを受信するラボ (この例の最初のラボなど) は、対話型分散配列演算の前に最小量のデータで開始します。