GDDR5 DRAM単位で存在する2次キャッシュ

CPUの場合は、コアというと独立したプロセサとして動作する命令フェッチからデコード、実行の全機能を持っているが、GPUの場合は、レジスタファイルと演算器群、ロードストアユニットなどの塊を指す。NVIDIAはこれを「CUDAコア」と呼んでいる。また、AMDは、これを「Streaming Processor」と呼んでいるが、名前が紛らわしいので、ここでは「GPUコア」と呼ぶことにする。

そしてこれらのGPUコア群に対して共通の命令を供給する部分を含めて、独立したプロセサとして動作するようにしたものは、NVIDIAは「Streaming Multiprocessor(SM)」、AMDは「Compute Unit(CU)」と呼んでいる。

CPUの場合は、2次キャッシュはプロセサコアごと、あるいは数個のプロセサコアで共用であり、CPUチップにはコア+2次キャッシュのグループが複数個含まれるという構成が取られる。このとき、複数の2次キャッシュ(L2キャッシュ)は、コヒーレンシプロトコルを使って、内容に矛盾がないように維持される。

これに対して、GPUのSMは、CPUで言えばプロセサコアに相当するものであり、2次キャッシュも存在するのであるが、これらのコアと2次キャッシュの関係は、CPUのものとは異なっている。

図3-27に示すように、CPUの2次キャッシュはプロセサコアのメモリアクセス時間を短縮するもので、プロセサコアに付属している。一方、GPUの2次キャッシュはGDDR5 DRAMのアクセス時間を短縮するもので、DRAMに付属しているという違いがある。このため、GPUの構成は、メモリキャッシュと呼ばれることもある。

図3-27 CPUとGPUの2次キャッシュの違い

図3-27の左のCPUの構造では、同じアドレスのデータが両方のL2キャッシュに存在することがあり得るので、コヒーレンシプロトコルを使って矛盾が生じないようにする必要がある。しかし、右のGPUの構造では、メモリアドレスが決まると対応するGDDR5 DRAMとL2キャッシュスライスが決まり、同じアドレスのデータが複数のL2キャッシュスライスに存在するということは起こらない。従って、原理的に矛盾は生じないので、コヒーレンシは自動的に保たれる。

右側のGPUの構造では、GDDR5 DRAMのコントローラが一体化されているので、DRAMアクセスは特に指定しない限り、L2キャッシュを経由してアクセスされる。

なお、図3-27では、GDDR5 DRAMごとにL2キャッシュスライスが付いているように描かれているが、NVIDIAのGPUでは、物理的には2個のGDDR5 DRAMのペアに対してL2キャッシュスライスとメモリコントローラが設けられている。

CPU流の構造とGPU流の構造のどちらが良いかは、性能を重視するか構成の簡単さを重視するかによって違ってくる。CPU流の構成はプロセサコアと2次キャッシュの間にクロスバが入らないので、その分、2次キャッシュのアクセス時間を短くできる。また、必要に応じて複数のL2キャッシュに同じデータを入れることができ格納の自由度が高いので、こちらの構造の方が性能的に有利であると考えられる。

しかし、CPU流の構造では、複数のL2キャッシュ間のコヒーレンシを維持するハードウェアとプロコルを実装する必要がある。これに対して、GPU流の構造はL2キャッシュスライス間のコヒーレンシを心配する必要は無く、構造は簡素にできる。

L2キャッシュのAtomic処理

KeplerアーキテクチャのSMの中では最大64個のWarpを切り替えて実行する。どのWarpが実行されるかは、入力データが揃っていてすぐに実行できるかなどで決まる。このため、1つのWarpの中のスレッドの命令がプログラム順に実行されることは保証されているが、異なるWarpの間では命令が実行される順序は決まっていない。

Warpごとに独立した仕事をしている場合は、これでも問題はないが、あるWarpの処理が終わったら、その結果を使って別のWarpの処理を始めるような処理では、前のWarpの処理の終了を待ち合わせる必要がある。

このような場合には、セマフォなどが使われるが、そのためには他のプロセサからのアクセスを排除して排他的にメモリをアクセスするアトミックなメモリアクセスができることが必要である。

NVIDIAのGPUでは、同一SM内のWarpではシェアードメモリを用いてアトミックアクセスを行う方が高速であるが、別SMで動くWarp間の同期を行う場合は、グローバルに見えるアトミックなメモリアクセスが必要となる。

L2キャッシュは、指定されたメモリ番地のデータを読み出し、それが命令で指定されたデータと一致している場合は、命令で指定された第2のデータと置き換えるCompare Swapなどのアトミック命令の処理を、他のL2キャッシュアクセスの割り込みを排除して行うことができる。アトミックアクセスでは読み出しとその値の判定、そしてメモリへの書き戻しを連続して実行することが必要となるが、この処理をL2キャッシュに付けた専用のハードウェアで実行することにより処理を高速化している。

アトミックアクセスで問題になるのは、多数のスレッドが同じ変数をアクセスしようとしている場合で、これらのアクセスは1つのアクセスが終わってから、次のアクセスというように、順次、処理されなければならない。アトミックアクセスがデバイスメモリまでアクセスする必要がある場合に比べて、L2キャッシュのアクセスで済むのはアクセス時間が大違いで、NVIDIAはFermi GPUでL2キャッシュでのアトミックアクセスの処理を取り入れたことにより、5~20倍の性能向上と言っている。しかし、アトミック命令だけで見ると、性能向上は2倍程度であり、NVIDIAのいう性能向上がどのようなケースを指しているのかは不明である。