我正在尝试让 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;
}
我发现错误了吗?我怀疑我对代码的了解很深。
好吧,如果有记录的话,它猜测这不是一个错误:MPI_Request_freeBoost.MPI 不支持 http://www.boost.org/doc/libs/1_64_0/doc/html/mpi/tutorial.html#mpi.c_mapping.
现在回到 MPI 本身:
致电MPI_CANCEL
标记取消挂起的非阻塞通信操作(发送或接收)。取消呼叫是本地呼叫。它立即返回,可能在通信实际取消之前返回。还是需要打电话MPI_REQUEST_FREE
, MPI_WAIT
or MPI_TEST
(或任何派生操作),取消的请求为
调用后的参数MPI_CANCEL
. 如果通信被标记为取消,则MPI_WAIT
无论其他进程的活动如何,保证通信的调用都会返回 (i.e., MPI_WAIT
表现为本地函数);
这意味着,只需:
z.cancel();
z.wait();
你应该没问题。
现在,恕我直言,这是 Boost.MPI 对适当 RAII 的严重浪费。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)