我有問題。假設我有np進程。對於每個進程,我基於輸入文件計算需要發送給其他進程的消息數量(從0到...),並且我想向他們發送這個數字。事情是我只能從我通過直接連接節點創建的拓撲發送。所以基本上我希望每個進程發送到所有其他人一個int,我有以下的算法(將使用僞代碼):MPI_Recv和超時
for(i=1,np){
if(i!=rankID){
MPI_Send(&nr,1,MPI_INT,topology[i][nexthop],DATA,MPI_COMM_WORLD);
MPI_SEND(&i,1,MPI_INT,topology[i][nexthop],DATA,MPI_COMM,WORLD); //i send the destination along with the int
}
}
while(1){
MPI_Recv(&recvInt,1,MPI_INT,MPI_ANY_SOURCE,DATA,MPI_COMM,WORLD);
MPI_Recv(&destination,MPI_INT,MPI_ANY_SOURCE,DATA,MPI_COMM,WORLD);
if(destination == rankID){
ireceive+=recvInt;
receivedFrom++;
//normally i would break if i received all np-1 messages but what if someone sends a message through me for another process ?
}
else{
MPI_Send(&recvInt,1,MPI_INT,topology[destination][nexthop],DATA,MPI_COMM_WORLD);
MPI_Send(&destination,1,MPI_INT,topology[destination][nexthop],DATA,MPI_COMM_WORLD);
}
}
我們解釋這個有點more.At這個小算法我想每年年底我的流程知道他們會在下一步中收到多少條消息。
要發送這個消息從每個節點到每個節點,我使用一個以前創建的路由表。基本上每個節點都有一個包含所有節點的矩陣,topology [node] [1] = next hop(這就是爲什麼我輸入代碼中的上述代碼)。
每個節點都知道有np進程,所以每個節點都必須接收np-1消息(他是目的地)。
我遇到的問題是,在收到np-1消息後,我無法打破,因爲我可能是其他進程的next_hop,並且消息不會被髮送。 所以我想要做這樣的事情,使用MPI_TEST或其他指令來查看我的Recv是否實際上正在接收某些東西,或者它只是坐在那裏,因爲如果程序阻塞了1-2秒,則很明顯它不會去接收更多(因爲我沒有一個大的拓撲20-30進程最大)。
問題是我從來沒有使用MPI_Test或其他語法,我不知道如何做到這一點。有人可以幫我創建一個Recv超時或如果有另一種解決方案?謝謝,對不起文本
你能破解你的文字嗎?我無法閱讀... – nhahtdh
好的,編輯過的文本 – user1272703