Tesla

KEPLERのHYPER-Qでレガシーな MPI コードをパワーアップ

 
 

ピーター・メスマー(2012 年 8 月 23 日)

NVIDIA は、この 5 月に開催された GPU Technology Conference にて、Kepler アーキテクチャーを採用した NVIDIA Tesla K20 GPU を発表しましたが、その際、この GPU は HPC 業界において史上最高の性能を持つプロセッサーになるだろうとお話ししました。

その後、実際の科学の分野のアプリケーションでテストしてみた結果、そのパフォーマンスは、我々の期待をも大きく上回るものになりそうであることがわかりました。

特に優れた点は、Kepler で新しく採用された Hyper-Q 機能です。世の中にはレガシーな MPI アプリケーションがたくさんありますが、この機能を使うと、コードを大幅に書き換えることなく、そのパフォーマンスを高められるのです。

ここでは、GPU で取り扱いにくいとされていた CP2K というコードを実例として、Hyper-Q の力をご紹介しましょう。CP2K は、広く利用されている MPI ベースの分子シミュレーションコードです。Hyper-Q を使用すると、CP2K アプリケーションにおける GPU の利用率が大幅に高まり、そのパフォーマンスは Hyper-Q なしの場合に比べて倍以上になりました。

Hyper-Q の仕組み

NVIDIA の GPU には大量の CUDA コアがあり、それが複数のストリーミング・マルチプロセッサーという形にグループ化されて並列に働きます。このマルチプロセッサーに作業を割り振るのが、CWD (CUDA Work Distributor) というハードウェア・ユニットです。

いままでの Fermi アーキテクチャーでは、ホスト CPU から CWD への接続が1本しかなく、複数の MPI プロセスをひとつのキューにまとめて作業がおこなわれる形になっていました。このようにシリアル化をおこなうと MPI プロセスの作業間に不必要な依存性が生じ、GPU 上で並列に実行できる作業の量が制限されてしまいます。この結果、GPU の利用率が低くなってしまうわけです。

Hyper-Q はこのような制限を取り払うことができます。です。次の図に示すように、Kepler ベースの新しい Tesla K20 GPU では、ホストと GPU のあいだに作業キューが 32 も用意されており、GPU 上で複数の MPI プロセスを並列実行することができます。MPI プロセスごとに異なるハードウェア作業キューが割り当てられるので、GPU の利用率は高くなり、総体的なパフォーマンスも上がるのです。

Hyper-Q を使用すると GPU 上で実行される MPI プロセスの数が増え、 GPU の利用率も総体的なパフォーマンスも高くなります。

レガシーな MPI コードに関する開発労力の低減

このパフォーマンス向上だけでも MPI デベロッパーなら大喜びすることですが、Hyper-Q の場合、さらに、レガシーな MPI コードを GPU へ簡単にポーティングできるというメリットもあります。

レガシーな MPI を使ったコードは、もともと、マルチコア CPU システムで実行するために作られたものが多く、複数個のコアをもつ CPU に適した作業量が各 MPI プロセスに割り振られるようになっています。言い換えると、このような MPI プロセスからでは、多くの場合、GPU のもつ多数のコアをフルに利用できるだけの作業量が生成されないことになります。GPU をフル活用できるだけの作業が生成されるようにするためには、通常、デベロッパーがコードを大幅に書き換える必要があります。

Hyper-Q なら、そのような負担を大幅に軽減できます。作業負荷が少ない MPI プロセスや中程度の MPI プロセスをいくつも、共有するひとつの GPU に同時に渡せるからです。つまり、ひとつの MPI プロセスで十分な作業量が発生するようにコードを書き換える必要はなく、作業負荷が異なる最大 32 の MPI プロセスを、GPU に送り込み、計算量の多い大変な作業はすべてGPU に任せるだけでパフォーマンスを最大化できるわけです。

実例:CP2K

CP2K は原子・分子のシミュレーション・コードで、世界各地のスーパーコンピューティング・サイトで幅広く利用されています。通常は MPI や OpenMP によって並列化されていますが、GPU が利用されるケースでは CUDA による並列化も行われています。

Fermi ベースの GPU では、MPI プロセスに割り当てられた作業量が少ない場合には、充分なパフォーマンスの向上が得られないケースもありました。特に、ストロング・スケーリングのシミュレーションの場合にそのようなことがありました。CPU の利用率が高いにもかかわらず、全体のシミュレーションの中のほとんどの部分で GPU が活用されていないという状況がありました。

次の図に示すベンチマークの結果を見ると、Hyper-Q の威力がおわかりいただけるでしょう。

ここで利用したデータ・セットは 864 個の水分子からなる小規模小さなもので、GPU が不得意とするタイプです。Hyper-Q を利用しないと、GPU 上ではの 1 ノードあたりひとつの MPI プロセスしか走らせることができず、ノード数を 1 から 16 へと増やしていっても、CPU のみのシミュレーションに対して大幅な性能の向上は認められません。

ここで Hyper-Q を利用すると、CPU のみの場合と同じ数の MPI プロセスを各ノードで走らせられるようになります。つまり、この図の場合、GPU 1 個あたり 16 の MPI プロセスが走るようになります。この結果、GPU のメリットを最大限に活用できるようになり、Hyper-Q をオンにすると 2.5 倍ものスピードアップが実現されるわけです。

Hyper-Q 最大の利点は、コードを変更しなくてもいいという点です。Tesla K20 GPU と CUDA 5 をインストールし、複数 MPI ランクが GPU を共有するように環境変数の設定を変更する……これだけで Hyper-Q が使えるのです。

いますぐ準備を始めましょう

Tesla K20 は、Hyper-Q が利用できる初めての GPU となります。製品の発売は年内という予定ですが、導入の準備はいますぐにでも始めることができます。

最初に、OpenACC を使ってコードの高速化をおこないましょう。OpenACC では、デベロッパーがディレクティブを用いてコンパイラ・ヒントをコードに挿入すれば、あとはコンパイラが自動的に、コードのコンピュート・インテンシブな部分を GPU にマッピングしてくれます。MPI プロセスでディレクティブを使えば、GPU がなるべく多く利用されるように Hyper-Q が処理してくれるので、OpenACC コンパイラからどれだけの作業負荷が生成されるのかを気にかける考える必要はありません。OpenACC コンパイラについては、NVIDIA ウェブサイトで 30 日間の無料ライセンスを提供しています。