性能を向上しつつも省電力化が図られたKepler

2009年9月に発表されたFermiはTSMCの40nmプロセスで作られていたが、Keplerは同じTSMCではあるが28nmプロセスで作られている。この微細化により、トランジスタあたりの消費電力は減るが、同一面積のチップにはほぼ2倍のトランジスタを詰め込むことができるので、単純に同じ面積のチップを作ると消費電力は30~40%程度増えてしまう。

このため、NVIDIAはマイクロアーキテクチャや回路の工夫で省電力化を頑張っている。この結果、前世代のGF110の消費電力が244Wであったのに対して、ほぼ2倍の単精度浮動小数点演算性能を持つGK104では195Wと約20%消費電力を減らしている。

倍速クロックやめて省電力化を実現

従来のGPUでは演算能力を稼ぐために、コアを倍速のクロックで動かすということが行われてきた。しかし、倍速クロックで動かすためには、パイプラインを細かく刻み、パイプステージの間にレジスタ(図の中の四角の箱の下に△のついた部分)を入れる必要がある。

Keplerでは倍速クロックをやめて省電力化を行っている

倍速クロックをやめるとクロック周波数が半分になるので、同じ性能を出すには2倍の数の演算ロジックが必要になる。しかし、レジスタ分の面積が減るので、結果として演算ロジックのチップ面積としては1.8倍となる。そして、クロック周波数が半分なので消費電力は0.9倍と1割減少する。一方、クロック分配系は面積は同じであるが、半分の周波数なので、消費電力は0.5倍となる。Keplerチップのロジックとクロックの電力の比率は書かれていないが、クロックの電力は全体の20~30%になることも多く、全体としてはかなりの消費電力削減になっていると推測される。

データ依存チェックをコンパイラに分担させて省電力化

前の演算結果を使う命令は、前の演算が終わってからでないと実行を開始できない。Fermiではこの依存関係をハードウェアが監視し、必要なデータが揃うまで待って、命令を発行していた。これをKeplerでは、実行時間が一定の演算などの命令では、コンパイラが待ち時間の情報を命令に埋め込み、その情報を使って待ち時間が経過したかどうかで命令発行の可否を判断する構造としてハードウェアを簡素化している。一方、ロード命令のようにキャッシュのヒット/ミスなどで完了までの時間が変わるデータを使う命令に関しては、Fermiと同様にハードウェアによる依存管理を行っている。具体的にどれだけの改善になっているのかは不明であるが、これもハードウェアの削減と消費電力の削減に貢献していることは間違いない。

GK104からエンハンスされたGK110のSMX

計算エンジンであるSMXであるが、GK104とGK110のSMXは似ているが異なっている部分がある。

GK104のSMXの構成図

GK104のSMXの構成図にはPolyMorph Engine2.0と呼ぶ、3D描画の品質を上げる回路群があり、その下に命令キャッシュが描かれている。そして、4個のワープスケジューラがある。これらのワープスケジューラはそれぞれ2個の命令ディスパッチユニットを持っており、連続する2つの命令をコア群に対して発行する。

SMXの大部分を占める演算部分は、65,536エントリのレジスタファイルと合計192個のCoreと書かれた演算ユニット、データのロード、ストアを実行する32個のLDSTユニットと三角関数などの計算を行う32個のSFU(Special Function Unit)で構成されている。

そして、各SMXには、グラフィックスで使う壁紙を記憶するテクスチャキャッシュ、データを記憶するシェアードメモリとL1キャッシュ、壁紙の変形を行うテクスチャユニット(Texと書かれたブロック)が含まれている。

一方、今回発表されたGK110のSMXの構成は次のようになっており、GK104にあったPolyMorph Engine2.0が消えている。ただし、これは本当に存在しないのか、科学技術計算では使わないので描くことを省略したのかは定かではない。

GK110のSMXの構成図。DP Unitと書かれたオレンジ色の箱が合計64個見える

また、DP Unitと書かれたオレンジ色の箱が64個追加されている点がポイントである。このDP Unitが64ビット長の倍精度浮動小数点の積和演算器である。なお、32bit長の単精度浮動小数点演算を行うCoreに比べてDP Unitは大きく描かれており、面積が大きいことを示している。なお、GK104のSMXにもDP Unitが8個含まれている筈であるが、前の図では省略されている。

コンシューマ用のグラフィックス処理では64ビットの倍精度浮動小数点演算は不要である。このため、GF104では多くのトランジスタを必要とする倍精度のサポートはFermi GPUとの互換を維持するための最低限の性能に留めて、チップサイズを小さく、つまり、コストを下げている。

科学技術計算では計算精度の高い倍精度浮動小数点演算を使うものが多いが、イメージ処理や信号処理などの32ビット精度で足りるという分野もある。Tesla K10は精度は32ビットの単精度浮動小数点演算で足りるが、高いFlopsとメモリバンド幅が必要という分野向けの製品で、GK104チップを2個搭載している。GK104チップは、コンシューマ用のGTX 680に使用する場合は1006MHzのクロックであるが、K10では消費電力と動作安定度の観点からクロックを745MHzに落としているが、チップあたり2288GFlops、ボードでは4577GFlopsという高い単精度演算性能を実現している。また、ボードのメモリバンド幅も320GB/sと高い。

一方、Tesla K20は汎用科学技術計算用であり、倍精度浮動小数点演算性能の高いGK110を1チップ搭載している。