1
以下是源代碼實現的輸出,如下所示。我不確定它是什麼意思,我應該如何補救代碼。MPI_Wait中的致命錯誤
aborting job:
Fatal error in MPI_Wait: Invalid MPI_Request, error stack:
MPI_Wait(139): MPI_Wait(request=0xffffd6a4, status0xffffd690) failed
MPI_Wait(75) : Invalid MPI_Request
rank 0 in job 1 <processor #) caused collective abort of all ranks
exit status of rank 0: return code 13
源代碼如下:
#define Rows 48
...
double *northedge1 = new double[Rows];
double *northofnorthedge3 = new double[Rows];
...
...
int main (int argc, char *argv[])
{
....
....
MPI_Request send_request, recv_request;
...
...
if ((my_rank) == 1)
{
MPI_Isend(northedge1, Rows, MPI_DOUBLE, my_rank+2, 0, MPI_COMM_WORLD, &send_request);
}
if ((my_rank) == 3)
{
MPI_Irecv(northofnorthedge3, Rows, MPI_DOUBLE, my_rank-2, MPI_ANY_TAG, MPI_COMM_WORLD,
&send_request);
}
MPI_Wait(&send_request, &status);
.....
MPI_Finalize()
喬納森:謝謝。我解決了這個問題,但是我注意到當我在一個帶有MPI_Wait的「if」語句中執行多個MPI_Isend和MPI_Irecv時,只有最後一個MPI_Irecv似乎執行OK。我的問題是,我必須查看Send/Recv命令的順序還是每個MPI_Recv後面都應該跟着一個MPI_Wait命令?謝謝! – Ashmohan 2011-05-18 01:05:30
是的,你不能接收(或發送,或兩者)到相同的請求;請求就像是待處理通信的跟蹤號碼,您不想覆蓋任何。如果你有幾個未決的請求,你最好在數組中有幾個MPI_Requests和狀態(例如'MPI_Request reqs [5]; MPI_Status stats [5];'),然後一次一個地使用它們('MPI_Isend(...,reqs [0]); MPI_Irecv(...,reqs [1]); ...'),然後使用'MPI_Waitall(5,reqs,stats)')等待所有其中。如果你想循環並一次處理它們,有一個Wait_any。 – 2011-05-18 02:39:12
Jonathan:我嘗試了你的建議,並且包含了查詢的鏈接。我無法在這裏發佈代碼摘錄。我注意到並非所有我希望得到的信息都能通過。我只是想確保我沒有忽略語法或代碼設置的方式。您的意見將非常感謝。謝謝! –
Ashmohan
2011-05-19 00:20:46