MPI_Isend:如何在收到数据之前保持数据安全?

时间:2016-10-20 15:07:15

标签: c++ parallel-processing mpi sendasynchronousrequest

我要使用MPI_Isend发送许多消息,但我不确定如何确保我的数据在收到之前是安全的,同时不要用尽所有可用的内存。< / p>

目前,我正在做这样的事情:

vector<int*> outbox;
vector<MPI_Request> stats;

void run()
{
   while (!done()) 
   {
       //some magic
       //...

       sendMsg(rand(), getRecipRank());
  }
}

void sendMsg(int n, int recipRank)
{
    //Need to gen n random integers and send it to proc with rank recipRank
    //Can't block until the numbers are reveived. 
    //So how do I make sure these numbers are safe until then?


    int* data = (int*)malloc(sizeof(int) * n);
    //fill the data array with random numbers here

    MPI_Request req;
    MPI_Isend(data, n, MPI_INT, recipRank, 0, MPI_COMM_WORLD, &req);

    //Keeping the pointer to the array to free it later
    outbox.push_back(data); //Does this help keep the data safe until they're received?
    stats.push_back(req);
}

然后我有另一个函数,偶尔会通过stats向量来检查发送的状态。如果完成,则该函数释放outbox中的请求和相应数组。

我用少量消息对此进行了测试,似乎有效,但我不确定它是否总是工作还是我很幸运。

2 个答案:

答案 0 :(得分:2)

看起来不错!如果你使用malloc分配内存,没有人会把它搞乱,但是你。既然你不惹麻烦,那就安全了。

这是一种利用更多内存来交错计算和通信的好模式。如果要对内存使用量设置限制,可以为向量outbox强加最大长度,并在达到该长度时开始使用阻塞发送。

只是为了澄清:您的数据不是更安全&#34;,因为您将其推入向量outbox,即使不这样做也会安全。你将它推入向量中以便以后可以释放它。

答案 1 :(得分:0)

这很好,但你甚至不需要求助于C - malloc

您可以安全地使用C ++构造,如:

    {li> new[] std::vector<int*> 中的指针
  • std::vector<std::unique_ptr<int[]>>(在您的情况下,我更喜欢这种情况)
  • std::vector::data()向量中的向量。但是要确保在请求完成之前不要在提供内存调用的向量上调用任何非const方法。

使用std::vector<int[10]> outboxstd::vector<std::array<int, 10>> outbox是安全的,因为此内存将直接在发件箱内容中引用,可能会进一步重新分配(调整大小)致电push_back。但这只对编译时已知的n很重要。 std::vector<std::unique_ptr<std::array<int, 10>>>再好了。