GTC 2015 - MPIを使ったマルチGPUのプログラミング「基礎編」
そしてmpirunコマンドで実行を開始する。ここで-np 4の指定で4つのランクを起動することを指定している。ここではノードが4個あるので、各ノードに1ランクが割り当てられる。
ヤコビ法は隣接する4点の値から中心の点の次の値を計算するというもので、分散処理の説明に良く使われる。n×kランクで処理を分担すると右下の図のようになる。
1個のGPUで処理する場合は、単純に周囲の4点の平均で次の値を計算して行けば良い。
しかし、1つ前の図のように複数のランクで処理を分割すると、端の部分では一部の隣接点は他のランクが分担しており、自分のところにはデータがないということが起こる。このため、端の部分(Haloと呼ぶ、日本語では袖領域ともいう)のデータは隣接するランクと情報交換する必要がある。
上下の隣接したランクとの情報交換は次の図のようになる。この図の上半分はOpenAcc、下半分はCUDAでの記述である。なお、ここでは送信と受信を同時に行うMPI_Sendrecv関数が使われており、u_new+offset_first_rowからランクt_nbにデータを送り、ランクb_nbからのデータをu_new+offset_bottom_bondaryに受け取る。