ディスパッチャの命令供給と実行ユニットのバランス

図3-36に話を戻すと、Kepler GPUでは、4つのワープスケジューラで最大1サイクルに8命令を発行できるという構成になっている。その下には全体では、32bit語のエントリを65,536個持つレジスタファイルがあり、ディスパッチャからの命令とレジスタファイルからのオペランドを演算器群に送って演算を行う。

図3-36(再掲) NVIDIAのKepler GPUのSMのブロック図

図3-36では、Coreと書かれた単精度の演算器が16個 縦方向に並んでおり、2列32個の演算器のグループが1つのワープを処理する。

コアと書かれた緑の小さな箱は32bit単精度の浮動小数点の積和演算と整数の演算を行うユニットである。このユニットは32bit整数の演算や論理演算も担当する。少し大きいオレンジのDP Unitは64bit倍精度浮動小数点の積和演算を行うユニットである。

SFUはSpecial Function Unitで、グラフィックスの計算で良く出てくる三角関数や逆数、平方根の逆数、Log、10のべき乗などの、超越関数を計算するユニットである。なお、超越関数とは、多項式で表現できない関数を意味するが、実際にはSFUは区間分割して多項式でこれらの関数を近似計算している。近似といっても32bitの単精度浮動小数点数の範囲では、誤差が大きいケースでも最下位ビットで数ビット程度の誤差であり、通常は問題にならない程度の誤差である。

Ld/Stユニットはロード/ストアユニットで、ロードストア命令を処理するユニットである。

GK110チップでは、図3-36のように、SMあたり、単精度の演算器は6命令分、倍精度の演算器は2命令分、SFUとLd/Stユニットは(4サイクル実行であるので)2命令分存在し、発行される命令にダイナミックに割り当てられる構造になっている。このため、レジスタフィルと実行ユニットの間の接続を切り替えるクロスバが必要になるが、命令ディスパッチャごとにすべてのタイプの演算ユニットを置く構造に比べて無駄が少ない。

単精度の浮動小数点演算器は6命令分存在する。これらの演算器をフルに動かすには6命令/サイクルの命令発行バンド幅があればよい。そして、ロード/ストアユニットとSFUはそれぞれ16個であるが、前に書いたように、4サイクルでの実行であるのでそれぞれが4命令を並行して処理できるのであるが、これも各1命令/サイクルの命令発行バンド幅があれば良い。

つまり、4つのワープスケジューラで毎サイクル8命令を発行できれば、192個の単精度演算器と32個のロード/ストアユニット、32個のSFUに、切れ目なく、命令を供給し続けることができる。

64bit倍精度の演算を行うDP Unitは、特別である。64bitのオペランドを必要とするのであるが、レジスタファイルのポートは32bit幅しかない。このため、レジスタ0と1というように2つの連続したレジスタをまとめて64bitの値を記憶している。倍精度演算ユニットは、各オペランドに2つのレジスタポートを使って、レジスタ0と1のようなペアのレジスタを読み出し、書き込みを行っていると思われる。このようにレジスタポートを2倍使ってしまうので、倍精度演算命令は2つのディスパッチャを使って他の命令と一緒に発行することができない構造になっている。

レジスタファイルのポートグループの数は、単精度演算ユニットとLd/Stユニット、SFUの数と同じ16ポートと考えられ、SM全体でエントリ数が65,536ということは4096エントリ×32bitのアレイが16個で構成されているのであろう。ただし、このアレイは積和演算を考えると、3つのリードポートと1つのライトポートを必要とし、単純なシングルポートのSRAMアレイではない。