MPI进程同步

时间:2011-08-09 23:02:48

标签: parallel-processing 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,但这对我来说听起来不太好。

另外,我读到调用Barrier有性能损失,所以我不想使用它。

如何实现我需要的同步?

非常感谢。

1 个答案:

答案 0 :(得分:2)

使用MPI_Barrier收集程序结束时的所有排名。

在MPI的所有合理实现中,如果有任何其他进程需要工作,则集合体中的排名将旋转或产生处理器。这可能看起来很像排名正在消耗100%的CPU ...但是如果任何其他进程实际上有工作要做,它将被安排并允许运行。