CPUとGPUの通信

AMDのAPUのようにCPUとGPUがワンチップに集積され、両者が同一のメモリをアクセスする製品は別であるが、CPUにGPUカードを接続して使う場合は、CPUのPCI ExpressポートにGPUカードを接続することになる。

PCIバスでは、CPU側で必要なセットアップを行うことにより、CPUから見ると、GPU側のインタフェースレジスタがCPUのアドレス空間に存在するように見えるようになっている。PCI Expressは物理的には1対1接続の高速シリアルバスであるが、論理的にオリジナルのコモンバスのPCIと同様に動作する。

このインタフェースを使って、CPUはGPU側のDMAコントローラを起動して、CPUのメインメモリからGPUのデバイスメモリへのDMA転送を行う。このDMA転送でGPUが実行するプログラムや処理すべきデータをGPUのメモリに書き込み、インタフェースレジスタを使ってGPUプログラムの実行開始アドレスを与えるなどの方法で、GPUを起動する。

GPUはプログラムの実行が終了すると、割り込みなどの方法で、処理の終了をCPUに通知する。CPUはDMAを使って、デバイスメモリにある処理結果をCPUのメインメモリに転送する。そして、さらに処理すべきデータがあれば、この処理を繰り返す。

科学技術計算では、入力データも処理結果の出力データも量が多いという場合が多く、PCIバスのバンド幅が性能リミットになるというケースも多い。このため、NVIDIAは次世代GPUであるPascalで、PCI Express 3.0の5倍のバンド幅を持つNVLinkというインタコネクトを設けた。CPU側はIBMのPOWERプロセサがNVLinkをサポートすることを発表しているが、NVIDIAのライバルであるIntelのXeonはサポートしないと考えられる。従って、Xeonを使う場合は、NVLinkはCPUとのデータ転送には使えず、GPU間の高速通信パスとして使われることになると思われる。

NVLinkにてCPUとGPUを接続することで、より高速なデータのやり取りが可能となる (出所:NVIDIA Webサイト)

GPUと同様にアクセラレータとして使用されるIntelのXeon Phiは、次世代のKnights Landingでは各コアがXeonと同じ命令が実行できるようにして、OSを動作させることができるようになる。そうすると、OSなどの処理とアクセラレータの計算が同一チップで行われ、どちらも同じメモリを使うので、両者の間でメモリをコピーする必要が無く、PCIバスのバンド幅が性能の制約になることが無いというのが売りの1つとなっている。