有没有一种方法可以按升序和降序对Mpi中的排名进行排序

时间:2019-05-28 17:02:25

标签: java eclipse mpj-express

我正在尝试通过其排名的升序和降序显示Hello World消息

我读过有关双子音排序的信息,但不了解如何实现它,

int[] datalist = new int[8];
MPI.Init(args);

int rank = MPI.COMM_WORLD.Rank();
int size = MPI.COMM_WORLD.Size();

System.out.println("Hello World from <"+rank+"> of total "+size+" processes");

MPI.Finalize();

我从此编码中获得了输出,但是没有通过排序对其进行输出,我真的需要帮助,因为我对mpi还是很陌生

2 个答案:

答案 0 :(得分:0)

问题不是很清楚。可以用两种方式解释它:

  1. 您想按升序或降序查看打印的等级。任何MPI库(包括MPJ Express)都遵循单程序多数据(SPMD)模型。这实质上意味着将执行程序的多个副本。副本数取决于您使用mpjrun开关(使用-np开关)执行程序时指定的并行进程数量。 MPJ Express无法以任何特定顺序打印此行,因为它无法控制此程序的并行副本的执行顺序。因此,输出将始终是不确定的。

  2. 您希望看到datalist数组中的数据以升序或降序排序。再次,为此,您将需要Gather()或Reduce()操作。当前,您的程序正在制作N个数据列表数组的副本(假设您启动了N个并行进程)。

希望这会有所帮助。

答案 1 :(得分:0)

默认情况下,此Hello World程序的输出是不确定的。 但是,可以强制该程序按顺序输出Hello World,即强制执行MPI进程的顺序执行顺序。

说明:[假设您熟悉SPMD编程模型] 让我们看一下该程序的执行顺序。

步骤1:等级为0的过程将首先到达打印语句,并将获得输出通道以对其进行打印。 所有其他进程将输入else-if,并且必须等待Recv函数调用。注意:Recv是阻塞呼叫,需要匹配的Send。请参阅完整的MPI tutorial以获得全面的说明!

步骤2:等级为0的流程将向等级为1(等级+1)的流程发送消息。现在,发布了匹配的Recv时,等级1的过程从阻塞Send中出来,将进行下一轮打印输出。之后,它将发送消息到下一个进程(rank + 1),使其可以打印。

后续步骤:在每一步中,else-if中的一个进程将获得匹配的Send,并将从阻塞的Recv中出来,并打印Hello World并将消息发送给下一个排列以使其打印。最后,最后一个else语句是一个极端的情况,在此情况下,最后一个工作程序将打印输出而不发送消息。之后执行完成。

int[] datalist = new int[8];
MPI.Init(args);

int rank = MPI.COMM_WORLD.Rank();
int size = MPI.COMM_WORLD.Size();

int buff[] = new int [1];
buff[0] = rank;
int tag = 1001;
if (rank == 0){ 
    System.out.println("Hello World from <"+rank+"> of total "+size+" processes");
    MPI.COMM_WORLD.Send(buff, 0, 1, MPI.INT, rank+1, tag);
}
else if (rank < size-1){
    MPI.COMM_WORLD.Recv(buff, 0, 1, MPI.INT, rank-1, tag);
    System.out.println("Hello World from <"+rank+"> of total "+size+" processes");
    MPI.COMM_WORLD.Send(buff, 0, 1, MPI.INT, rank+1, tag);
}
else{
    MPI.COMM_WORLD.Recv(buff, 0, 1, MPI.INT, rank-1, tag);
    System.out.println("Hello World from <"+rank+"> of total "+size+" processes");

}

MPI.Finalize();

对于4个进程,输出始终为:

Hello World from <0> of total 4 processes
Hello World from <1> of total 4 processes
Hello World from <2> of total 4 processes
Hello World from <3> of total 4 processes