【发布时间】:2014-07-11 13:23:14
【问题描述】:
据我了解,MPI 传播者限制了传播范围,例如 从一个通信器发送的消息永远不会在另一个通信器中接收。
但是,下面内联的程序似乎与此相矛盾。
我知道MPI_Send 调用会在匹配接收发布之前返回,因为它在后台进行了内部缓冲(与MPI_Ssend 不同)。我也知道MPI_Comm_free 不会立即销毁通信器,而只是将其标记为释放并等待任何待处理的操作完成。我想我不匹配的发送操作将永远挂起,但是我想知道为什么相同的对象(整数值)会被第二个通信器重用!?
这是正常行为,是 MPI 库实现中的错误,还是我的程序不正确?
非常感谢任何建议!
后期编辑:发布follow-up question
#include "stdio.h"
#include "unistd.h"
#include "mpi.h"
int main(int argc, char* argv[]) {
int rank, size;
MPI_Group group;
MPI_Comm my_comm;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_group(MPI_COMM_WORLD, &group);
MPI_Comm_create(MPI_COMM_WORLD, group, &my_comm);
if (rank == 0) printf("created communicator %d\n", my_comm);
if (rank == 1) {
int msg = 123;
MPI_Send(&msg, 1, MPI_INT, 0, 0, my_comm);
printf("rank 1: message sent\n");
}
sleep(1);
if (rank == 0) printf("freeing communicator %d\n", my_comm);
MPI_Comm_free(&my_comm);
sleep(2);
MPI_Comm_create(MPI_COMM_WORLD, group, &my_comm);
if (rank == 0) printf("created communicator %d\n", my_comm);
if (rank == 0) {
int msg;
MPI_Recv(&msg, 1, MPI_INT, 1, 0, my_comm, MPI_STATUS_IGNORE);
printf("rank 0: message received\n");
}
sleep(1);
if (rank == 0) printf("freeing communicator %d\n", my_comm);
MPI_Comm_free(&my_comm);
MPI_Finalize();
return 0;
}
输出:
created communicator -2080374784
rank 1: message sent
freeing communicator -2080374784
created communicator -2080374784
rank 0: message received
freeing communicator -2080374784
【问题讨论】:
-
有趣 - 我注意到这在 OpenMPI 中的行为不同。我不确定这本身是一个错误,还是未定义行为的结果(例如,我不清楚释放带有该 Send 的通信器是否有效,但显然仍在飞行中)。重新使用通信器的整数表示并不意味着太多。这只是一个不透明对象的句柄。重新使用它类似于(我希望,非常类似于)重新使用最近被释放的表条目。
-
不出所料,在 IntelMPI 和 mvapich2 下,当使用 Ssend 或大于急切限制的消息时,该程序正确挂在 rank 1 的发送。据推测,当 my_comm 急切发送时,MPICH2 不会将 my_comm 上的发送视为“待处理”,因此继续并释放 my_comm(OMPI 在 comm_free 处挂起)。但我不知道由此产生的意外结果是否是(a)由于用户代码中无效的提前释放通信器而导致的未定义行为(例如,在您知道它已被接收之前修改发送缓冲区),(b)不正确的 MPICH2 行为,或 (c) 标准中的真正歧义。
-
..我的错误;在 OpenMPI 中,它挂在接收端。
-
这可能是 MPICH(英特尔 MPI 所基于)中的一个错误。你能把这个例子报告给discuss@mpich.org吗?
-
@kraffenetti - 谢谢!我不知道英特尔 MPI 是基于 MPICH 的。我会尝试在那里报告。