2014-03-04 66 views
4

首先,我不是專業的程序員,但我必須爲我的項目編寫代碼(儘管我有一些熟練的C++和Python) 。當我陷入困境時,我經常來這裏,大多數時間都從這裏得到了很好的解決方案,但是現在我對MPI編程有了基本的問題,否則在我知道它的概念之前我不能真正進行下去。MPI新手 - 關於'mpirun'如何工作和過程管理的一些問題

這裏是我的問題描述,

我想對於一個科學計算的算法創建代碼。代碼可以分爲2部分。

A.)矩陣 - 向量乘法和矩陣的反演。這部分比較簡單,我甚至有自己的工作MPI代碼,這部分

B.)調用外部MPI-Ready計劃進行更復雜的計算(這部分也應該是簡單的,因爲它簡單地調用一個UNIX命令行)。

我遇到的問題是如何將這兩個部分連接在一起?我的算法是這樣的,

for k in specified range 
    dividing a state vector of size 6NMx1 into M blocks, let each of M nodes handle these. 
    Manipulate a state vector of size 6NMx1 according to A.) in parallel 
    After A.) is done, run B.) using M nodes in parallel /* THIS IS WHERE I GOT STUCK */ 
    Update state vector 
end for 

要運行B.),我必須使用的mpirun調用UNIX命令,

mpirun -np #PPN my_app > some_output 

的問題我已經是,

  1. 'mpirun'是如何運作的?通話時是否產生新的程序?假設我使用M個集羣計算節點,並且每個節點有16個處理器,如果我僅使用1個節點進程調用上述UNIX命令,它是否會生成16個更多的進程?如果是這樣,我將最終以256M進程運行,我是否正確?我的主要目標是使用每個計算節點處理系統向量中的塊(塊是獨立的,大小爲6Nx1),並將使用來自每個塊的數字作爲B的輸入。)我正在處理集羣,所以當我提交我的作業時,我必須事先定義好多個節點,並且我嚴格要求每個節點也在B)之後並行運行B.)完成後。是否有關於如何使用MPI執行此操作的建議?有人告訴我,寫單獨代碼A.)和B),並使用python腳本在頂層控制他們,所以它應該看起來像..

Python腳本:

for k in specified range 
    mpirun A.) --> This is straightforward for me 
    mpirun B.) 
end for 

爲僞B.)

/* THIS PROGRAM SHOULD HAVE 16M PROCESSES */ 
if rank % 16 == 0 
    mpirun -np 16 my_app > output 
end if 
/* I WANT M CALLS TO THIS PROGRAM IN PARALLEL */ 
MPI_COMM.BARRIER 

你覺得這個計劃將使用16M並行處理爲B.)?如果有更好的方法來實現B.)比這更好,或者更好,將它包裝在與A相同的代碼中),請給我建議!

3.)這是我的原型代碼,所以我並不在乎效率。我只是需要它的工作,我會在晚些時候關心優化。

如果我的描述很混亂,請問我,我會回來澄清。感謝您的時間,我非常感謝您的幫助! :)

回答

2

Mpirun只是一個命令,可以在選項命令行中運行所需的作業數量,它可能會檢測到您擁有和使用的機器類型。

回答第二個問題很複雜,因爲如果您正在使用具有多個節點的羣集,則應該使用專用協議。

// number of proc on one node 
#SBATCH -n 2 
// number of node 
#SBATCH -N 4 

run ./a.out 

這意味着你將在4個節點運行程序與每個節點上的2個特效:例如,用SLURM你通過sbatch協議,它像運行程序。

我真的不知道下面的原因,這對我來說有點混亂,但也許你應該重新考慮一下你的問題。如果您在節點內工作,則不需要MPI,但應該使用openMP。

如果您正在非共享內存中工作,則需要使用MPI,而非非共享內存。

我希望它能幫助你的工作。

+0

謝謝你的建議。是的,我的集羣使用SLURM調度程序。這是否意味着我實際上必須在.msub文件中運行程序時精確指定處理器和節點的數量?所以,真的,我需要寫一個.msub文件,而不是直接在第二個代碼中引用我的程序嗎? – KhunWasut

+0

嘿。是的,如果你使用SLURM,你只需要編寫一個腳本來運行你的程序並指定你需要的程序和節點。但可能需要在代碼中添加一些配置,具體取決於您運行程序的多少個proc和節點(如果它不是通用的)。以下是關於SLURM的一些信息,也許你可以找到一些答案: – user3018144

+0

網站:http://slurm.schedmd.com - 快速介紹SLURM:https://computing.llnl.gov/tutorials/slurm/slurm.pdf – user3018144