GP100のSM
GP100のStreaming Multiprocessor(SM)の命令発行機構は、2つのワープスケジューラを持ち、それぞれのワープスケジューラに2つのディスパッチユニットが付いている。それぞれのワープの連続した命令の間に依存関係がなく、2命令を同時に実行できる場合は、2つのディスパッチユニットはそれぞれのワープの連続した2命令を同時にディスパッチする。これはKeplerやMaxwellと同じである。
レジスタファイルは256KBで、これはKeplerやMaxwellと同じであるが、KeplerではSMに含まれるCUDAコアが192個、Maxwellでは128個であったのに対して、Pascalでは64個になっている。つまり、1個のCUDAコアが使えるレジスタのエントリ数はKeplerの3倍、Maxwellの2倍になっていることになる。また、シェアードメモリも、MaxwellではSMあたり96KBに対して、Pascalでは64KBであり、CUDAコアあたりで見れば4/3倍に増加している。
このようにPascalのSMは、命令をスケジュールするワープスケジューラが強化され、レジスタファイルやシェアードメモリといった演算ユニットから一番近いデータ記憶が強化されており、これらのユニットが不足で命令を実行できないというケースを減少させて性能を改善していると考えられる。
また、演算器では、Keplerでは単精度の浮動小数点演算を行うコアはSMあたり192個に対して、倍精度浮動小数点演算を行うDPユニットは64個であり、倍精度演算は単精度演算の1/3の性能となっていた。これに対してPascalでは64個のコアに対して、32個のDPユニットを持っており、性能は2:1となっている。
もう1つ、演算器の改善で大きいのはFP16の半精度浮動小数点演算をサポートした点である。科学技術計算では高精度の64bit倍精度の演算を必要とする場合が多いが、ディープラーニングでは個々の数値にはそれほど高い精度は必要なく、16bitの半精度で計算して良いと言われている。また、入力ノイズが大きい信号の処理も数値の精度を上げても、ノイズを高精度で計算することになって、意味がないと言われる。
これらの用途では、演算を単精度から半精度に代えることにより、同じ量のメモリで2倍のデータを格納することができるし、1つのCUDAコアで2つの半精度演算を並列に実行できるので、同じ処理量ならば、計算時間は半分になる。Pascalでは、この半精度の浮動小数点演算がハードウェアで実行されるようになった。特に、この演算器はDenormal数もハードサポートしており、性能を犠牲にせずに数値のダイナミックレンジを広げた演算ができる。
広帯域HBM2の採用
GPUではフレームバッファやZ-バッファなどにデバイスメモリを使っており、画面の解像度が上がるにつれてデバイスメモリのアクセスデータ量が増えて行く。このため、GPUの進歩に伴って、より広帯域のメモリが使われてきた。
GDDR5メモリは32信号を持ち、4~8信号が一般的な通常のDRAMに比べて多くの信号線を使い、各信号の伝送速度も6Gbit/sと、通常のDRAMの3~4倍の速度で伝送することにより、高いメモリバンド幅を実現してきた。32信号で6Gbit/sでは、1個のGDDR5メモリチップで24GB/s、これを12個使用して、288GB/sのメモリバンド幅というのが典型的なGPUボードのメモリバンド幅であった。
しかし、GDDR5メモリのデータ伝送速度は、ある程度の改善の余地は残っているとしても、大幅な引き上げは困難である。そこで出てきたのが、4枚とか8枚のDRAMチップを重ねて、チップ間をTSV(Through Silicon Via)で接続して1024本の信号線を引き出して、数の力でメモリバンド幅を引き上げようという3次元実装という方式である。
初代のHBM1では各信号線の速度は最大1Gbit/sで、HBM1個で128GB/s。次世代のHBM2では信号線の速度を最大2Gbit/sとして、HBM2 1個で256GB/sという高バンド幅を実現する。ただし、このような接続は高密度で、配線長も短く限定されるので、TSMCのCoWoSのような微細な接続が必要となる。
この断面写真で、左の上側にあるのがHBM2で、4枚の薄いシリコンとその上の厚めのシリコンのブロックが載っているように見えている。一番下のシリコンは、ベースダイと呼ばれるチップで、GPUと接続する信号のドライバ/レシーバやDRAMのテスト回路などが集積されている。その上の3枚の薄いシリコンと一番上の厚いシリコンの下面が、DRAMチップである。下側の3枚はTSVの長さを短くするため、シリコンチップを薄く研磨して使うが、一番上のチップはその必要はないので、GPUと高さが揃うように研磨して厚みを合わせている。
エラー訂正のためにECCを付けるためには、64bitのデータに8bitのチェックデータを必要とするというやり方が一般的である。しかし、32bit幅のGDDR5メモリを使う場合、チェック用の8bitをどう捻出するかが問題となる。NVIDIAはFermiの時代からECCをサポートしているが、アドレス計算が複雑になるし、デバイスメモリの容量が8/9に減少し、アクセス時間が9/8に増加するという問題がある。
これに対して、ECCをサポートするHBM2メモリでは、メモリチップにチェック用のビットが組みこまれている。つまり、信号線は1024本ではなく、1152本になっているので、このようなオーバヘッドなしにECCを実装できる。P100 GPUでは、このECC付きのHBM2メモリを使い、チェックビットの生成やエラー訂正などの論理回路は、P100チップ側に内蔵するという構成になっている。