0

我正在尝试按排名的升序和降序显示 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 的东西还是新手

4

2 回答 2

1

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

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

  2. 您希望查看 datalist 数组中的数据按升序或降序排序。同样,为此您将需要 Gather() 或 Reduce() 操作。目前,您的程序正在制作 N 个 datalist 数组副本(假设您启动了 N 个并行进程)。

希望这可以帮助。

于 2019-05-29T04:16:00.753 回答
0

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

说明:【假设你熟悉SPMD编程模型】我们来看看这个程序的执行顺序。

Step 1:Rank 0 的进程首先到达 print 语句,并得到输出通道进行打印。所有其他进程将进入else-if并且必须在Recv函数调用处等待。注意:Recv是一个阻塞调用,需要一个匹配的Send. 请参考完整的MPI 教程以获得全面的解释!

步骤 2:Rank 0 的进程将向 Rank 1 (rank+1) 的进程发送消息。Recv现在 Rank 1 进程在发布匹配时退出阻塞Send,并将获得下一轮打印输出。之后,它会向下一个进程(rank+1)发送一条消息,让它轮流打印。

下一步:在每一步,一个进程else-if都会得到一个匹配Send,并会从阻塞中出来Recv并打印 Hello World 并向下一个 rank 发送消息以允许它打印。最后,最后一个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
于 2020-09-13T12:52:36.370 回答