2011-08-09 8 views
0

私は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にはパフォーマンス上のペナルティがありますので、使用しないことをお勧めします。

私は必要な同期をどのように達成できますか?

ありがとうございました。

+0

MPI_Barrierを使用するとパフォーマンスが低下することは、どこから聞こえましたか? –

答えて

2

MPI_Barrierを使用して、プログラムの最後にすべてのランクを収集します。

MPIのすべての妥当な実装では、作業する他のプロセスがある場合、集団のランクはプロセッサを回転させたり降格したりします。これはランクがCPUの100%を消費しているように見えるかもしれませんが、他のプロセスが実際に動作するようになっている場合、スケジューリングされて実行されます。

関連する問題