2014-03-26 80 views
0

我的程序非常大。所以,我不能在這裏列出。我的程序使用openMPI & mutiple_thread。vfork VS fork在MPI多線程中

的問題已經解決。 (使用vfork()而不是fork())但我不知道它爲什麼起作用。那麼,有誰能給我一個關於它的解釋嗎?

問題是由遊離引起的()。 我的程序中有一些代碼段。所有這些段都在由pthread_create創建的線程中。這些段的邏輯是這樣的:

{ 
    *p = malloc(); 
    fun(p); 
    free(p); 
} 

所有錯誤都在免費()。它報告段錯誤錯誤。我跑了100多次。我發現在每次免費腐敗之前總會有一個fork()被調用。

叉段的邏輯是等(線程):

{ 
    MPI_program_code... 
    if(!fork()) 
    { 
     execv(exe_file,arg); 
    } 
    MPI_program_code... 
} 

(注意,在exe_file不使用MPI_function。)

當我使用了vfork()而不是叉() ,根本沒有問題。但我不知道它爲什麼起作用。

所以,任何人都可以解釋爲什麼它的工作原理?

回答

2

您可能會發現在forking child processes非常有用的開放MPI FAQ主題。另外,爲什麼在InfiniBand上使用fork()有危險的解釋可參見here

vfork(2)fork(2)不同之處在於它是專門設計爲儘可能輕量,並且僅意在與立即以下execve(2)(或任何從C庫其包裝紙)或者_exit(2)呼叫一起使用。其原因是,vfork(2)創建一個子進程共享與母公司所有的記憶,而不是有它的寫入時複製映射,即新的子更像是一個線程不是像一個成熟的過程。由於孩子也使用原始線程的堆棧,父母被阻塞,直到孩子已經執行另一個可執行文件或退出。

打開MPI寄存器使用pthread_atfork()一個fork()處理程序。當在現代Linux系統上使用vfork()時,處理程序不會被調用,因此在分岔時父進程不採取任何操作。

+0

謝謝!我愛你的伴郎。你解決了我的問題兩次!我真的很感激。這個節目將在幾天後在天河2中運行。我真的很擔心它是否能夠運行在300,000核心規模。哈哈。我會盡我所能來做到這一點。 – user3392320

+0

從MPI級別分叉子進程通常是非常糟糕和不可移植的事情。我真的希望你有一個很好的理由。 –

+0

我真的不想在MPI中使用fork。但我的程序的主要目的是管理超級計算環境中的計算資源並在這些計算節點中分配作業。所以,我需要在MPI程序中分工。在MPI程序中是否有其他方法啓動進程? – user3392320