Синхронизация процессов MPI - PullRequest
0 голосов
/ 10 августа 2011

Я все еще не уверен в реализации моей программы с использованием 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 снижает производительность, поэтому я бы предпочел не использовать его.

Как мне добиться необходимой синхронизации?

Большое спасибо.

1 Ответ

2 голосов
/ 11 августа 2011

Используйте MPI_Barrier для сбора всех рангов в конце программы.

Во всех разумных реализациях MPI ранги в коллективе будут вращаться или уступать процессору, если есть какие-то другие процессы, которые нужно выполнить.Это может выглядеть очень похоже на то, что ранг потребляет 100% ресурсов ЦП ... но если у любого другого процесса действительно есть работа, он будет запланирован и разрешен для запуска.

...