我正在尝试通过其排名的升序和降序显示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还是很陌生
答案 0 :(得分:0)
问题不是很清楚。可以用两种方式解释它:
您想按升序或降序查看打印的等级。任何MPI库(包括MPJ Express)都遵循单程序多数据(SPMD)模型。这实质上意味着将执行程序的多个副本。副本数取决于您使用mpjrun开关(使用-np开关)执行程序时指定的并行进程数量。 MPJ Express无法以任何特定顺序打印此行,因为它无法控制此程序的并行副本的执行顺序。因此,输出将始终是不确定的。
您希望看到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