インテル® MKL 11.3 ユーザーズガイド

ヘテロジニアスな Intel® Optimized MP LINPACK Benchmark

Intel® Optimized MP LINPACK Benchmark は、ノード間ヘテロジニアスとノード内ヘテロジニアスの両方をサポートしています。事前ビルドバイナリーのハイブリッド・オフロード・バージョンのみ、ノード・ツー・ノードのヘテロジニアスをサポートしています。

インテル® MKL は、ノード間で行列データを不均等に配置することによりヘテロジニアスをサポートしています。より速いノードで異なる数の MPI プロセスを実行する必要はありません。(複数の MPI プロセスを実行できる場合でも) ノードごとに 1 つの MPI プロセスを実行し、より強力なノードに多くの作業が割り当てられます。ヘテロジニアス係数を制御するコマンドライン・パラメーター f は、より強力なノードに割り当てる作業の量を指定します。

xhpl –n 100000 –b 1024 –p 8 –q 16 –f <ヘテロジニアス係数>

ヘテロジニアス係数は整数でなくてもかまいません。2.5 の場合、約 2.5 倍の作業がより強力なノードに配置されます。このヘテロジニアス係数は重要なチューニング・パラメーターです。より強力なノードに多くの作業を配置すると、ほかのノードで多くのメモリーが未使用になることがあります。インテル® MKL は、作業を不均等に配置することにより負荷のバランスをとります。速度優先またはメモリー優先で負荷のバランスをとることができます。クラスターに多くの異なる種類のノードが含まれる場合、複数のヘテロジニアス係数を使用します。

例えば、クラスターの各ノードのメモリーが 32GB で、一部のノードが 2 倍速い場合、それらのノードに 2 倍の作業を配置します。2 倍の作業を配置しなかったノードは 16GB メモリーのノードとして扱われなければならず、メモリーの半分は未使用となります。ただし、メモリーが未使用になるのは、全体的なパフォーマンスが低い、小さな問題サイズの場合である点に注意してください。

PQ をプロセッサー・グリッド (PxQ) の行数と列数として、 ピボットのような縦方向の演算では操作は同期されるため、作業は各プロセッサー列内でホモジニアスでなければなりません。

2 つの異なる種類のノードがある場合、MPI を利用して最初により速いノードをすべて処理するには、HPL.dat の "PMAP process mapping" (9 行目) が 1 (列優先マッピング) に設定されていることを確認します。 プロセス列内ではすべてのノードが同じでなければならないため、より速いノードの数は常に P の倍数になります。c コマンドライン・パラメーターでより速いノードにプロセス列の数 C を設定することで、より速いノードを指定することができます。

xhpl –n 100000 –b 1024 –p 8 –q 16 –f <ヘテロジニアス係数> -c <より速いプロセッサー列の数>

f および c コマンドライン・パラメーターを同時に指定します。 -f 1.0 –c 0 を設定すると、デフォルトのホモジニアス動作に戻ります。

ヘテロジニアス実行の問題サイズ N の選択方法を理解するには、最初にホモジニアス・システムを考えて、N を次のように選択します。

N ~= sqrt(メモリー使用量 * P * Q * メモリーサイズ (GB) / 8)

メモリー使用量は、ホモジニアスなインテル® Xeon® プロセッサー・システムでは通常、約 0.8 です。インテル® Xeon Phi™ コプロセッサーが含まれる場合、通信にバッファーが必要になるため、メモリー使用量は約 0.7 になります。

ヘテロジニアス・システムでは、同じノードの各「クラスター」の N に異なる式を適用して、最小の N を使用することもできます。 1 つのホモジニアス係数 F で、そのホモジニアス係数のグループのプロセッサー列の数 (Q の合計) が C と等しいクラスターを仮定すると、 このグループには P*C ノード含まれます。 最初に、S =F*P*C + P*(Q-C) を計算します。 ホモジニアス・システムでは、S=P*QF=1、C=Q になります。 つまり、N は次のようになります。

N ~= sqrt(メモリー使用量 * P * Q * ((F*P*C)/S) * メモリーサイズ (GB) / 8)

あるいは、sqrt(F*P*C/S) にしてホモジニアス・システムの N の値を小さくします。

