[英]How do I free a boost::mpi::request?
我正在嘗試讓 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;
}
我發現了一個錯誤嗎? 我懷疑我是否深入了解代碼。
好吧,如果有記錄,它猜測它不是錯誤: Boost.MPI 不支持MPI_Request_free
。
現在回到 MPI 本身:
對
MPI_CANCEL
的調用標記取消掛起的、非阻塞的通信操作(發送或接收)。 取消呼叫是本地的。 它立即返回,可能在實際取消通信之前。 仍然需要調用MPI_REQUEST_FREE
,MPI_WAIT
或MPI_TEST
(或任何派生的操作)與作為參數調用后的取消請求MPI_CANCEL
。 如果一個通信被標記為取消,那么該通信的MPI_WAIT
調用肯定會返回,而不管其他進程的活動(即MPI_WAIT
表現為本地函數);
這意味着,只需:
z.cancel();
z.wait();
你應該沒事的。
現在,恕我直言,這是 Boost.MPI 對適當 RAII 的嚴重浪費。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.