GTC 2015 - MPIを使ったマルチGPUのプログラミング「高性能化編」
NVIDIAは、CUDA4以降、UVA(Unified Virtual Addressing)という機能をサポートしている。CPUとGPUを単純にPCIeで繋いだ場合は、両者のメモリは独立で、CPUメモリの0番地とGPUメモリの0番地の両方が存在することになる。
一方、UVAでは次の図の右側の絵のようにCPUメモリの後にGPUメモリが置かれることになり、0番地はCPUメモリにしか存在しない。しかし、CPUはCPUメモリにしかアクセスできないし、GPUはGPUメモリにしかアクセスできないという状況は変わらない。
これで何が良いかというと、番地を見ると、それがCPU側のメモリであるか、GPU側のメモリであるかが分かり、それに応じた処理ができるという点である。
つまり、CUDA対応のMPIは、送受信のデータのアドレスを見て、それがGPUメモリにある場合は、GPUメモリからCPUメモリ、あるいはその逆方向のコピーを自動的に行ってくれる。従って、プログラマはcudaMemcpyを明示的に書く必要がない。
また、MPIの性能を改善するため、NVIDIAはGPUDirect RDMAという機能をサポートしている。