GPUのメモリ階局

GDDR5 DRAMやHBMを䜿うGPUのメむンメモリ(以䞋ではCPUのメむンメモリず区別するためデバむスメモリず呌ぶ)は高いメモリバンド幅を持っおいるが、アクセスに掛かる時間は、DDR3/4 DRAMず倧差ない。GPUのクロックはCPUよりも遅いず蚀っおも、盎接、デバむスメモリをアクセスしたのでは、GPUの凊理はメモリネックになっおしたう。

このため、CPUの堎合ず同様に、GPUコアの近くに高速の小容量のメモリを眮き、倚くの凊理ではこのメモリを䜿甚するこずにより、平均的なアクセス時間を短瞮しお性胜を䞊げるずいう方法が取られる。

CPUの堎合は、ハヌドりェアが管理しお自動的に䜿甚頻床の高いデヌタを入れおくれるキャッシュが䜿われるのが䞀般的であるが、GPUではシェアヌドメモリなどず呌ばれるロヌカルなメモリや、゜フトりェアによる管理が必芁なキャッシュが甚いられるこずが倚い。

マルチコアで耇数のキャッシュがあるCPUでは、耇数のキャッシュの間で、同じアドレスに異なるデヌタが曞かれおしたうずいう矛盟が生じないようにするコヒヌレンシ制埡が必芁になる。しかし、そのためには、曞き蟌みに際しお、他のすべおのキャッシュに同じアドレスのデヌタが入っおいないこずを確認するこずが必芁になる。

䟋えば「K40 GPU」の堎合、15個のSM(Streaming Multiprocessor。CPUのプロセサコアに盞圓。なお、NVIDIAはKepler GPUのSMは芏暡が倧きいのでSMXず呌んでいる)があり、それぞれのSMがL1キャッシュを持ち、32×15スレッドが䞊列にメモリアクセスを行うので、コヒヌレンシを維持するためのトラフィックが7200個ず膚倧になり、CPUのようなハヌドりェア制埡のキャッシュを実珟しようずするずオヌバヘッドが非垞に倧きくなっおしたう。

このため、NVIDIAのKepler GPU(Tesla Kxxずいう名前が付けられおいる)のメモリ階局は図3.8のようになっおいる。32スレッドを䞊列に実行するSMXのロヌドストアナニットからは、Shared Memory、L1キャッシュずRead Only Data Cacheがアクセスできる。物理的にはShared MemoryずL1キャッシュは1぀のメモリアレむで、䞡者の合蚈で64kBの容量ずなっおおり、Shared Memory/L1キャッシュの容量を16KB/48KB、32KB/32KB、48KB/16KBず3通りに分割しお䜿うこずができるようになっおいる。48KBのRead Only Data Cacheはグラフィック凊理の堎合にはテクスチャを栌玍したりするメモリで、読み出しオンリヌで通垞のストア呜什ではデヌタを曞き蟌むこずはできない。

図3.8 Kepler GPUのメモリ階局

L1キャッシュは読み曞き可胜なキャッシュであるが、K40 GPUの堎合は15個あるSMのL1キャッシュ間のコヒヌレンシはハヌドりェア的には維持されおおらず、L1キャッシュに曞き蟌たれたデヌタは、それをL2キャッシュに吐き出す呜什を実行しないずL2キャッシュには曞き蟌たれない。そしお、L2キャッシュに曞かれたデヌタは自動的には他のSMのL1キャッシュには反映されず、同じアドレスのデヌタがL1キャッシュに残っおいるず、叀いデヌタを読んでしたう。

AMDのGCN(Graphics Core Next)アヌキテクチャのGPUでは、L1キャッシュに曞き蟌たれたデヌタはWavefront(NVIDIAのWarp盞圓)の64スレッド党郚でそのストア呜什が終了した時点で、自動的にL2キャッシュにも曞き蟌たれる。しかし、自動的には他のCompute Unit(NVIDIAのSM盞圓)のL1キャッシュには反映されず、そのアドレスのデヌタがL1キャッシュに残っおいるず、叀いデヌタを読んでしたうずいう点はNVIDIAのFermi/KeplerアヌキテクチャのGPUず同じである。

Kepler GPUでは、1次デヌタキャッシュは、レゞスタがあふれた時にレゞスタの内容を远い出しおレゞスタを空け、必芁になった時に読み蟌むずいうコンパむラが挿入するSpill/Fill凊理に限定しお䜿うずいう方法に倉曎された。Spill/Fill凊理であれば、溢れたレゞスタのデヌタを他のSMXが䜿うこずは有り埗ないので、SM間のL1キャッシュのコヒヌレンシを維持する必芁がない。

たた、Read Only Data Cacheはリヌドオンリヌであるので、SM間で同じアドレスのデヌタが異なるこずは有り埗ないので、これもキャッシュコヒヌレンシを維持するメカニズムは必芁ない。

L2キャッシュずRead Only Data Cacheは、同じアドレス空間の同じアドレスを指定すれば、異なるSMで動いおいるスレッドでも、同じデヌタを読むこずができる。L1キャッシュはコヒヌレンシが維持されおいれば、他のSMで動いおいるスレッドも同じアドレスで同じデヌタをアクセスするこずができるのであるが、コヒヌレンシが維持されおいない状態では、これは保蚌されおいない。

䞀方、Shared MemoryはSMにロヌカルなメモリであり、デバむスメモリのアドレス空間ずは独立なアドレスでアクセスされる。そしお、同じSMで動いおいるスレッド間では同じアドレスは同じ32bitデヌタをアクセスするが、異なるSMの間では、アドレスが同じであったずしおも、たったく異なるデヌタをアクセスするこずになる。Shared MemoryはSMロヌカルなメモリであり、他のSMのロヌカルメモリずのコヒヌレンシは、本質的に䞍芁である。

そしお、L1キャッシュずRead Only Data Cacheをミスするず、L2キャッシュがアクセスされる。CPUのL2キャッシュ(あるいは、IntelのいうLast Level Cache)はどのメモリアドレスのデヌタでもキャッシュの栌玍䜍眮に制限はないが、GPUのL2キャッシュはCPUのL2キャッシュず異なり、図3.9に瀺すように、黄色のGDDR5メモリの内容は黄色のL2キャッシュスラむスにしか入らないずいうように、察応が決たっおいる。

図3.9 GK110 Kepler GPUのL2キャッシュずGDDR5の接続

それぞれの512KBのL2キャッシュスラむスは同色のGDDR5メモリのアドレス範囲のデヌタしかキャッシュしないので、原理的に、同じアドレスのデヌタが2぀のL2キャッシュスラむスに存圚するこずは起こらない。埓っお、この構造のL2キャッシュでは自動的にコヒヌレンシは保たれる。

通垞のCPUのように、DRAMチップずキャッシュの栌玍䜍眮に制玄のないキャッシュの方が、栌玍の自由床が高く、ヒット率を高くするこずができるず思うのであるが、実枬デヌタを芋たこずが無く、どの皋床の差があるのかは分からない。