[問題] MPI 相關,執行緒失蹤

看板C_and_CPP作者 ( )時間9年前 (2014/08/06 23:58), 9年前編輯推噓1(105)
留言6則, 2人參與, 最新討論串1/1
開發平台(Platform): gcc 4.1.2 / mpich 1.2.7p1 問題(Question): 雖然程式是以 C 寫成,但問題與 MPI 較相關聯,如不妥於此發問,煩請告知。 程式於單一核心執行時並無問題(使用 gcc 編譯並執行,或使用 mpicc 編譯並 只使用一個核心執行,此兩種情況)。但當使用兩個以上的核心執行時,在其中 一個 while 迴圈運行時,中途會發生其中一個指定的核心消失,導致於迴圈中 用於資料傳輸的 MPI_Wait 等不到訊息而卡住。 程式碼(Code):(請善用置底文網頁, 記得排版) 由於程式用途為數值模擬,有點繁雜,所以這裡僅列出(或許是)重點部份並簡化。 i = 1; while (statement) { printf ("Processor %d starts iteration %d\n", Rank, i); fflush (stdout); transfer data via MPI_Isend / MPI_Irecv / MPI_Wait call some subroutines and do jobs i += 1; printf ("Processor %d ends iteration %d\n", Rank, i); fflush (stdout); } 其中迴圈內頭尾訊息輸出為除錯用,Rank 為使用 MPI_Comm_rank 得到的值。 假設使用(同節點的)兩個核心執行時,程式最後輸出訊息為 Processor 0 starts iteration 275 Processor 1 starts iteration 275 Processor 1 ends iteration 275 Processor 0 ends iteration 275 Processor 0 starts iteration 276 但一直沒出現 Processor 1 執行第 276 次迴圈的訊息(幾天時間),也因此 整個程式於核心間的資料傳輸過程中卡住,無法繼續運行。 不知版上各位對於這個問題,有無朝哪方向著手除錯的想法/建議? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.114.94.74 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1407340706.A.215.html

08/07 02:58, , 1F
讓行程定期寫入檔案,說自己進入/離開哪個 函式/行數
08/07 02:58, 1F

08/07 03:00, , 2F
用signal,收SIGQUIT,SIGTERM,SIGINT
08/07 03:00, 2F

08/07 03:02, , 3F
收到訊息印一下前一刻他還在哪行這樣
08/07 03:02, 3F

08/07 03:07, , 4F
也許ENOMEM,EPIPE...你的程式要檢查每個MPI的回傳值
08/07 03:07, 4F

08/07 16:53, , 5F
感覺是存取違規才發生當中一個點中斷結束,你要不要檢查一下
08/07 16:53, 5F

08/07 16:54, , 6F
你的資料切割範圍
08/07 16:54, 6F
感謝兩位的建議,後來繼續檢查時想到另一種可能性(也是問題所在)。 問題點在於因為邏輯錯誤造成 while 迴圈的控制變數的增加量,並沒有 正確地(使用 MPI_Allreduce)傳給各核心,也使得其中一核心提早結束 迴圈。間接產生失蹤的錯覺...XD ※ 編輯: GeoMeTric (140.114.94.74), 08/08/2014 06:16:25
文章代碼(AID): #1Jub2Y8L (C_and_CPP)