スパコンポエムAdC2020 Day8 Nov/2020 #12 PizDaint

山田です。

スパコンポエムアドベントカレンダー、八日目となりました。
@higucheeseさんの[昨日の記事](https://qiita.com/higucheese/items/76a9c36b9223da14571f) はご覧になられましたか？
実際にOakforest-PACSを使ってXeonPhi(KNL) でディープラーニングのコードを走らせておられた方の貴重な生の声は、なかなか聞く機会がないので非常に興味深くありますね！！
というか手で書いてピークの50%のSGEMMを書けるなんて…恐ろしい…着実に世代交代の足音を感じる…やばい…

さて、今回は(も？) ヨーロッパはスイスのスーパーコンピュータ、Nov/2020では#12のPizDaintのお話です。

# Day 8 PizDaint

<img src="https://www.cscs.ch/fileadmin/_processed_/c/3/csm_Piz_Daint_upgrade_26.04.2017_003_ec93735bd1.jpg">
(引用元: https://www.cscs.ch/computers/piz-daint/)

山！！！
PizDaintというのは、スイスアルプス山脈にある同名の山が由来なんだとか。我が国にも山が元ネタのスパコンありますしね。

<img src="https://upload.wikimedia.org/wikipedia/commons/8/8e/Daint.jpg">
(引用元: https://en.wikipedia.org/wiki/Piz_Daint)

# PizDaintとは？

Swiss National Supercomputing Centre (CSCS) に設置されたスーパーコンピュータです。
もともと上位にいたスパコンでしたが、2017年6月に大幅なアップデートを行い、その当時では最大規模のGPUスパコンとして(そしてヨーロッパ最大のスパコンとして) Top500は#3につけました。
この時のTop500 Awardingではヨーロッパ最速のスパコンみたいな地方での表彰とかが行われていて、同時猛威を振るっていたTaihuLightだけを表彰するのはいやだったからだろとか邪推していた記憶があります(悪意がある

PizDaintの公式サイトは[こちら](https://www.cscs.ch/computers/piz-daint/)
また、PizDaintのプレスリリースは[こちら](https://www.cscs.ch/publications/news/2017/piz-daint-one-of-the-most-powerful-supercomputers-in-the-world/)

## PizDaintのスペック

プレスリリースに全部書いてあるんであれですけど…

| Spec | HybridNode | MulticoreNode |
|----|----|----|
| CPU | Intel Xeon E5-2690 v3 | Intel Xeon E5-2695 v4 * 2|
| Memory Per Node | 64GB (+16GB HBM2) | 64/128GB |
| Accelerator | NVIDIA Tesla P100 | N/A |
| InterConnect |Cray Aries routing and communications ASIC, and Dragonfly network topology|左に同じ|
| Number of Nodes | 5704 | 1813 |
| Peak Performance | 	25.326 PFlops | 1.731 PFlops |

はい、ということで、今度は間違いなくHPLにGPUが使われているGPUスーパーコンピュータです。

PizDaintですが、オーソドックスなスパコンといえるわけですけれども、このシステムのすごいというかパワーのある所は、ノードに対してGPUが1枚というところです。なんか変か？と思うかもしれませんが、1CPUに対しては2～4枚のGPUをぶら下げるのが一般的です。PCIeのレーンもあいてますし、外部転送が削減できるので。あと、電力的に見ても、ホストCPUたるXeonとP100の消費電力が(TDPベースでは)135W : 300Wなので、Xeonには2枚ぐらいをぶら下げておいたほうがお得なわけです。
一方で、FLOPSでは0.44TFlops : 5.3TFlopsと10倍以上の開きがあるため、仮になんかXeon側で演算をオーバーラップさせようとした時点で、P100のが圧倒的に高速でXeonがボトルネックになる、なんてことにもなりかねません。また、PCIe x16でGPUを接続したとして、E5-2690v3にはPCIeが40レーンしかないので、2枚刺してx8しか外部転送幅がないので、FDRしか接続できません。仮に2枚接続したとして、10TFlopsに対して56Gbps = 7GB/sしか外部帯域がないというのは、ノード外に通信が発生した時点でそこがボトルネックになる可能性が出てきてしまいます。
そういう意味では、PizDaintの構成というのは、電力消費は多少増えても、実際のユーザーが持つ問題に対してSuitableなデザインが行われていると考えることもできます。コデザインというやつですね(？

そんな構成は、実際にベンチマークのスコアにも表れていて、HPLでのPizDaintの理論ピーク性能は27.15PFlops, 実効性能は21.23PFlopsとなっており、実効効率は78.2%となっています。同時期に投入された同様の構成のGPUスパコンたちの実効効率の比較が[マイナビのAndoさんの記事](https://news.mynavi.jp/article/20170623-green500_urayomi/) にありますが、DGX-1を使用したシステムが67.54%, TSUBAME3.0が62.29%であることを考えると、記事で指摘されている通り

> ピーク比率は77.35%とNVIDIAのDGX-1システムを10%も超えている。

(引用元: https://news.mynavi.jp/article/20170623-green500_urayomi/2)
(注釈: この記事は2017年当時のピーク性能をもとに書かれたものであり、PizDaintはそこからもう一段回アップグレードを経ているので若干数字が変わっています)

と、かなりの高効率を得ています。
これはなんでかというと、まぁちょっとばかり知ってたり知らなかったりするんですけどxxxxxのxxxxxってxxxxxなんで、xxxxxの負荷がxxxxxxにxxxxxでxxxxxだったりするんですよね。なんでxxxxxがxxxxxxはxxxxxってなるので、つまりxxxxxxとなって、PizDaintは非常に高効率になっているのではないかと考えられるのです。
(注釈: 大人の事情でまずそうなところはすべてxxxxxと置き換えました。なお文字数は実際に記載されていた単語とは対応していません)

さて、そんじゃ高性能で度肝を抜きに来たNVIDIA P100の話をしましょう。

## NVIDIA P100

NVIDIAがアーキテクチャに科学者の名前を冠するようになってから、~~Fermi, Kepler, Maxwell, Pascalと、4人目にして~~四人じゃないって…Fahrenheit -> Celsius -> Kelvin -> Rankine -> Curie -> Tesla -> Fermi -> Kepler -> Maxwell -> Pascalなので、10人目！！(そすうぽよさんありがとう！) 一つの頂点ともいえるアーキテクチャとなった、Pascalアーキテクチャの一品です。
NVIDIAはずっと[Whitepaper](https://images.nvidia.com/content/pdf/tesla/whitepaper/pascal-architecture-whitepaper.pdf) を出してくれていて本当にありがたいと頭が下がります。皆さんマジでこういうの大事なんでほんとお願いしますね(突き刺さるブーメラン

さて、Pascalアーキテクチャの変更点はというと、以下のような感じになっています。

* SMの構造の改善
	* 倍精度浮動小数点演算性能の強化
	* 半精度浮動小数点演算のサポート
* HBM2のサポート
* Unified Memory対応の強化
* NVLinkのサポート

### SMの構造の改善

これはKeplerアーキテクチャ -> Maxwellアーキテクチャへのジャンプアップが一番大きいですが…
[先日](https://qiita.com/telmin_orca/items/e440ee1385d6dc08bd72) のK40では、SMがSMXとかなり巨大な作りになっており、CUDA Coreも192個が内包されているという話をしました。
ちらほらと書いた通り、192CUDA Coreを埋めるのは結構つらかった、というのが実情でした。いろいろ足りなかったし…まぁそれでもただ乗せただけで速かったのと、圧倒的に消費電力下がっていたので良かったわけですが。
Pascalアーキテクチャでは、SM内部のCUDA Coreを~~32にしました。Fermiアーキテクチャへの原点回帰といってもいいかもしれません。~~(12/08修正 そすうぽよさんありがとう) 64にしました。(SMあたりのレジスタ数は変わらないので、Keplerアーキテクチャから見ると相対的にめっちゃ増えました(192:65536 -> 64:65536)。インフライトなスレッド数を増やせるようにした、つまりはSMのハードウェアリソースをちゃんと埋められるようにした、ということですね。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59762/479be2a8-b07f-efd1-b24e-dcd6e1de5f16.png">
(引用元: [Kepler whitepaper](https://www.nvidia.com/content/dam/en-zz/Solutions/Data-Center/tesla-product-literature/NVIDIA-Kepler-GK110-GK210-Architecture-Whitepaper.pdf))

と

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59762/d3bbf068-d78a-8a8a-2558-53c60b17def2.png">
(引用元: [GP100 Whitepaper](https://images.nvidia.com/content/pdf/tesla/whitepaper/pascal-architecture-whitepaper.pdf))

を並べると一目瞭然ですね。

#### 倍精度浮動小数点演算性能の強化

倍精度浮動小数点演算性能は、Keplerアーキテクチャ、K40を例にとると、単精度4.3TFlopsに対して、1.43TFlopsとなっており、約33%でした。Keplerアーキテクチャの場合は192個の単精度ユニットに対して64個の倍精度ユニットとなるので、この性能も当然なんですけれども……
それに対して、P100では、9.5TFlopsに対して4.7TFlopsとなっており、50%の性能となっています。これはSM内の単精度・倍精度ユニットの比率が50%であることを意味しており、つまり、Fermiアーキテクチャの比率に回帰したというわけですね。Fermiアーキテクチャがいかに優秀だったかということがうかがえます。誰だ爆熱って言ったやつ。

#### 半精度浮動小数点演算のサポート

Pascalアーキテクチャの前身となるMaxwellアーキテクチャのリリースと前後して、世の中ではディープラーニングのブームが到来していました。Maxwellアーキテクチャのローンチが2014年、Caffe(！！) のRCが2014年の春ぐらいでv0.9が夏とかなので、ちょうどそれぐらいの時期でしょう。cuDNNがリリースされたのも2015年ぐらい。以来、HPCとディープラーニングというのは密接にかかわりながら続いているというのは、昨日のひぐちーずさんの記事でも明らかです。そんなディープラーニングでは、倍精度を多用するHPCワークロードとは裏腹に、単精度、もっと言えば半精度でも十分というケースが見受けられるようになりました。
半精度浮動小数点であれば動作する回路も少なくて済むわけで、発熱も少なくなるしいいことずくめ。今まではデータのやり取りで単精度から半分になるぐらいの使われ方しかしていなかったIEEE754の半精度浮動小数点数(語弊がある表現) が演算にも使われるようになったのです。

### HBM2のサポート

これはですね、大変な驚きを以って迎えられました。
もともと、ロードマップでこの世代ぐらいまでにメモリ帯域を何とか伸ばしたい、というのはGTC等で触れられていたのですが、いよいよ来たか、と。HBM自体は初代HBMがAMDのFuryシリーズで投入されており、しかしこれがGDDR5から少しばかり速くなっていただけであり、GDDR5Xでよくね？(ただGDDR5Xはアクセス粒度が高くてマイニングではあんまり好まれなかったけど…) という論調もあり、HBMそんなよくないかなーといわれていたところで一気にバーンと帯域を伸ばし、720GB/sという数字を叩き出してきて、HBM2の普及の牽引となりました。
まぁ一方で、Flopsの上り幅もメモリ帯域の上り幅よりも大きかったので、B/Fとしてはさらに低下していくことになるわけで、その辺、メモリの速度向上よりもFlopsの向上のが大きいんだよな…という気持ちにならざるを得ませんね。

### Unified Memory対応の強化

GPUのメモリって、多くても20GBぐらいで、そもそもそこに問題が乗りきらない場合、GPUは選択肢に入ることはなかったんですよね。GPUのメモリ量の小ささが、適用できる問題の幅を狭めてしまっていたといってもいいわけです。
なので、PascalアーキテクチャからはUnified Memoryと呼ばれる機構を強化して、ホスト側のメモリ空間すべてをGPU側にマップできるようにしました。
PascalアーキテクチャまでのUnified Memoryは非常に限定的で、真のUnified memoryではなかった(CUDAの提供するAPIで確保したメモリしかUnifiedにできなかった) んですが、Pascalアーキテクチャからは、確保したメモリすべてがUnifiedになりました。これで(理論上は) なんでも動くようになったわけですね。
ただ、注意が必要なのは、GPUのメモリに乗っていないものにアクセスすると、当然のことながら転送が発生するため、その時点でめっちゃ速度低下が発生するということです。それは当然ですね。

### NVLinkのサポート

これはかなり大きい。
ホスト-デバイス間にしろ、デバイス-デバイス間というのは、PCIeで接続します。当時はPCIe Gen3が主流で、x16で接続しても双方向32GB/sが限度でした。これよりも高速なバスを引きたい！という気持ちで実装された(？) のがNVLinkです。
P100で実装されたNVLinkはNVLink 1.0ですが、レーンあたりで2.5GB/sの転送速度を持ちます。これが64レーンあるので、片方向80GB/s、双方向で160GB/sの転送速度となっていたわけですね。
これはx86との組み合わせだとデバイス-デバイス間の接続でしか使えませんでしたが、POWER8のような、CPU内部バスに直結できるCPUとの組み合わせだと、ホスト-デバイス間の圧倒的な転送速度を発揮しました。いやなんとも素晴らしいですね。
また、このNVLinkを活かすために、NVIDIAはSXMと呼ばれるコネクタを採用したカードを作り始めます。これはPCIe規格にとらわれないことでさまざまな試みが可能となります。Pascal世代ではそれはあまり表には出ないのですが、この次世代、Volta世代でいくつかの機構が花開いていくこととなります。

## P100の感想

色々と思い出深いGPUです。
ローンチ直後、国内に全然出回っていない中、無理行って入手してもらったり…走らせてみたらあまりのメモリ帯域に腰が抜けそうになったり…(なんせKNLよりもめっちゃ速かったし…)、DGEMMもちゃんと効率出たり…PassiveタイプのカードにDIYしてファンを取り付けて冷えねえとかファンうるせえとかやってみたり…僅差で負けてみたり…いやこの話はよくない…

Maxwellアーキテクチャの時代でめっちゃ足回りが強化されたのですが、Pascalアーキテクチャでさらにそれが洗練されて、もう何しても速いっていう時代に突入しました。実効性能を上げるのもKeplerアーキテクチャより楽で、「突き詰めれば速い」から、「容易に速い」へ変化したな、という感じでした。
正直、このP100が、NVIDIAのGPUの一つの到達点だといえるレベルで好きです。

# まとめ
* スイスのスーパーコンピュータ、PizDaintについて述べました。
* NVIDIA P100について述べました。いやこれほんと素晴らしかったです。
* 明日はきっと引き続きGPUの話をするつもりです。GPUのはなしたのしい。