我如何释放boost :: mpi :: request?

时间:2017-05-19 20:59:32

标签: c++ boost mpi

我试图让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, &regional);
    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(&regional);
    MPI_Finalize();
    return 0;
}

我找到了错误吗?我怀疑我是否深入代码。

1 个答案:

答案 0 :(得分:1)

嗯,如果它被记录在案,那就认为它不是一个错误:MPI_Request_free is unsupported by Boost.MPI

现在回到MPI本身:

  

调用MPI_CANCEL标记取消待处理的非阻塞通信操作(发送或接收)。取消电话是本地的。它可能会在通信实际取消之前立即返回。仍然需要使用已取消的请求调用MPI_REQUEST_FREEMPI_WAITMPI_TEST(或任何派生的操作)   调用MPI_CANCEL后的参数。 如果通讯被标记为取消,则无论其他进程的活动如何,都会保证MPI_WAIT对该通信的调用返回(即,MPI_WAIT表现为本地通信功能);

这意味着,只是:

z.cancel();
z.wait();

你应该没事。

现在,恕我直言,这是Boost.MPI正确RAII的一个坏浪费。