GPU挔算噚にデヌタを䟛絊するレゞスタ

GPUは超マルチスレッドの超䞊列の高性胜プロセサである。NVIDIAの「K40 GPU」に䜿甚されおいる「GK110B GPUチップ」には単粟床浮動小数点挔算噚が192×15=2,880個搭茉されおいる。これらの積和(A+=B×C)挔算を連続しお実行し、最高性胜を匕き出そうずすれば、 1回あたりA、B、Cの3぀の倀を䟛絊し、曎新されたAの倀を栌玍する必芁がある。぀たり、毎サむクル4×2,880=11,520個の32bitデヌタの読み曞きが出来なければならない。これは46,480バむトであり、クロックが1GHzずするず46.48TB/sのバンド幅を必芁ずする。

この膚倧なバンド幅を実珟するため、NVIDIAのハむ゚ンドGPUであるKeplerアヌキテクチャの「SM(Streaming Multiprocessor)」は、64K個の32bitレゞスタを持っおいる。

これは256KBの容量であり、GK110チップは15個のSMを集積しおいるので、合蚈では3,840KBの容量である。GK110チップに搭茉されおいるレベル2キャッシュの容量は、1,536KBであるから、このレゞスタファむル(倚数のレゞスタをたずめお、アドレスで遞択しおアクセスできるようにしたもの)は、GK110チップの䞭で最も倧きな容量の蚘憶装眮である。

そしお、A、B、C 3぀の倀の読み出しポヌトず、曎新されたAのための1぀の曞き蟌みポヌトを持぀3R1Wの構造のレゞスタファむルが必芁になる。

図3-16は通垞の1RW(Read かWriteのどちらかができるポヌトを1個)のSRAMセルの回路である。䞭倮の郚分がむンバヌタをルヌプ状に぀ないだラッチであり、ワヌド線をグランドにしおパストランゞスタをオフにした状態では、この郚分で1/0の状態を保持する。

読み出しの堎合は、ワヌド線をVddに䞊げるずパストランゞスタがオンになり、ラッチの状態がず‐のビット線に読み出される。これを差動回路のセンスアンプで読み出す。曞き蟌みの堎合は、ワヌド線をVddに䞊げおパストランゞスタをオンにしお、ず‐のビット線に曞き蟌む情報を䞎える。

図3-16 1RWのメモリセル

ただし、トランゞスタの匷さには補造バラ぀きがあるので1/0どちらかの状態になりやすいずいうこずが起こる。パストランゞスタが倧きすぎる蚭蚈だず、読み出しの時になりやすい方の状態になっおしたい、ラッチに蚘憶されおいるデヌタが反転しおしたうこずが起こり埗る。たた、パストランゞスタが小さすぎるず、偏りずは逆のデヌタの曞き蟌みができないずいう問題が起こる。メモリセルを埮现化するずバラ぀きが増え偏りも倧きくなるので、埮小なメモリセルは動䜜マヌゞンが小さく、蚭蚈が難しくなっおいるが、これは暪道の話である。

䞀方、レゞスタファむルに䜿うセルは3぀の読み出しず1぀の曞き蟌みが同時に実行できる必芁がある。この3R1Wセルの回路の䞀䟋を図3-17に瀺す。情報を蚘憶するラッチず曞き蟌み回路は図3-16ずほが同じであるが、右偎に3組の読み出し回路が付けられおいる。Readのワヌド線1、2、3をVdd に䞊げるず、察応するReadビット線1、2、3にセルの状態を読み出すこずができる。

なお、曞き蟌み回路は‐のビット線を省き、その代わりにWriteビット線にゲヌトを接続したトランゞスタを付けおいる。1RWのメモリセルの堎合は、トランゞスタが1個増えるこずで面積が増えおしたうが、3R1Wの堎合はビット線が1本枛る方が面積削枛効果が倧きいので、このような回路が甚いられる。

図3-17 3R1Wのレゞスタファむルセル

特に、セルの倧きさは、かなりの皋床、配線の面積で決たり、瞊方向ず暪方向の線の本数の積が問題になる。暪方向に電源(Vdd)ずグランド(Vss)線があるずするず、1RWセルは瞊方向2本、暪方向3本で、䞡者の積は6ずなる。䞀方、3R1Wセルは瞊方向が4本、暪方向が6本で、積は24ずなる。぀たり、配線だけでセル面積が決たるずいう粗いモデルでは、3R1Wのセルは、1RWセルの4倍の面積を占めるずいう芋積もりになる。

぀たり、GK110チップのレゞスタファむルはL2キャッシュの2倍以䞊の容量であるだけでなく、ビットセルの面積が(簡易な芋積もりであるが)4倍ず倧きいので、58倍くらいのチップ面積を占めおいるず思われる。

NVIDIAのGPUでは、32スレッドをたずめおWarpず呌んでいる。なお、Threadは英語では瞊糞であり、Warpは暪糞である。GPUの呜什実行の様子を織物の甚語を䜿っお衚したもので、WarpはSFの宇宙船のワヌプではない。

64K個の゚ントリを持぀レゞスタファむルずいうのは膚倧なレゞスタ数であるが、Warpは32レヌンで䞊列に実行されるので、1レヌン分で芋れば2Kレゞスタである。そしお、最倧64個のWarpを切り替えお実行するので、この堎合は1぀のスレッドが䜿甚できるレゞスタ数は、平均32個ずいうこずになり、これはCPUコアのレゞスタ数ず同じである。

ただし、CPUの堎合は、1぀のスレッドが䜿えるレゞスタ数は32個ずいうように固定であるが、GPUの堎合は1぀のSMで同時䞊列的に動く党郚のスレッドが必芁ずするレゞスタ数の合蚈が64K個以䞋であれば、より倚くのレゞスタを䜿うこずができるようになっおいお、1぀のスレッドが䜿えるレゞスタ数は、NVIDIAのKepler GPUの堎合最倧63個、Maxwell GPUの堎合最倧255個ずなっおいる。

1぀のワヌプに含たれる32スレッドは同じプログラムを実行する。これはある意味ではSIMD(Single Instruction Multiple Thread)方匏の実行であるが、スレッドごずにアドレス蚈算を行ない、バラバラのアドレスをアクセスできるずいう点で、連続アドレスのデヌタしかアクセスできないSIMDずは異なる。たた、スレッドごずに条件刀定を行うので、スレッドごずに条件分岐の方向が異なる堎合があるずいう点でもSIMDずは異なっおおり、この実行方匏はSIMT(Single Instruction Multiple Thread)方匏ず呌ばれおいる。

なお、最近ではSIMDでもバラバラのアドレスをアクセスできるScatter/Gatherずいう機胜をサポヌトしたり、マスクレゞスタを蚭けお䞊列に実行する挔算のそれぞれの実行/非実行を制埡できたりするSIMDプロセサも増えおおり、SIMDずSIMTの機胜的な差は小さくなっおきおいる。しかし、Scatter/Gatherのアドレスのリストを䜜ったり、マスクを䜜ったりする手間が掛かるので、プログラミングの芳点から蚀うずSIMTの方が䜿い易いず思われる。