2012-07-27 256 views
2

假設我有一些代碼,看起來像這樣:我調用MPI_Init()後會發生什麼?

#include "mpi.h" 

int main(int argc, char** argv) 
{ 
    int my_array[10]; 
    //fill the array with some data 

    MPI_Init(&argc, &argv); 

    // Some code here 

    MPI_Finalize(); 
    return 0; 
} 

每個MPI實例將獲得自己的my_array的副本?只有0級?他們都沒有?在MPI_Init之前有任何代碼是不好的做法嗎?

回答

2

當你運行mpi代碼時,你在不同的進程中運行相同的代碼(它們不能共享內存),所以每個進程都有自己的數組。

數組應該是相等的,除非你的數據取決於時間(進程不一定是同步的),進程級別(我認爲等級只在init調用後可用)或任何隨機數發生器(有些可能會產生隨機數種子)。

6

「我撥打MPI_Init時發生什麼事情」的簡短答案是:什麼都沒有。

MPI_Init初始化調用過程中的MPI庫。沒有更多,沒有更多。在調用MPI_Init時,所有的MPI進程已經存在,它們只是不瞭解對方,並且不能進行通信。

每個MPI過程是一個單獨執行的程序。這些進程不共享內存,並通過傳遞消息進行通信。

事實上,調用MPI_Init的進程甚至可以完全是不同的程序,只要它們傳遞的消息匹配即可。這是MPMD模型。

+0

您能否介紹有關動態進程管理的文檔,以及可能的一些好的示例代碼? – rudolph9 2012-07-28 04:06:48

+1

MPI中的動態過程管理非常有限。主要的限制是溝通者一旦創建就不能改變。所以一旦'MPI_Init'爲最初的一組進程創建'MPI_COMM_WORLD',就不可能再添加更多的進程。您可以使用[MPI_Comm_spawn](http://www.mpi-forum.org/docs/mpi22-report/node203.htm#Node203)創建一組新進程。新進程獲得了自己的'MPI_COMM_WORLD'和一個[intercommunicator](http://www.mpi-forum.org/docs/mpi22-report/node143.htm#Node143)鏈接這兩個世界。 – 2012-07-28 04:19:56

+2

對於內存來說這是正確的,但你應該小心你在'MPI_Init'之前做的事情。一些實現可能會在'MPI_Init'中分叉進程,或者做任何魔法來設置他們的進程。例如。 [MPICH文檔](http://www.mcs.anl.gov/research/projects/mpi/www/www/MPI_Init.html)建議不要在'MPI_Init'之前修改外部狀態。當有疑問時,在'MPI_Init'之後執行# – Zulan 2012-08-02 08:15:17

相關問題