クラスターに 100 のノードがあり、各ノードのメモリーが 64GB で、20 ノードがほかの 80 ノードよりも 2.7 倍速いとします。ノードごとに 1 つの MPI プロセスを実行します (全部で 100 プロセス)。 正方形のプロセッサー・グリッド P=Q=10 を仮定して、より速いノードを均等に分割します。 通常、HPL ドキュメントではメモリーの 80% を利用する行列サイズを選択することを推奨しています。N が行列サイズの場合、行列は 8N^2/(P*Q) のメモリーを使います。 ホモジニアス実行は次のようになります。

xhpl –n 820000 –b 256 –p 10 –q 10

Netlib の HPL は、この問題を最も遅いノードと同じ速度で実行したため、より速いノードから得られるパフォーマンス向上の可能性が失われていました。しかし、行列を再配置してヘテロジニアスな Intel® Optimized MP LINPACK Benchmark を実行すれば、より速いノードを活用することができます。一部のノードにはほかのノードの 2.7 倍のデータが含まれるため、(より速いノードのメモリーが 2.7 倍にならないのであれば) 問題サイズを小さくする必要があります。合計メモリーサイズは、0.8*64GB*100 ではなく、0.8*64GB*20 + 0.8*64GB/2.7*80 (元のサイズの半分未満) になります。したがって、問題サイズは 526000 になります。インテル® Xeon Phi™ コプロセッサー (ノード内ヘテロジニアス) が存在し、より速いノードがさらに高速な場合は、より大きなブロックサイズを選択する必要があります (スケーラビリティーは低くなります)。P=10 で 20 のより速いノードがあるため、2 つのプロセッサー列がより高速になります。 最初にこれらのノードにアプリケーションを送るように MPI を設定するには、コマンドラインで次のように指定します。

xhpl –n 526000 –b 1024 –p 10 –q 10 –f 2.7 –c 2

m パラメーターはすべてのノードが同じ量のデータであると仮定して問題サイズを計算するため、ヘテロジニアス計算では注意が必要です。

警告

より速いノードの数は C*P になります。 より速いノードの数が P で割り切れない場合、より速いノードに多くの作業を割り当ててパフォーマンスを向上させることはできません。

1 つのヘテロジニアス係数のみ必要な場合、f および c コマンドライン・パラメーターを指定するだけで十分ですが、複数のヘテロジニアス係数をサポートするには、この後の説明のように HPL.dat に行を追加する必要があります。

例えば、クラスターに 3 つの異なる種類のノードがあり、少なくとも 2 つのヘテロジニアス係数が必要な場合:

  1. これらの行を HPL.dat の最後に追加します。

    1	      number of heterogeneous factors
    0 3 2.7   [start_column, stop_column, heterogeneous factor for that range]
    

    プロセッサー列の番号は 0 から始まります。開始および停止番号は 0 から Q-1 (包括的) の範囲です。

    1 つのヘテロジニアス係数のみ必要な場合、コマンドライン・パラメーターを指定する代わりに、このステップを実行することもできます。

  2. 2 つのヘテロジニアス係数が必要な場合、上記の最初の列の数を 1 から 2 に変更し、開始列、停止列、ヘテロジニアス係数を指定した 2 行を追加します。

HPL.dat にヘテロジニアス・サポートのパラメーターを指定する場合、最も強力なノードに注目します。 しかし、ヘテロジニアス係数を大きくして、パフォーマンスの観点からクラスターのバランスをとると、メモリーの観点からはバランスが悪くなることがあります。パフォーマンスのバランスを優先するとメモリーに大きな影響を与える場合もあります。その場合、より速いノードに対する (ブロックサイズなどの) 値を減らしてください。間違った値を設定するとパフォーマンスが大幅に低下する可能性があるため、HPL.dat の値を変更するときは十分に注意してください。

ヘテロジニアス・クラスターをチューニングする場合、すぐにヘテロジニアス実行を行うのではなく、次の操作を行ってください。

  1. クラスターを複数のホモジニアス・クラスターに分割します。

  2. パフォーマンスのバランスがとれるようにヘテロジニアスを調整します。例えば、2 つの異なるセットのノードがあり、一方がほかのノードの 3 倍強力である場合、その強力なノードで 3 倍の作業を行います。

  3. 各部分で実行できる (ノードあたりの) 問題サイズを決定します。

  4. ノードあたりこれらの問題サイズで、そしてヘテロジニアス実行に必要なブロックサイズでホモジニアス実行を行い、最適なパラメーターを調べます。

  5. これらのパラメーターを最初のホモジニアス実行に使用します。