2016年2月5日 09:00
コンピュータアーキテクチャの話 (347) CPUとは異なり、レジスタ対応が固定ではないGPU
○GPUのレジスタ対応は可変
CPUのレジスタ番号は固定で、1つのハードウェアスレッドの中でR1と言えば、常に同じレジスタを指す。一方、GPUでは、例えば、ハードウェア的には2048エントリ×32スレッドという巨大なレジスタファイルを持ち、これを同時に実行される64Warpで共用するという構造が用いられる。なお、×32は1ワープの32スレッドと固定的に対応する。
2048エントリ/64Warp=32であるので、1つのワープは平均32レジスタを使えることになり、この個数はRISC CPUの汎用レジスタの数と同じである。しかし、CPUではレジスタの個数や対応は固定であるのに対して、GPUでは、各ワープがレジスタを何個使うかをコンパイラに指定することができるようになっている。
レジスタが少なければ、中間結果をキャッシュやローカルメモリに退避、復元する回数が増え、性能が低下する。一方、使えるレジスタ数が多ければ、ローカルメモリなどを使わずレジスタだけで計算できるケースが増え、性能を上げやすい。従って、実行回数の多いカーネルには多めのレジスタを割り当て、実行回数の少ないカーネルには少しのレジスタを割り当てることにすれば、全体としての実行性能を上げることができる。