2011-02-11 86 views
0

我想使用MPI並行化在我的代碼中多次調用的函數。我想知道的是,如果我在函數內部使用MPI_Init,每次函數調用時它會產生進程還是隻產生一次?是否有一些已知的設計模式以系統的方式來做到這一點?使用MPI並行化函數

+0

與MPI重新標記(如進程數通過-n參數mpiexec的或設置的mpirun),因爲這實在是一個關於MPI普遍質疑並非真正具體到MPICH2 –

+1

根據您的描述,您可能要考慮使用OpenMP而不是MPI。 –

回答

2

MPI_Init()調用只是初始化MPI環境,它本身並不進行任何並行化,並行性來自於你如何編寫程序。

一個並行的「Hello,World」,printf()根據它所運行的級別(處理器)做了不同的事情。的進程數是由你如何執行程序確定

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

     char name[BUFSIZ]; 
     int length=BUFSIZ; 
     int rank; 
     int numprocesses; 

     MPI_Init(&argc, &argv);  
     MPI_Comm_size(MPI_COMM_WORLD, &numprocesses); 
     MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
     MPI_Get_processor_name(name, &length); 

     printf("%s, Rank %d of %d: hello world\n", name, rank, numprocesses); 

     MPI_Finalize(); 

     return 0; 
} 
2

這不是真正的MPI(或分佈式內存編程)的工作方式;你不能像OpenMP那樣用一種函數來並行化一個函數。在MPI中,進程不是在MPI_Init()時產生的,而是在運行可執行文件時(例如,使用mpiexec;即使使用MPI_Comm_spawn()也是如此)。部分原因是在分佈式內存計算中,啓動進程對潛在的大量無共享節點是非常昂貴的任務。

可以湊齊一起的東西具有你調用是一個單獨的可執行文件的功能,但我不知道這就是你