私はMPIを使用した私のプログラムの実装について、まだ混乱しています。MPIプロセスの同期化
import mpi.*;
public class HelloWorld {
static int me;
static Object [] o = new Object[1];
public static void main(String args[]) throws Exception {
//10 processes were started: -np 10
MPI.Init(args);
me = MPI.COMM_WORLD.Rank();
if(me == 0) {
o[0] = generateRandBoolean(0.5);
for(int i=1; i<10;i++)
MPI.COMM_WORLD.Isend(o, 0, 1, MPI.OBJECT, i,0);
if((Boolean)o[0])
MPI.COMM_WORLD.Barrier();
} else {
(new HelloWorld()).work();
}
MPI.Finalize();
}
public void work() {
//do some calculation
//for some reason, the 10th process
//will not be needed
if(me == 9)
return;
//some times, the rest of the
//processes have to be synchronized
Request rreq = MPI.COMM_WORLD.Irecv(o, 0, 1, MPI.OBJECT, MPI.ANY_SOURCE, 0);
rreq.Wait();
if((Boolean)o[0])
MPI.COMM_WORLD.Barrier();
}
public static boolean generateRandBoolean(double p) {
return (Math.random() < p);
}
}
問題はいくつかのケースでは、私はすべてのプロセスを必要としないので、私はアイドルなもので何をすべきかわからないということです。これは私の例です。最初は不要なプロセスを返すが、残りのプロセスをBarrier()と同期させる必要がある場合は問題が発生する。
私は、メッセージを待っている間に実行する必要のないプロセスを完了させたり、バリアを呼び出すことができると思っていましたが、それは私にはうれしくありません。
また、Barrierにはパフォーマンス上のペナルティがありますので、使用しないことをお勧めします。
私は必要な同期をどのように達成できますか?
ありがとうございました。
MPI_Barrierを使用するとパフォーマンスが低下することは、どこから聞こえましたか? –