[英]Does a mpi request finish if recv and send is matched
僅從兩個匹配的非阻塞發送和接收操作中檢查一個請求對象就足夠了。
這將是很棒的,因為這將減少處理程序中請求對象的工作量。
這是一個帶有boost mpi的小例子:
#include <boost/mpi.hpp>
int main(int argc, char* argv[]) {
// initialize mpi
mpi::environment env(argc, argv);
boost::mpi::communicator world;
boost::mpi::request req0, req1;
double blub;
if(world.rank()==1)
req1 = world.irecv(0, 23, blub);
if(world.rank()==0)
req0 = world.isend(0, 23, blub);
//now I want to synchronize the processors is this enough?
req0.wait();
//or do I also need this line
req1.wait();
}
等級1沒有有效的req0
,等級0沒有有效的req1
; 它們是僅對實際執行非阻塞操作的任務有效的請求(並已返回請求的句柄)。
因此,沒有,這里的排名都不需要(甚至不能)等待兩個請求。 每個調用一個等待它所擁有的請求,例如
if(world.rank()==0)
req0.wait();
if(world.rank()==1)
req1.wait();
或者,更好(我假設等級0的isend應該去等級1,而不是0):
boost::mpi::request req;
...
if(world.rank()==1)
req = world.irecv(0, 23, blub);
if(world.rank()==0)
req = world.isend(1, 23, blub);
if (world.rank() == 0 || world.rank() == 1)
req.wait();
請注意,當您確實需要等待與多個請求相對應的多個操作時,可以獲取請求列表並調用wait_all 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.