2011-05-17 33 views
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() 

回答

2

它看起來像你甚至從等級0調用MPI_WAIT(),即使你只是在做非阻塞通信在等級1和3。因此,有等級0沒有有效的send_request,所以MPI_Wait無效。在上面,看起來你應該有

if ((my_rank == 1) || (my_rank == 3)) 
     MPI_Wait(&send_request, &status); 
+0

喬納森:謝謝。我解決了這個問題,但是我注意到當我在一個帶有MPI_Wait的「if」語句中執行多個MPI_Isend和MPI_Irecv時,只有最後一個MPI_Irecv似乎執行OK。我的問題是,我必須查看Send/Recv命令的順序還是每個MPI_Recv後面都應該跟着一個MPI_Wait命令?謝謝! – Ashmohan 2011-05-18 01:05:30

+1

是的,你不能接收(或發送,或兩者)到相同的請求;請求就像是待處理通信的跟蹤號碼,您不想覆蓋任何。如果你有幾個未決的請求,你最好在數組中有幾個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

+0

Jonathan:我嘗試了你的建議,並且包含了查詢的鏈接。我無法在這裏發佈代碼摘錄。我注意到並非所有我希望得到的信息都能通過。我只是想確保我沒有忽略語法或代碼設置的方式。您的意見將非常感謝。謝謝! – Ashmohan 2011-05-19 00:20:46