2012-01-03 88 views
0

當使用MPI在C/C++中編寫代碼時,如果在MPI_Init被調用之前分配內存,每個進程如何查看該內存?從測試程序中,我可以看出,有時候它是可以的,而其他的則不然。標準是否定義了這個?我無法分辨在MPI_Init期間內存分配是否被複制到其他進程,如果我只是幸運的,因爲所有進程都在單個(多核)CPU上「當前」。MPI內存分配

+0

在MPI_Init中不應複製。在調用MPI_Init之前,每個進程都分配相同的內存,所以每個人都應該能夠看到它,對吧? – milancurcic 2012-01-03 03:31:20

+0

我想這就是我不明白 - 爲MPI_Init,其他進程甚至存在嗎?如果不是,那麼在MPI_Init之前分配內存只會將內存分配給'master'(id = 0)進程? – Jess 2012-01-03 03:34:22

+0

是的。你可以通過編寫一個hello world程序來測試它,而不用調用MPI_Init,並且並行地執行它 - 你將產生n個獨立的進程,並且每個進程都會說「hello」。調用MPI_Init建立環境(MPI_Comm),它在流程之間創建鏈接並允許他們說出他們是誰(例如,我的ID是什麼?)。 – milancurcic 2012-01-03 03:37:36

回答

2

是的。每個進程都是在可執行的加載時產生的。如果在調用MPI_Init之前分配了任何內存,則每個進程都會知道該數據。但是,在調用MPI_Init之前,進程不知道自己或彼此。調用MPI_Init和MPI_Comm_world初始化MPI環境並返回MPI_Comm,它允許您在進程之間建立連接。

1

感謝IRO-bot!我寫了HelloWorld.cpp並測試了它;這裏是任何有興趣的人的副本。

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

int main(int argc, char* argv[]) 
{ 
    int numprocs; 
    int myid = 0; 
    std::cout << "Hello MPI World, from process " << myid << "!! " << std::endl; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs); 
    MPI_Comm_rank(MPI_COMM_WORLD, &myid); 

    if(myid == 0) 
     std::cout << std::endl; 

    std::cout << "Hello MPI World, from process " << myid << "!! " << std::endl; 

    MPI_Finalize(); 
    return 0; 
} 

示例輸出:程序mpiexec -n 4 HelloMPIWorld

你好MPI世界,從進程0! 你好MPI世界,從進程0! 你好MPI世界,從進程0! 你好MPI世界,從進程0!

Hello MPI World,from process 0 !! 你好MPI世界,從進程3! Hello MPI World,來自流程1! 你好MPI世界,從進程2!