已经完成的等待请求
Waiting requests which have been already completed
我正在尝试使用 boost mpi 库实现异步消息传递机制(检查点机制)。在我的代码中,接收者通过 irecv 等待来自其他人的消息。在 irecv 之后,他们不调用 wait 函数。相反,他们调用测试函数。如果测试成功,他们将处理收到的消息并启动新的 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中有一些关于测试函数的解释。它说
you should Note that once @c test() returns a @c status object, the request has completed and @c wait() should not be called.
其实我可以存储那些没通过测试功能的请求。然后,我可以只为这些请求调用等待函数。但是,我想知道是否可以有另一种更简单的解决方案来克服这个问题。
我能找到的唯一解决方案是存储无法通过测试函数的请求,然后使用 wait 或 boost 库的 wait_all 函数等待它们。
我正在尝试使用 boost mpi 库实现异步消息传递机制(检查点机制)。在我的代码中,接收者通过 irecv 等待来自其他人的消息。在 irecv 之后,他们不调用 wait 函数。相反,他们调用测试函数。如果测试成功,他们将处理收到的消息并启动新的 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中有一些关于测试函数的解释。它说
you should Note that once @c test() returns a @c status object, the request has completed and @c wait() should not be called.
其实我可以存储那些没通过测试功能的请求。然后,我可以只为这些请求调用等待函数。但是,我想知道是否可以有另一种更简单的解决方案来克服这个问题。
我能找到的唯一解决方案是存储无法通过测试函数的请求,然后使用 wait 或 boost 库的 wait_all 函数等待它们。