我正在尝试按排名的升序和降序显示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 的东西仍然很陌生
这个问题不是很清楚。它可以用两种方式解释:
-
您希望按升序或降序查看打印的排名。任何 MPI 库,包括 MPJ Express,都遵循单程序多数据 (SPMD) 模型。这实质上意味着将执行程序的多个副本。副本数取决于您在使用 mpjrun 开关(使用 -np 开关)执行程序时指定的并行进程数。MPJ Express 不可能以任何特定顺序打印此行,因为它无法控制该程序并行副本的执行顺序。因此,输出将始终是不确定的。
-
您希望看到数据列表数组中的数据按升序或降序排序。同样,为此,您将需要 Gather() 或 Reduce() 操作。目前,您的程序正在制作 N 个数据列表数组的副本(假设您启动了 N 个并行进程)。
希望这有帮助。
默认情况下,此 Hello World 程序的输出是不确定的。 但是可以强制该程序按顺序输出 Hello World,即通过强制执行 MPI 进程的顺序执行顺序。
说明:[假设您熟悉 SPMD 编程模型] 让我们看看这个程序的执行顺序。
步骤1: 排名为0的进程将首先到达打印语句,并将获得输出通道进行打印。 所有其他进程将进入else-if
,并且必须在Recv
函数调用时等待。注意:Recv
是阻止调用,需要匹配的Send
。请参考完整的 MPI 教程以获得全面的解释!
第 2 步:排名为 0 的进程将向排名为 1(等级+1)的进程发送一条消息。现在,当发布匹配的Send
时,排名 1 进程从阻塞Recv
中出来,并将获得下一轮打印输出。之后,它将向下一个进程(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