Kepler GPUは仮想化をサポート

GTC2012でGK104を含めてKepler GPUは仮想化をサポートしていることが公表された。CPUでは仮想化サポートは標準的になってきているが、GPUでの仮想化サポートはKeplerが初めてである。

GTCでは、仮想CPUと仮想GPUを組み合わせたクラウドで、グラフィック処理能力の高い多数のビジネス用の仮想PCを実現するNVIDIA VGXや、3Dグラフィックスを使用するアクションゲームをクラウドで提供するGeForce GRIDという仮想GPUの使い方が示されたが、仮想化の仕組みについては、サポートされる仮想マシンの最大数が256であること以外の情報は発表されなかった。

仮想化では、先ず、実行パイプラインをフラッシュし、書換えにより変更されているキャッシュラインをメモリに書き戻し、実行中の仮想マシンの状態を表す情報をメモリに書き出す。そして、その仮想マシンの実行を再開するときには、メモリに格納した仮想マシンの状態を復元するというのが一般的なやり方である。

キャッシュの書き戻しを行えば、残る仮想GPU状態はSMXのシェアードメモリ、レジスタファイルとワープごとに次の実行命令の番地を保持するプログラムカウンタなどの情報ということになる。GK110では、1個のSMXあたり、シェアードメモリは16~48KB、レジスタファイルは256KBの容量があり、これらの内容のメモリへの退避を行う必要があるので、CPUの仮想化に比べて大量の情報の退避、復元が必要となる。

また、書き込みが有ったキャッシュラインのデータをメモリに書き戻すためには全てのキャッシュラインを読み出す必要があり時間が掛るし、次に実行する仮想GPUが前の仮想GPUのデータを使ってしまわないように全てのキャッシュラインの状態をインバリッドにする必要もある。

これをキャッシュの各ラインに、どの仮想GPUのデータであるかを記憶する情報を付加し、キャッシュヒットの判定に仮想GPU番号を含めるようにすると、アドレスが同じであっても仮想GPU番号が異なるエントリはヒットしないので、複数の仮想GPUのデータをキャッシュに保持することができるようになり、仮想GPUの切り替えに際して、キャッシュからメモリへの書き戻しとインバリデーションが不要になる。

このようにするには、各キャッシュラインのタグ部に仮想GPU番号を記憶するビットとマッチングを判定するロジックが必要となる。この仮想GPU番号として8ビットを使っているとすれば、サポートできる仮想GPUの数が256個というのは理解できる数字である。

GK110はGF100のECCオーバヘッドを改善

そして、大規模スパコンにも使用されるGK110チップでは高信頼度が要求される。このため、FermiアーキテクチャのGF100と同様に、GDDR5メモリ、L1キャッシュ/シェアードメモリ、L2キャッシュ、レジスタファイルにはECCが付いており、1ビットエラーを自動訂正し、全ての2ビットエラーと大部分の3ビット以上のエラーを検出する機能を備えている。

通常のCPUでメモリのECCを行う場合は72bit幅でDIMMへのR/Wを行うが、GDDR5メモリではR/W幅は64bitであり、ECCやパリティチェック用の追加ビットを持っていない。このため、ECCを行う場合はチェックビットの分だけデータを格納できるメモリ容量が減少する。また、追加ビットの分だけメモリへのアクセス回数が増え、書き込みの際のECCのチェックビットの計算や読み出し時のエラー訂正などのオーバヘッドが加わり、ECCをオンにすると性能が低下する。しかし、Keplerではメモリのアクセス方法を改善して、Fermiに比べてECCオフとオンの場合の性能差を1/3に低減しECCを使いやすくしているとのことである。

また、Read Onlyのキャッシュにはパリティチェックが付いており、エラーが検出されると2次キャッシュから再読み込みを行ってソフトエラーから自動的に回復する機能を備えている。

このように第2世代の科学技術計算用のGK110 GPUは倍精度浮動小数点演算性能を大幅に引き上げるだけでなく、第1世代であるGF100/110の経験を踏まえて、仮想化、Dynamic Parallelismなどの新機能を追加し、Hyper-Qのような性能や利用率を改善する技術を盛り込んでいる。更に、集積度の向上にともなう消費電力増をアーキテチャの改善などで克服した強力なGPUとなっている。