2015年8月14日 10:00
コンピュータアーキテクチャの話 (335) キャッシュの実装を世代ごとに変化させてきたNVIDIA
○キャッシュの実装が世代ごとに変わるNVIDIAのGPU
L1Dキャッシュを持つ初代のFermi GPUでは、グローバルやローカル変数をL1Dキャッシュに割り当てることができ、通常のデータキャッシュとして使用することができた。しかし、ハードウェア的にはSM間のL1Dキャッシュのコヒーレンスをとるハードウェアはなく、グローバルメモリ経由のコヒーレンシの実現はGPUドライバが行っていたと推定される。
このため、L1Dキャッシュをうまく使えば性能を改善することができるが、普通のCPUのL1Dキャッシュのように、あまり気にせずに使ってしまうと、グローバルメモリへの書き出しと、他のSMのグローバルメモリの読み込みが頻繁に起こって、逆に性能が低下するということが発生してしまう。
第2世代のKepler GPUでは、ハードウェア的にはL1Dキャッシュは存在するのであるが、NVIDIAは、L1Dキャッシュはコンパイラが作り出す一時変数の格納だけに使い、一般のデータの格納はさせないという動作をデフォールトに変更した。
性能の観点から、コンパイラは、出来るだけGPRレジスタファイルを使って演算を行っていくコードを作るが、各スレッドが使えるレジスタファイルエントリ数には制限があるので、ソースコードによってはレジスタ数が足りなくなることがある。