2017-05-31 90 views
0

我對MPI點對點阻塞模式有點困惑。
現在我有以下代碼。
MPI:點對點阻塞(MPI_Send&MPI_Recv)

y = id; 
j = id - 1; 
if(j<0) j = p -1; 

k = id + 1; 
if(k>p-1) k = 0; 

MPI_Recv(&x, 1, MPI_INT, k, 0, MPI_COMM_WORLD, &status); 
MPI_Send(&y, 1, MPI_INT, j, 0, MPI_COMM_WORLD); 

z = x + y; 

這將被封鎖作爲MPI_RECV是一個阻塞函數,但是當我更改順序調用MPI_SEND第一一切正常的話,我不知道原因。
提前致謝,並對我的英語感到抱歉。

回答

2

MPI_Send()阻塞,直到發送緩衝區可以重新使用。

從實際的角度來看,MPI_Send()立即返回,如果消息足夠短,否則阻塞,直到發佈匹配的MPI_Recv()。 這是一個普遍的行爲,但你不應該依賴那個。

在這種情況下

,最好的選擇是使用單一MPI_Sendrecv()調用,而不是兩個阻塞發送/ recv的調用

的另一種選擇是 MPI_Irecv(); MPI_Send(); MPI_Wait();

+0

現在好了,爲什麼會在程序運行正常,未當我更改訂單時被阻止,並且MPI_Send可以立即返回 – AHM200

+0

,如果您先MPI_Recv(),您的程序將永久掛起。如果你首先使用MPI_Send(),並且消息足夠短,那麼它被髮送,並且匹配的MPI_Recv()將完成。 有意義嗎? –

+0

是的,謝謝。 – AHM200