2012-11-09 52 views
0

後,但是我注意到只有根(recieving方繼續運行?)。前後SENDRECV產生具有cout其他進程掛我認爲使用<code>MPI_Sendrecv</code></p> <pre><code>MPI_Sendrecv(&ballPos, 2, MPI_INT, FIELD, NEW_BALL_POS_TAG, &ballPos, 2, MPI_INT, winner, NEW_BALL_POS_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); </code></pre> <p>MPI_Sendrecv

0 b4 sendrecv 
2 b4 sendrecv 
4 b4 sendrecv 
1 b4 sendrecv 
3 b4 sendrecv 
5 b4 sendrecv 
0 after sendrecv 

所有進程SENDRECV前行,但只有根事後疏導。

Full source:參見線147

UPDATE

結果應該是類似於下面

if (rank == winner) { 
    ballPos[0] = rand() % 128; 
    ballPos[1] = rand() % 64; 
    cout << "new ball pos: " << ballPos[0] << " " << ballPos[1] << endl; 
    MPI_Send(&ballPos, 2, MPI_INT, FIELD, NEW_BALL_POS_TAG, MPI_COMM_WORLD); 
} else if (rank == FIELD) { 
    MPI_Recv(&ballPos, 2, MPI_INT, winner, NEW_BALL_POS_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
} 

回答

1

的發送發佈的數目應等於數量的接收事發布。在你情況下,所有隊伍都發送到排名FIELD和排名winner接收,包括FIELDwinner

Rank  Sends to Receives from 
---------------------------------- 
0 (FIELD) FIELD  winner 
1   FIELD  winner 
2   FIELD  winner 
...  ...  ... 
winner  FIELD  winner 
...  ...  ... 
numprocs-1 FIELD  winner 

(如表可能是有時非常有用)

因此FIELD應該只接收numprocs消息,但它執行MPI_Sendrecv一次,因此numprocs-1調用MPI_Sendrecv將無法​​完成其發送。 winner也是如此。它應該發送numprocs消息,但由於它只執行MPI_Sendrecv一次,只發送一條消息,因此numprocs-1調用MPI_Sendrecv將無法​​完成其接收。

還有一個錯誤。 MPI標準要求發送緩衝區和接收緩衝區不相交(即它們不應該重疊),這與代碼不同。您的發送和接收緩衝區不僅重疊,而且它們是同一個緩衝區。如果要在同一緩衝區中執行交換,MPI將提供MPI_Sendrecv_replace操作。

我不確定你在用這個MPI_Sendrecv聲明試圖實現什麼,但我強烈懷疑你需要將它放在if聲明中。

+0

我更新了我期望發生的qn(單獨發送和接聽電話)。也許你可以建議一個相應的'Sendrecv'調用是什麼樣的? –

+0

@JiewMeng嗯,你不需要執行發送接收。您的原始代碼與單獨的發送和接收應該工作正常(也見[你的其他問題](http://stackoverflow.com/q/13307056/1374437)爲什麼你的推定,它不工作是錯誤的)。 –

+0

我真的認爲如果我可以將單獨的send/recv代碼縮短爲1 sendrecv,那會更好。或者也很高興知道這個等價物。我在想如果我可以在單獨的send/recv中編程,我應該可以使用1 sendrecv嗎? –

相關問題