MPI_Recv()冻结程序,未从C

时间:2018-11-27 21:52:17

标签: c mpi

我正在尝试在MPI中编写超快速排序的实现,但是我遇到一个问题,即进程卡在MPI_Recv()上。

在使用2个进程进行测试时,似乎在else的{​​{1}}中,进程1从未接收过来自进程0的数据透视。进程0成功发送了它的数据透视并正确地通过了该方法递归。如果放入一些打印调试语句并收到输出:

if (rank % comm_sz == 0)

此后,永远不会打印排名1的post-recv消息。等级0打印其发送后消息,并继续通过数组的该部分。我的(arr, 0, 2, 0, 9) Rank 0 sending pivot 7 to 1 (arr, 1, 2, 0, 9) Rank 1 pre-recv from 0 MPI_Send()的实现是否有问题,可能会导致这种情况?

这是我的快速排序代码:

(作为参考,该方法的参数中的MPI_Recv()指的是查看数组该部分的进程数。)

comm_sz

1 个答案:

答案 0 :(得分:0)

Rank 0 sending pivot 7 to 1
MPI_Send(&pivot, 1, MPI_INT, partner, rank, MPI_COMM_WORLD);
                                      ^^^^

因此,发件人标签为零。

Rank 1 pre-recv from 0
MPI_Recv(&pivot, 1, MPI_INT, partner, rank, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
                                      ^^^^

接收者标签是一个。

如果接收方仅要求带有特定标签的消息,它将不会收到具有其他标签的消息。

  

有时,A可能不得不向B发送许多不同类型的消息。MPI无需发送额外的措施来区分所有这些消息,而是MPI允许发送者和接收者还可以在消息中指定消息ID(称为标签)。当进程B仅请求具有特定标签号的消息时,具有不同标签的消息将被网络缓冲,直到B为它们准备好为止。 [MPI Tutorial -- Send and Receive]