2次キャッシュとメモリインタフェース

従来のGPUでは2次キャッシュは存在しなかったが、Fermiでは全SMで共有される768KBのL2キャッシュを持っている。最近の汎用CPUの2次キャッシュと比較すると大きな容量ではないが、80%のヒット率としても、メモリへのアクセスは1/5となるので性能改善効果は大きい。NVIDIAのデータでは、PhysXによる液体の衝突の計算ではGT200に較べて2.7倍の性能が得られたという。

また、このL2キャッシュはアトミックなRead-Modify-Writeオペレーションをサポートして、16個のSM間の同期通信を高速化する役目も果たしている。

しかし、16個のSMにそれぞれ48KBのL1キャッシュがあると、L1キャッシュの総量は768KBであり、L2キャッシュがインクルージョンキャッシュであると無駄が多い。また、16個のSMのL1キャッシュとのコヒーレンシを保つのも大変であり、Fermiのキャッシュが具体的にどのような構造になっているのか興味深い。

Fermiは、384ビット幅のメモリバスを持ち、NVIDIAのGPUとしては初めてGDDR5メモリをサポートしている。また、メモリアドレスは論理的には64ビット、物理的には40ビットをサポートし、将来のメモリ容量拡大に備えている。

そして、この巨大なメモリ空間をサポートするため、当然、ページ単位のアドレス変換を行うTLBを持っていると考えられるが、Fermiでは、GPUメモリだけではなく、シェアードメモリやローカルメモリも連続のアドレス空間として見せることが可能となっている。この機能は、後述のHyperTransport直結版では大きな威力を発揮しそうである。

また、Fermiの目玉のECCであるが、レジスタファイルやキャッシュはエラーチェックに必要なビット数を追加してやれば良いのであるが、GDDR5メモリチップは32ビットインタフェースしか持っておらず、ECCのチェックビットを付加する余裕がないのであるが。NVIDIAがどこにチェックビットを格納しているかは公表されていない。筆者としては、メモリインタフェースは384ビットではなく、物理的にはチェックビット込みの432ビットであり、グラフィックス用ではECC無しで使用し、ECCを使う場合は、ECC用のGDDR5メモリを追加するのではないかと考えている。

Fermiの命令アーキテクチャ

これらの機能追加や変更にともない、当然ながら命令セットにも変更が必要であり、FermiはPTX2.0をサポートする最初のGPUであると書かれている。しかし、現状ではPTX2.0の仕様書は公開されていないので、その詳細は明らかになっていないのであるが、方向性としては、単一メモリ空間のサポートによるC++のフルサポートやOpenCLやDirectComputeの最適化を可能とする命令セットとなっているという。

また、Fermiでは最大16Kernelの同時実行サポートだけでなく、実行するKernelを入れ替える時間が20~25μsと従来のGPUの1/10に短縮されている。グラフィックスの場合は1つのKernelを長時間実行する場合が多いので、入れ替え時間は大きな問題ではないが、科学技術計算では次々と実行すべきKernelが変わるような処理もあり、切り替え時間が長いとGPUの性能が発揮できないというケースがあるので、これは重要な改善である。

そして、Fermiでは、このコンテキストの入れ替えを高速化するために、2系統のメモリ転送エンジンを備えている。