複数GPUのスケーリング

複数GPUを使用して性能を上げる場合、GPU数に比例してサイズの大きな問題を同じ処理時間で解くWeak Scalingというやり方がある。

  • DGX-2

    Weak Scalingは各GPUが受け持つ仕事はGPU数によらず一定で、GPU数が増えると大きな問題が同じ時間で解けるようにする

理想的なWeak Scalingではノード数(例えばGPU数)が変わっても処理時間は変わらない。

  • DGX-2

    Weak Scalingでは各ノードが受け持つ仕事は一定で、理想的には処理時間はノード数にかかわらず一定である

これに対して、問題のサイズは一定で、ノード数が増えると各ノードの処理量が減少するStrong Scalingというやり方がある。

  • DGX-2

    Strong Scalingではノード数に逆比例して、各ノードが受け持つ仕事が減る

理想的なStrong Scalingではノード数の逆数で解を得るまでの時間が短くなっていく。

  • DGX-2

    理想的なStrong Scalingではノード数に逆比例して解を得るまでの時間が短くなる

MERGESORTの例

一例として、MERGESORTでは、前半はリスト全体を半分、半分というように次々に分割して行き、1要素になるまで分割する。そして、後半では、分割された2つのサブリストから1つの要素を取り出し、大小関係が正しくなるように併合する。これを繰り返して順に要素を大きくして行き、最後には値の大小の順が揃った1つのリストにする。

  • DGX-2

    MERGESORTでは、リストを2分し、それを繰り返して1要素まで分解する。そして整列させながら2要素、4要素、8要素とサブリストの長さを倍増させて行き、1つの整列したリストを作る

リストAとリストBは内部では正しい順序になっているとする。そして、AとBのリストを纏めて1つの正しい順序のリストを作る場合を考える。この時、AとBのリストの要素を順番に見て正しい順序になるように選んでいくのが一番分かりやすいが、これでは並列処理ができない。

ここで取り上げる方法は、リストAの全要素についてA[i]<B[j]となる最小のjを求め、A[i]を結果のリストDのD[i+j]に格納するというやり方である。このやり方であれば、リストAのすべての要素でそれぞれに対応するjのサーチを並列に実行することができる。

なお、最小のjを見つけるにはバイナリサーチを必要とする。

  • DGX-2

    並列MERGESORTでは、Aのリストの全要素のリストDでの格納場所を並列に求める。これにより、GPUの多数スレッドでの並列処理ができるようになる

この図で並んでいる青い箱には、MERGEするリストAとリストBの要素が交互に入っている。そして、マージの最初のステップではAとBの1要素を2要素のリストにマージする。そのためにライトバッファへの書き込み場所を前述のアルゴリズムにしたがって計算する。そして、書き込みを行い、並列に動作しているカーネルを同期する。

そして、書き込んだバッファを次回の入力にして、不要になった入力バッファを次回の書き込みバッファにする。

  • DGX-2

    1回目は1要素同士を整列して、長さ2の整列されたリストを作る。そして、出力バッファを次回の入力バッファにし、使い終わった入力バッファを次回の出力バッファにする

2段目は2要素のリスト同士をソートして4要素にする。そして、3段目は4要素のリスト同士をソートして8要素にという風にして、最終的には1つのリストを作り上げる。

  • DGX-2
  • DGX-2
  • このプロセスを繰り返し、次々に整列されたサブリストのサイズを倍増させて行く

このMERGESORTでは2MBのGPUのページを使い、スレッドやデータのアライメントには特に気を使わなかった。しかし、1台のGPUには80SMあり、それぞれのSMで1024スレッドを動かしているので、16GPUでは1回のReadで10,485,760バイトを読んでおり、全体としてはほとんどメモリアクセス量の偏りは出ない。

  • DGX-2

    特にスレッドやデータのアライメントには気を使っていないが、スレッド数も多いので、大きな偏りはでない

次の図は、4個、8個、12個、16個のV100 GPUを使ってMERGESORTを行った場合の実際に達成できたメモリバンド幅を示すグラフである。横軸は、何個の要素のリストのソートを行ったかである。

16個のGPUを使った場合、最大で6TB/sを若干超える性能でメモリの読み書きが行なえている。

  • DGX-2

    MERGESORTで実際に使用されたメモリバンド幅。4本の折れ線は、上から順に16GPU、12GPU、8GPU、4GPUのケースである。16GPUでは最大では6.0TB/sを少し上回るバンド幅が使われている

次の図は8Billion要素のソートを4~16GPUで行ったStrong Scalingの図である。3本の折れ線グラフは、一番上が効率、2番目のオレンジの線が実際の処理時間(秒)、一番下の青線が理想的なストロングスケーリングの処理時間である。この80%というスケーリング効率は非常に高いものである。

  • DGX-2

    3本のグラフは、上からStrong Scalingの効率、実際の処理時間、理想的なスケーリングの処理時間である。80%の効率は非常に高いものである

(次回は4月22日に掲載します)