我正在尝试在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
答案 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]