一個看似愚蠢的問題,但我似乎無法以某種方式找到確定的答案。我是否需要爲MPI :: Isend提供相應的MPI :: Irecv?
基本問題是我需要爲MPI :: Isend具有相應的MPI :: Irecv嗎?
也就是說,即使消息發送是非阻塞的,只要我在重新使用發送緩衝區之前等待發送完成,我是否需要使用非阻塞接收等待來接收發送的緩衝區?
我的觀點是,我想在發送消息時使用非阻塞發送來「做其他事情」,但接收器進程將立即使用緩衝區,所以我希望它們阻塞,直到真正接收到緩衝區。
看起來我應該能夠接收MPI :: Recv消息,即使它們是用MPI :: Isend發送的但我想知道如果我錯過了什麼嗎?
簡單的僞代碼有點
if(rank == 0){
int r;
for (int i = 0; i < n; i++){
// DO SOME STUFF HERE...
request.Wait(status);
request2.Wait(status);
request3.Wait(status);
r = i;
memcpy(key, fromKey(i), ...);
memcpy(trace, fromTrace(i), ...);
request = MPI::COMM_WORLD.Isend(&r, 1, MPI::INT, node, tag);
request2 = MPI::COMM_WORLD.Isend(key, 10, MPI::INT, node, tag);
request3 = MPI::COMM_WORLD.Isend(trace, nBytesTotal, MPI::BYTE, node, tag);
// DO SOME MORE STUFF HERE.
}
r = -1;
request = MPI::COMM_WORLD.Isend(&r, 1, MPI::INT, node, tag);
// Carry on ...
} else {
int r = -1;
MPI::COMM_WORLD.Recv(&r, 1, MPI::INT, 0, tag, status);
while(r >= 0){
MPI::COMM_WORLD.Recv(&key, 10, MPI::INT, 0, tag, status);
memcpy(saveKey, key, ...);
MPI::COMM_WORLD.Recv(&trace, nBytesTotal, MPI::BYTE, 0, tag, status);
memcpy(saveTrace, trace, ...);
MPI::COMM_WORLD.Recv(&r, 1, MPI::INT, 0, tag, status);
}
在這裏的答案可能會讓你感興趣:http://stackoverflow.com/questions/9408704/mpi-send-and-receive-questions –