首先,我不是專業的程序員,但我必須爲我的項目編寫代碼(儘管我有一些熟練的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
的問題我已經是,
'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.)這是我的原型代碼,所以我並不在乎效率。我只是需要它的工作,我會在晚些時候關心優化。
如果我的描述很混亂,請問我,我會回來澄清。感謝您的時間,我非常感謝您的幫助! :)
謝謝你的建議。是的,我的集羣使用SLURM調度程序。這是否意味着我實際上必須在.msub文件中運行程序時精確指定處理器和節點的數量?所以,真的,我需要寫一個.msub文件,而不是直接在第二個代碼中引用我的程序嗎? – KhunWasut
嘿。是的,如果你使用SLURM,你只需要編寫一個腳本來運行你的程序並指定你需要的程序和節點。但可能需要在代碼中添加一些配置,具體取決於您運行程序的多少個proc和節點(如果它不是通用的)。以下是關於SLURM的一些信息,也許你可以找到一些答案: – user3018144
網站:http://slurm.schedmd.com - 快速介紹SLURM:https://computing.llnl.gov/tutorials/slurm/slurm.pdf – user3018144