PCI Express 3.0の5倍速いNVLINK

NVIDIAは、GPU間で高速にデータをやり取りするためにNVLINKという高速リンクを開発した。NVLINKは1本の信号線で20Gbit/sの速度でデータを伝送し、一方向の伝送に8本の信号線を使い、20GB/sのデータ伝送能力を持つ。逆方向の伝送を行うリンクと合わせて合計16本の信号線で、双方向合計で40GB/sのバンド幅をもつ高速リンクとを構成している。GP100チップは4本のリンクをもっているので、4リンク全部を2チップ間の接続に使えば、最大、80GB/sの双方向リンクでGPU間を結ぶことができる。

一方、PCI Express 3.0はx16の伝送路の場合、片方向のバンド幅は16GB/sであるので、NVLINKは5倍速いという計算になる。また、GP100は高速のコピーエンジンを持ち、ブロックのデータを高速にコピーすることができるようになっている。

伝送効率は、最大94%に達するとのことで、具体的な値は不明であるが、例えば4KBのようなブロックを送る場合の所要時間は、データ量をバンド幅で割ったものとほぼ同じであるという。

次の図は、2個のCPUに8個のP100 GPUを接続する構成で、片側のCPUに接続される4個のP100は全対全で接続され、各P100は反対側のCPUに接続される対応する位置のP100に接続されている。この構成により、GPU間でのデータのコピーや移動を高速に行える。

さらに、各GPUからはPCI Expressが出ており、PCI Expressスイッチを経由してCPUに接続されるという構成になっている。この構成ではGPU間の大量のデータの移動はNVLINKにオフロードし、CPUとの間のPCI Expressは、GPUとCPU間のデータの入出力と、制御用のデータのやり取りに限定することができる。

2個のCPUに8個のP100 GPUを接続する構成

CPUとGPUのメモリアクセスを容易にするユニファイドメモリ

CPUのメモリとGPUのメモリに統一された(重複しない)メモリアドレスを振り、アドレスをみれば、それがCPU側にあるか、GPU側にあるかを判別できるという方式を「ユニファイドメモリ(Unified Memory)」と呼ぶ。ユニファイドメモリを採用すれば、CPU側でGPUメモリにあるデータをアクセス、あるいはその逆のGPU側でCPUメモリをアクセスしようとしているということが分かる。

そして、他方のメモリをアクセスしようとした場合は、そのデータを他方のメモリから持ってきてアクセスするという機構を設ければ、原理的には、データがどちらのメモリにあっても自動的に判別してアクセスすることができる。

しかし、Maxwellまでは、CPUは4KBのページ、GPUは8KBのページを使っており、GPUの1ページ分のテーブルエントリを替えるにはCPUの2ページ分のテーブルエントリを書き換える必要がある。しかし、2回のテーブルの書き換えの間に、別のメモリアクセスが割り込んで片方だけを書き換えると正しく動作しなくなってしまう可能性がある。このため、MaxwellまでのGPUでは、使用するメモリはすべてGPU側のデバイスメモリにコピーしてから、GPUのカーネルプログラムの実行を開始する必要があった。

Pascal GPUでは、GPUのページサイズを変更し、通常のページは4KB、ラージページは2MBとx86 CPUと同じページサイズを使うようになっている。これにより、CPUからもGPUからも必要な時点で、必要なメモリページを要求し、移動してもらうDemand Pagingが行えるようになった。必要な全メモリをデバイスメモリに一括してコピーして置く必要はなくなり、デバイスメモリの容量より大きなメモリを必要とするプログラムを走らせることも可能となった。

また、cudaMemAdviseを使ってメモリの使い方のヒントを与えたり、明示的にPrefetchを行わせることもできるようになった。何よりも、ページ単位ではCPUとGPUのメモリのコヒーレンスが維持できるようになり、両者のデータアクセスが容易になるというメリットが生まれる。

Pascalでは、GPUのメモリ管理のページサイズをCPUと一致させ、デマンドページングができるようになった。このため、メモリの管理が容易になった

これまで見てきたように、Pascal GPUには新しい技術が多く詰め込まれており、性能と使い易さを改善してきている。