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