据我了解,MPI 通信器限制了通信范围,因此从一个通信器发送的消息永远不会在另一个通信器中接收。
然而,下面内联的程序似乎与此相矛盾。
我知道MPI_Send
调用在发布匹配接收之前返回,因为它在引擎盖下进行了内部缓冲(而不是MPI_Ssend
)。我也明白这MPI_Comm_free
不会立即破坏通信器,而只是将其标记为释放并等待任何挂起的操作完成。我想我不匹配的发送操作将永远挂起,但是我想知道为什么同一个对象(整数值)会被第二个通信器重用!?
这是正常行为,MPI 库实现中的错误,还是我的程序不正确?
任何建议都非常感谢!
后期编辑:发布后续问题
#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