gpt4 book ai didi

c++ - 如何释放 boost::mpi::request?

转载 作者:行者123 更新时间:2023-11-30 05:13:08 24 4
gpt4 key购买 nike

我正在尝试让 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, &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;
}

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

最佳答案

好吧,如果记录在案,它猜想这不是错误:MPI_Request_free is unsupported by Boost.MPI .

现在回到 MPI 本身:

A call to MPI_CANCEL marks for cancellation a pending, nonblocking communication operation (send or receive). The cancel call is local. It returns immediately, possibly before the communication is actually cancelled. It is still necessary to call MPI_REQUEST_FREE, MPI_WAIT or MPI_TEST (or any of the derived operations) with the cancelled request as argument after the call to MPI_CANCEL. If a communication is marked for cancellation, then a MPI_WAIT call for that communication is guaranteed to return, irrespective of the activities of other processes (i.e., MPI_WAIT behaves as a local function);

这意味着,只是:

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

你应该没问题。

现在,恕我直言,这是对 Boost.MPI 适当 RAII 的严重浪费。

关于c++ - 如何释放 boost::mpi::request?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44078901/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com