我试图让MPI断开通信器,这是一个非常棘手的业务 - 我已经在下面放了一个演示。我有两个版本相同的想法,听一个int,一个使用MPI_IRecv,一个使用boost :: mpi :: request。
当您在此程序中使用mpiexec -n 2时,您会注意到版本A将很高兴断开并退出,但版本B不会。 MPI_Request_free一个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;
}
我找到了错误吗?我怀疑我是否深入代码。
答案 0 :(得分:1)
嗯,如果它被记录在案,那就认为它不是一个错误:MPI_Request_free
is unsupported by Boost.MPI。
现在回到MPI本身:
调用
MPI_CANCEL
标记取消待处理的非阻塞通信操作(发送或接收)。取消电话是本地的。它可能会在通信实际取消之前立即返回。仍然需要使用已取消的请求调用MPI_REQUEST_FREE
,MPI_WAIT
或MPI_TEST
(或任何派生的操作) 调用MPI_CANCEL
后的参数。 如果通讯被标记为取消,则无论其他进程的活动如何,都会保证MPI_WAIT
对该通信的调用返回(即,MPI_WAIT
表现为本地通信功能);
这意味着,只是:
z.cancel();
z.wait();
你应该没事。
现在,恕我直言,这是Boost.MPI正确RAII的一个坏浪费。