GPUのレジスタ対応は可変

CPUのレジスタ番号は固定で、1つのハードウェアスレッドの中でR1と言えば、常に同じレジスタを指す。一方、GPUでは、例えば、ハードウェア的には2048エントリ×32スレッドという巨大なレジスタファイルを持ち、これを同時に実行される64Warpで共用するという構造が用いられる。なお、×32は1ワープの32スレッドと固定的に対応する。

2048エントリ/64Warp=32であるので、1つのワープは平均32レジスタを使えることになり、この個数はRISC CPUの汎用レジスタの数と同じである。しかし、CPUではレジスタの個数や対応は固定であるのに対して、GPUでは、各ワープがレジスタを何個使うかをコンパイラに指定することができるようになっている。

レジスタが少なければ、中間結果をキャッシュやローカルメモリに退避、復元する回数が増え、性能が低下する。一方、使えるレジスタ数が多ければ、ローカルメモリなどを使わずレジスタだけで計算できるケースが増え、性能を上げやすい。従って、実行回数の多いカーネルには多めのレジスタを割り当て、実行回数の少ないカーネルには少しのレジスタを割り当てることにすれば、全体としての実行性能を上げることができる。

しかし、このような可変の割り当てを可能にするためには、各ワープは何番のレジスタから何個のレジスタを使うのかという情報を記憶して置き、プログラムで指定された論理レジスタ番号に、各ワープに割り当てられたレジスタ領域の先頭のレジスタ番号を加算して、2048エントリのレジスタをアクセスすることが必要となる。

加算を含むので、このレジスタファイルのアクセスも2~3段のパイプラインにしないと間に合わないと思われるので、レジスタファイルからのオペランドの読み出しと演算結果の書き込みアクセスだけでも合計4~6段のパイプラインとなり、簡単な論理演算を行って、再度レジスタファイルにアクセスして書き込むという動作でも10サイクル程度かかるというのは理解できる。

一方、CPUの場合は直前の命令の演算結果を使うというケースが多く、レジスタファイルアクセスは1サイクルというパイプラインが常識で、アクセス時間が遅い2048エントリなどの巨大レジスタは使えないし、アクセスの前にレジスタ番号を求める加算の時間が必要となるというような構造にはできない。

SMの実行ユニットの処理能力

前に述べたように、KeplerのSMはCoreを192個、DP Unitを64個、LD/STとSFUを32個持っている。整数演算や単精度浮動小数点演算を行う場合は16個のCoreを使い、2サイクル同じ命令を実行して1ワープに含まれる32スレッドを処理する。64bitのDP演算は2命令分のレジスタファイルを使うので、1サイクルに16演算しか実行できず、2サイクル同じ命令を実行することで32スレッドを実行していると考えられる。

LD/STやSFUはCoreやDP Unitのように16個×2サイクル、あるいは8個×4サイクルで32スレッドを処理している可能性が高い。どの方法でもサイクルあたりに実行できる命令数は同じであるが、ワープスケジューラごとにLD/STやSFUが存在する方がスケジュールはやり易いのではないかと思われる。8個×4サイクルとした場合は、32スレッドの実行の開始から終了までのサイクル数は3サイクル長くなるが、LD/STやSFUは、元々レーテンシが長い処理であり、この程度のレーテンシの増加は許容できると思われる。

片側の2つのワープスケジューラは、毎サイクル2ワープから、最大4命令を読み出す。一方、実行ユニットの受付可能な命令数はCoreが3命令、DP Unitが2命令(レジスタファイルが制限となる場合は1命令)、LD/STとSFUがそれぞれ4サイクルに4命令を受け付け可能となる。

合計では、サイクルごとに9命令の受付が可能であるが、それぞれの実行ユニットの受付可能命令数の制限の範囲内である必要がある。この制限を超えるような命令列の場合は、別のワープの命令を選ぶ、あるいは、制限を超える命令の発行を取りやめるなどの対応が取られると思われる。

Maxwell GPUではSMの構成が変更され、2個のワープスケジューラに4個のDispatcher、そして32個のCoreと8個のLD/ST、8個のSFUからなる実行ユニットが2組という構成になっている。なお、MaxwellではDP Unitを持つ科学技術計算向けの製品は、まだ、発表されていない。

そして、Maxwellのワープスケジューラには2つのDispatcherが付き、2サイクルに8命令を発行する。実行ユニットとしては、2つのCoreと4サイクルに1命令を実行できるLD/STユニットと4サイクルに1命令を実行できるSFUのグループがある。また、2つのワープスケジューラで共用の4個のTexture Unitがあるが、命令発行の観点からは、あまり影響がない。

図3-42にKeplerとMaxwellの命令発行と命令実行の能力の比較を示す。Maxwellの2個のDispatcherは毎サイクル2個のWarp命令を発行することができるのに対して、実行ユニットが受け付けられるのは、平均では1.5265個の命令となっており、実行受付/発行比率は約0.78である。これに対してKeplerの実行受付/発行比率は1.125となっている。

MaxwellではDispatcherと実行ユニットの接続の柔軟性がKeplerと比べると制限されているが、実行ユニットの命令受付能力と比べて大きな命令発行能力を持たせることで実行ユニットの利用率を維持、あるいは、改善をするようになっている。

図3-42 KeplerとMaxwellの命令発行部の比較。MaxwellのCoreは×32かも知れないが、×16が2本でもトータルの命令受付能力は同じである