2013-03-28 90 views
0

我一直在使用MPI一段時間,但我沒有經歷過。所以 我來這裏要問關於以下實現的一般結構的建議。 說,我有並行運行在MPI內的可執行文件在C++

MPI_Init(&narg,&arg); 
int me,nprocs; 
MPI_Comm_rank(MPI_COMM_WORLD,&me); 
MPI_Comm_size(MPI_COMM_WORLD,&nprocs); 

int N = 10; 

for (int i=0;i<N;i++) { 
    //(1)do some stuff in parallel... 
    //(2)gather results and write an input file for executable 

    MPI_Barrier(MPI_COMM_WORLD); 
    //(3)run executable in parallel. 
    // which is usually run from command line as: 
    // 
    // mpirun -np 6 external.exe < input.file 
    // 
    MPI_Barrier(MPI_COMM_WORLD); 

    //(4)gather output from executable, distribute info among processors and keep running 
} 
MPI_Finalize(); 

主要的C++文件,它是(3)在那裏我瞭解如何做到這一點,並告訴它多少個處理器可以使用一個問題。我的困惑還在於某種「運行」命令可能應該從單個處理器/實例中執行。那麼如何讓它工作並讓並行可執行文件使用提供給主程序的所有處理器?如果可能。

p/s /我在這裏看到類似的問題在stackoverflow,但沒有明確的答案,如果可能與否。

回答

0

您是否可以控制exe文件,也就是說,您是否可以更改其代碼?如果是這樣,我會建議重新開發它,這樣exe就只是你需要的行爲的一個包裝,然後你可以將實際行爲鏈接到你的應用程序中。

如果這不是一個選項,我建議只從你的主(等級0)進程調用可執行文件,並讓其他人等待。不是超級高效,但它會做的工作:

if (me == 0) { 
    system("mpirun -np 6 external.exe < input.file") 
} 

你必須想出一個辦法,以等待命令完成,但根據systemmpirun的文檔應該是簡單檢查system(...)的返回值是否爲零,然後繼續(在屏障後,如您的示例所示)。

+0

問題是,外部可執行文件能夠使用這6個處理器嗎?他的MPI_Init和主程序中調用的MPI_Init之間會不會有崩潰?或者從單個實例執行「mpirun」是否完全安全? – Denis 2013-03-28 13:03:57

+0

@Denis:從['mpirun'手冊頁](http://linux.die.net/man/1/mpirun)引用:*「mpirun」是一個shell腳本,它嘗試隱藏各種啓動作業的差異來自用戶的設備*。鑑於此,我認爲這樣可以。 如果你不確定,我建議你寫一個小型的試用版exe,然後自己去看看。如果遇到問題,首先爲主程序創建一個新的通信器,以免與外部exe中使用的通信器發生衝突(如果這會造成問題 - 我不知道「MPI_Initialize」的細節等等)。 – 2013-03-28 14:07:55

+0

感謝您的回覆,我會嘗試在一個小程序中檢查它,並標記答案,如果它工作... – Denis 2013-03-28 14:13:35