GTC 2015 - MPIを使ったマルチGPUのプログラミング「基礎編」
これが右の図で1と書かれた通信である。
そして青字で書かれたMPI_Sendrecvで2の通信を行う。こうすると、上下の隣接行の内容が白○の部分でも上下の隣接データが存在することになる。
図の下半分のCUDAのコードでもほぼ同じ記述で上下の隣接領域のデータのコピーを行うことができる。なお、これはCUDA対応のMPIを使った場合で、一般のMPIを使う場合は、送信データをcudaMemcpyで明示的にホストCPUのメモリにコピーしてから送信し、受信はホストCPUのメモリに確保したバッファに入れる。そして、また、cudaMemcpyで受信データをGPUのメモリにコピーするという手順が必要となる。
横の隣接データはアドレスが連続していないので、いったんto_leftという配列にコピーしてから送り、from_left配列に受け取ったデータを縦方向に並び替えているが、Halo部分を埋めるという考え方は縦の隣接と同じである。
このようなヤコビ法のプログラムを、プロセスあたり4K×4Kを分担させて1000ステップ実行した場合の実行時間の例を次の図に示す。
黄色がK20X GPUでの実行で青はXeon E5-2690 v2の3GHzクロックでの実行結果である。