2014-04-23 46 views
2

這是我的代碼:簡單的MPI程序失敗,大量的進程

#include "mpi.h" 
#include <stdio.h> 

int main (int argc, char** argv) { 

    int numtasks, rank; 

    MPI_Init(&argc,&argv); 

    MPI_Comm_size(MPI_COMM_WORLD,&numtasks); 
    MPI_Comm_rank(MPI_COMM_WORLD,&rank); 
    // the code fail with or without printf 
    printf ("Number of tasks= %d My rank= %d\n", numtasks,rank); 

    MPI_Barrier(MPI_COMM_WORLD); 
    MPI_Finalize(); 
    return 0; 
} 

這就是我如何運行它,並輸出:

$ mpirun -n 160 ./mpi_example1 
[proxy:0:[email protected]] send_cmd_downstream (./pm/pmiserv/pmip_pmi_v1.c:80): assert (!closed) failed 
[proxy:0:[email protected]] fn_get (./pm/pmiserv/pmip_pmi_v1.c:349): error sending PMI response 
[proxy:0:[email protected]] pmi_cb (./pm/pmiserv/pmip_cb.c:327): PMI handler returned error 
[proxy:0:[email protected]] HYDT_dmxu_poll_wait_for_event (./tools/demux/demux_poll.c:77): callback returned error status 
[proxy:0:[email protected]] main (./pm/pmiserv/pmip.c:226): demux engine error waiting for event 
[[email protected]] control_cb (./pm/pmiserv/pmiserv_cb.c:215): assert (!closed) failed 
[[email protected]] HYDT_dmxu_poll_wait_for_event (./tools/demux/demux_poll.c:77): callback returned error status 
[[email protected]] HYD_pmci_wait_for_completion (./pm/pmiserv/pmiserv_pmci.c:181): error waiting for event 
[[email protected]] main (./ui/mpich/mpiexec.c:405): process manager error waiting for completion 

當我運行-n代碼128或更低,它工作正常。我也嘗試在32核心x 8節點計算機上運行代碼,並且能夠運行高達-n 192,當我嘗試-n 224時它失敗...

任何建議?謝謝。

+0

我相信,你的根進程(等級0)在所有其他人都正常開始之前退出。在MPI_Finalize();之前添加'MPI_Barrier(MPI_COMM_WORLD);'應該修復它,如果是這樣的話。你能試試嗎? –

+0

謝謝我會嘗試並儘快回覆! – Phuocdh90

+0

@Nominal動物可悲的是,我嘗試了你所建議的方法,但同樣的錯誤發生...... :( – Phuocdh90

回答

1

該問題可能與shell可以產生的最大進程數有關。如何修改此設置取決於外殼的類型和操作系統。如果您使用的是cshell或tcshell,則可以使用公共行「限制」命令驗證當前設置。更改設置可以在用戶級別或根級別完成(同時存在軟限制和硬限制)。

+0

我在ubuntu終端上嘗試了ulimit -n 2048,並且它似乎是命令本身的作品(因爲我試圖ulimit -n 256並且程序無法運行與-n 128,錯誤代碼是「打開文件限制」),但問題不是s olved ... – Phuocdh90

+0

然後,您可能還需要修改文件描述符的最大數目設置:嘗試類似於(對於c和tc shell)限制描述符24576. –

+0

我也希望這是問題,但我必須在超級計算機在我的學校,我只允許在計算機上使用一些命令(因爲我的教授不希望學生對計算機造成任何損害)。他只是說當我問他這個問題時代碼應該在電腦上工作。我完全失去了...... – Phuocdh90

0

這不是一個確定的答案,但它的方式太長了評論。

我看了一下失敗斷言的來源。 codebase略有不同,但我認爲它足夠接近。你的錯誤說斷言失敗的線80,而here,斷言HYDU_ASSERT(!closed, status);在於管線82

違規的通話位於線77:

status = HYDU_sock_write(fd, cmd, strlen(cmd), &sent, &closed, HYDU_SOCK_COMM_MSGWAIT);

現在,HYDU_sock_write代碼表示, closed標誌將被設置並且該功能將中止操作時

write(fd, (char *) buf + *sent, maxlen - *sent); @line 278失敗errno == ECONNRESET

現在this文檔write說:「[ECONNRESET] 寫試圖在未連接的插座上。」

你確定網絡工作正常嗎?看起來套接字斷開連接。

+0

上面的錯誤是在Ubuntu VMWare(2個處理器,每個2個核心)上運行代碼,而不是在32核心x 8個節點的超級計算機上運行。這與問題有關嗎?因爲我不明白網絡如何導致問題。 – Phuocdh90

+0

而且,當我運行的進程數量較少(128和計算機上的波紋管)代碼時,無論我運行多少次代碼,它總是正確執行... – Phuocdh90

+0

對我來說,看起來像系統/硬件錯誤。我不知道爲什麼套接字會斷開連接,但看起來這是程序失敗的根源。我不確定什麼會導致'ECONNRESET'。也許你可以問一些關於九頭蛇開發者論壇/列表的專家。畢竟它是失敗的九頭蛇呼叫。 – luk32