NVIDIAの「GK110(Kepler)」GPUを使う「Tesla K20/K20x」と「GeForce Titan」は、現状では最強の科学技術計算能力を誇っており、K20xは2012年11月のTop500で1位を獲得したオークリッジ国立研究所のTitanスパコンにも採用されている。
GPUは高い浮動小数点演算能力を持っているが、単に、浮動小数点演算器の数を増やして従来のCPUを相似形で拡大したものではなく、かなり異なった作り(アーキテクチャ)となっている。そのため、GPUの高い演算能力を引き出すためには、CPUのプログラムとは異なる注意が必要である。そこで、Kepler GPUを例にとり、そのアーキテクチャとCUDAプログラムの最適化のポイントを見ていきたいと思う。なお、この連載は、GTC 2013でのPaulius Micikevicius氏の発表を中心とし、Julien Demouth氏の発表の内容を追加したものをベースに、筆者がアレンジしたものである。
ちなみに、本連載の図の出典は、
- NVIDIA Kepler GK110 Whitpaper
- GTC 2013 Performance Optimization by Paulius Micikevicius
- GTC 2013 Shuffle: Tips and Tricks by Julien Demouth
であり、それぞれの出典番号を図に付けている。
NVIDIAのGK110チップのブロックダイヤグラムは次の図のようになっている。
中央部に描かれた小さい長方形が集まったグループをNVIDIAはSM(Streaming Multiprocessor)と呼んでいる。なお、KeplerではSMに含まれる演算コアの数が前の世代のFermiから大幅に増加しており、区別する意味でSMXとも呼ばれているが、ベースとしたGTC 2013での発表ではSMと書かれているので、ここではSMを採用する。
この図に見られるように、GK110チップには15個のSMが搭載されているが、Tesla K20xとGeForce Titanでは、その内の1個はスペアで、14個が演算に使用できる。また、Tesla K20は2個がスペアで13個が演算に使用できるという仕様になっている。
そして、15個のSMの間にL2キャッシュ、左右の辺に合計6個のメモリコントローラ、上辺にCPUと接続するPCI Express 3.0インタフェースとスレッド実行の割り振りを行うGigaThread Engineが描かれている。
ただし、この図は物理的な構造とは対応しておらず、GK110チップ写真は次の図のようになっている。
この図で白枠の箱にSMと書かれた部分が1個のSMで、縦に3個が積まれた領域が合計5個あり、全体で15SMとなっている。そして、上段中央の領域に、PCI Expressインタフェース、L2キャッシュ、GigaThread Engineが収容されていると見られる。また、中央の横方向の帯の部分はメモリコントローラであると思われる。
そして、1つのSMをより詳細に書いたものが次の図である。
SMのブロックダイヤは、上から命令キャッシュ、4つのワープ(Warp)スケジューラ、各ワープスケジューラに含まれる2つの命令ディスパッチユニットで構成される命令発行関係のブロックが描かれている。
その下に汎用レジスタであるRegister Fileと多数の実行ユニットが描かれている。Coreと書かれているブロックは、32bitの単精度浮動小数点の積和演算や32bit整数の加減算や論理演算を行うユニットで、NVIDIAはCUDAコアと呼んでいる。DP Unitは64bitの倍精度浮動小数点の積和演算を行うブロック、LD/STはメモリとのロードとストアを担当するブロック、SFUは三角関数や対数などの計算を行うSpecial Function Unitである。
この図に見られるように、1つのSMにCUDAコアは192個、DP Unitは64個、LD/STとSFUはそれぞれ32個存在する。
そして、下辺にはインタコネクトネットワークがあり、その下に書かれた64KBのシェアードメモリ(またはL1キャッシュ)とこれらの演算ユニットを接続する。さらにその下には48KBの読み出し専用のリードオンリー・データキャッシュが描かれている。このキャッシュはグラフィックスではテクスチャを格納するもので、下側にテクスチャ特有の変形付の読み出しを行うためのテクスチャユニット(TEX)が16個描かれている。