【发布时间】:2017-10-20 02:33:23
【问题描述】:
我正试图让 MPI 断开一个通信器,这是一个易怒的业务 - 我在下面整理了一个演示。我有两个版本的相同想法,监听一个 int,一个使用 MPI_IRecv,一个使用 boost::mpi::request。
您会注意到,在此程序上使用 mpiexec -n 2 时,版本 A 会愉快地断开连接并退出,但版本 B 不会。 MPI_Request_free-ing 一个 boost::mpi::request 有什么技巧吗?这似乎就是这里的区别。如果重要的话,我正在使用 MSVC 和 MSMPI,以及 Boost 1.62。
#include "boost/mpi.hpp"
#include "mpi.h"
int main()
{
MPI_Init(NULL, NULL);
MPI_Comm regional;
MPI_Comm_dup(MPI_COMM_WORLD, ®ional);
boost::mpi::communicator comm = boost::mpi::communicator(regional, boost::mpi::comm_attach);
if (comm.rank() == 1)
{
int q;
//VERSION A:
// MPI_Request n;
// int j = MPI_Irecv(&q, 1, MPI_INT, 1, 0, regional, &n);
// MPI_Cancel(&n);
// MPI_Request_free(&n);
//VERSION B:
// boost::mpi::request z = comm.irecv<int>(1, 0, q);
// z.cancel();
}
MPI_Comm_disconnect(®ional);
MPI_Finalize();
return 0;
}
我发现错误了吗?我怀疑我对代码很深。
【问题讨论】:
-
comm_duplicate 大大改善了这种情况,但您仍然应该能够做到这一点。
-
版本 B 在 Linux 和 boost 1.61 上返回没有问题。
-
@Shibli 很可能依赖于 MPI 实现。对于 OpenMPI 1.10,示例代码不会在此处阻塞。但是从 boost 源/MPI 标准很容易看出它是不正确的。