我仍然对使用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,但这对我来说听起来不太好。
另外,我读到调用Barrier有性能损失,所以我不想使用它。
如何实现我需要的同步?
非常感谢。
答案 0 :(得分:2)
使用MPI_Barrier收集程序结束时的所有排名。
在MPI的所有合理实现中,如果有任何其他进程需要工作,则集合体中的排名将旋转或产生处理器。这可能看起来很像排名正在消耗100%的CPU ...但是如果任何其他进程实际上有工作要做,它将被安排并允许运行。