簡體   English   中英

如何釋放 boost::mpi::request?

[英]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, &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;
}

我發現了一個錯誤嗎? 我懷疑我是否深入了解代碼。

好吧,如果有記錄,它猜測它不是錯誤: Boost.MPI 不支持MPI_Request_free

現在回到 MPI 本身:

MPI_CANCEL的調用標記取消掛起的、非阻塞的通信操作(發送或接收)。 取消呼叫是本地的。 它立即返回,可能在實際取消通信之前。 仍然需要調用MPI_REQUEST_FREEMPI_WAITMPI_TEST (或任何派生的操作)與作為參數調用后的取消請求MPI_CANCEL 如果一個通信被標記為取消,那么該通信的MPI_WAIT調用肯定會返回,而不管其他進程的活動(即MPI_WAIT表現為本地函數);

這意味着,只需:

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

你應該沒事的。

現在,恕我直言,這是 Boost.MPI 對適當 RAII 的嚴重浪費。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM