【问题标题】:Waiting requests which have been already completed等待已完成的请求
【发布时间】:2015-10-26 21:58:07
【问题描述】:

我正在尝试使用 boost mpi 库实现异步消息传递机制(检查点机制)。在我的代码中,接收者通过 irecv 等待来自其他人的消息。在 irecv 之后,它们不会调用等待函数。相反,他们调用测试函数。如果测试成功,他们将处理收到的消息并启动一个新的 irecv。否则,他们将前进到检查站。在检查点期间,他们使用等待功能等待所有传输中的消息完成。换句话说,检查点是稳定的同步点。

我在下面简化了我的代码,希望清楚:

接收方:

mpiReceiveRequest = RepastProcess::instance()->getCommunicator()->irecv(1, 100, receivedData);

for(int i=0; i<=20; i++){
    if(i%5 == 0){   // checkpoints
        while(true){
            mpiReceiveRequest.wait();
            if(receivedData > 0)
                mpiReceiveRequest = world.irecv(1, 100, receivedData);
            else
                break;
        }

    }

    else{
        if(mpiReceiveRequest.test()){
            if(receivedData > 0)
                mpiReceiveRequest = world.irecv(1, 100, receivedData);
        }
    }
}

发送方:

for(int i=0; i<=20; i++){
    int randomNumber = // select a random number between 1-20
    if(i > randomNumber)
        world.isend(0, 100, i);
    else
        world.isend(0, 100, -1);
}    

正如您在上面看到的,我必须为已完成的请求调用等待函数。我的意思是,我为已经成功测试的消息调用等待函数。现在,由于此调用,问题是分段错误。并且,在 boost::mpi api 中有一些关于测试功能的解释。它说

你应该注意一旦@c test() 返回一个@c 状态对象,请求已经完成并且不应该调用@c wait()。

实际上,我可以存储无法通过测试功能的请求。然后,我可以只为这些请求调用等待函数。但是,我想知道是否可以有另一个更简单的解决方案来克服这个问题。

【问题讨论】:

    标签: c++ boost mpi wait


    【解决方案1】:

    我能找到的唯一解决方案是存储无法通过测试函数的请求,然后使用 boost 库的 wait 或 wait_all 函数等待它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 2020-06-08
      • 2018-08-20
      相关资源
      最近更新 更多