MPICH2簡單的安裝配置總結
MPICH2是MPI()的一個應用實現,支援最新的MPI-2介面標準,是用於並行運算的工具,在程式設計語言上支援C/C++和Fortran。最近因為有專案需要的計算量比較大,所以就學習使用了MPICH2,在此根據網路上查詢的相關資訊和我自己的實際使用經歷,分別總結一下MPICH2在windows和linux下基本的安裝使用方法。
軟體下載
MPICH2的主頁是,在這個頁面上就能找到各平臺最新版本MPICH2的下載地址,其中還包括原始碼,我在開始作這個專案的時候最新版本是windows版mpich2-1.0.5p2,原始碼mpich2-1.0.5p4。我們的專案是一個CentOS版linux下的程式,所以最終是要在
文件下載
Windows下的安裝配置
我用的參與計算的系統都是WindowsXP Pro SP2,安裝的過程沒什麼太特別的,一般就是預設就可以,只是其中有個地方要填一個什麼passphrase,上面提示說所有系統都要用相同的passphrase,照做就是了,在所有參與計算的結點機器上都填一樣的passphrase就好了。另外就是需要.net framework 2的執行環境。
預設安裝的位置是C:/Program Files/MPICH2,下面的bin目錄下是系統配置執行需要的程式,為了方便在控制檯使用,可以把C:/Program Files/MPICH2/bin加到系統的PATH變數中去。Include是標頭檔案,開發的時候用,lib是連結程式的時候用的庫檔案。Jumpshot下有個pdf的文件,幹什麼用的可以看看這個文件,我沒仔細看,感覺我暫時還用不上。Examples下面是一個樣本程式,就是一個用MPI計算圓周率的程式,分別有C,C++和Fortran版,C/C++的應該可以用VS2003以上版本開啟。同時,安裝程式還會自動向系統註冊一個服務MPICH2 Process Manager,我們從控制面板-管理工具-服務裡就能找到,這是管理執行MPI程式的一個服務,安裝好後就是自動啟動的,所以一般也就不用動它。
安裝完畢後開始選單-程式中就添加了一個MPICH2目錄,其中就有上面提到的Jumpshot,另外wmpiconfig.exe是用來配置執行環境的,我在網上有找到的說明都是以前舊版本的,和現在的差別比較大,感覺這新版本用的不爽,沒搞明白這個程式該咋用,不過好像預設狀態下不改什麼就能正常使用,所以也就不管它了。wmpiregister.exe則是用來註冊使用者的,使用MPI之前需要在這個程式裡註冊一個系統裡已經存在的使用者,而且這個使用者必需擁有管理員許可權,擁有執行我們安裝了的MPI系統的能力。比如我就在所有參與運算的機器上添加了一個管理員mpi,密碼也是mpi。
接下來,我們就可以開始試著執行一下MPI的程式了。就用examples目錄下面的那個計算<!--[if !vml]-->圓周率的程式。如果要多機平行計算的話,就需要在所有機器上的相同位置放置要執行的程式,我的情況就是在所有機器的C盤下建了一個mpiexe的目錄,並把cpi.exe拷到所有機器的這個目錄下。然後,在其中的某臺機器上進入控制檯(執行MPI程式其實也可以用開始選單的MPICH2下的wmpiexec.exe,這是個gui程式,但是我覺得用的不爽,不如直接在控制檯下敲命令來得靈活),敲下命令mpiexec -hosts 2 192.168.10.142 192.168.0.23 c:/mpiexe/cpi.exe。mpiexec是安裝目錄下bin目錄裡的一個程式,在本文的例子中就是C:/Program Files/MPICH2/bin/mpiexec.exe,因為剛才說了,我把這個地址加入到PATH裡了,所以可以在任何地方直接執行,它是用來啟動MPI程式的,-hosts引數說明是啟動多臺機器並行運算,後面跟著的2就是說要在兩臺機器上執行程式,再後面的就是那兩臺機器的ip地址,其中第一個就是我啟動程式的機器,當然,這個地方也可以寫機器名,只要它的機器名能被正常的解析就可以,最後面的就是要執行的程式,也就是剛才提到的所有機器都要在相同位置放置的那個MPI程式。如果只是在本機執行,則命令為mpiexec –n 2 cpi.exe,-n表示是在本地執行,後面的2表示啟動的程序數。程式執行後就會提示讓你輸入一個數字intervals,這個數字影響計算的精度,值越大精度越高,當然計算時間就越長了,然後程式會打印出計算的結果和花費的時間。
比如,我使用單機單程序執行,intervals設為99999999,耗時1.253849秒,而用兩臺機器雙程序則只有0.628954秒,明顯快很多,並行運算還是很有效果的。不過,如果我們把intervals改為9999,單機執行只用了0.000279秒,而兩臺機器卻花了0.001548秒,這是因為並行運算過程中,參與運算的機器需要通過網路傳遞一些訊息,如果計算量不大的話,花在了這上面的時間影響會比較明顯,因而反不如單機版的來得快。
到現在我們的MPI執行環境就基本安裝好了,當然,MPI還有很多其他的命令引數,只不過最常用估計也就這兩條了,其他的用得著的時候就去查上面提到的文件,裡面有比較詳細的介紹。另外,如果按照以上的介紹進行安裝配置,在執行多機並行MPI程式的時候卻出現連線錯誤的話,八成是因為網路的問題,看看你的防火牆是不是開著,開啟相應的埠,或者乾脆關掉防火牆就好了。
Linux下的安裝配置和單機執行
Linux下的操作要相對來說麻煩一點,這個麻煩從安裝開始,呵呵。我用的系統是CentOS4.4,裝在VMware Workstation裡的,一共裝了兩個虛擬機器,環境基本上完全一樣。為執行MPI在兩臺虛擬機器都建立了一個使用者mpi,密碼也是mpi,home路徑也都是/home/mpi,然後繼續都建立了一個目錄/home/mpi/mpich2用來作MPI執行環境的安裝路徑,一個/home/mpi/mpich2/src來存放編譯用的原始碼。然後將原始碼包mpich2-1.0.5.tar.gz下載到兩臺機器上,都解壓縮到/home/mpi/mpich2/src中,然後到/home/mpi/mpich2/src下,指定安裝路徑,
./configure -prefix=/home/mpi/mpich2
make
make install
幾分鐘後安裝完畢。需要提一下的是,我曾經試著用root使用者來安裝MPICH2,但是安裝後好重啟系統就出了問題,所以建議還是另外建個使用者來裝吧(ubuntu乾脆就把root給禁了,不讓你直接用root)。
安裝後/home/mpi/mpich2下多出來一些目錄和檔案,要比windows多,lib是庫檔案,include是標頭檔案,bin還是程式檔案,所以還是要寫到環境變數裡,可以用命令export PATH /home/mpi/mpich2/bin:$PATH,但我是用root使用者直接在/etc/profile最後面加了這麼一句export PATH=/home/mpi/mpich2/bin:$PATH,一勞永逸。
MPI應用一個管理器來管理執行MPI程式,這個管理器就是mpd,但是在正式開始執行mpd前還需要一個基於安全考慮的配置檔案,.mpd.conf,這個檔案是要放在執行程式的使用者的home目錄下,本例子中就是/home/mpi/.mpd.conf,而且這個檔案只能由這個使用者讀寫,建立檔案的命令是,
cd $HOME
touch .mpd.conf
chmod 600 .mpd.conf
然後在檔案中寫入這麼一行,secretword=***,***在參與計算的計算機上必需完全一致。如果是root使用者的話,這個檔案應該是/etc/mpf.conf。
然後,我們就可以啟動mpd管理器了,直接在控制檯下使用mpd命令,或者是mpd &,讓mpd在後臺執行,若關閉啟動的mpd,只需要命令mpdallexit即可。在啟動mpd之後就可以執行MPI應用程式了,執行命令與windows下類似,如我們仍然是測試一下examples裡的cpi程式可以這樣來作,
cd ~/mpich2/examples
mpiexec -n 1 ./ cpi
引數含義同windows下的單機執行命令。另外,啟動mpd後還可以用命令mpdtrace來察看當前執行的mpd情況。
SSH配置和多機並行
MPI的多機並行是用mpdboot來管理啟動的,是由參與計算的其中一臺機器通過mpdboot同時啟動其他機器上的mpd管理器並執行相應MPI程式的,所以,需要賦予執行mpdboot的機器執行其他機器上程式的能力。MPICH2支援通過ssh和rsh來做到這一點,其中ssh是預設的,而且其安全性也優於rsh,因此,我在專案中是用的ssh。
首先,我們需要修改所有機器上的/etc/hosts檔案,在裡面新增上參與計算的機器名和ip地址,比如本文中有兩臺機器參加的例子裡,hosts檔案應當為:
127.0.0.1 localhost.localdomain localhost
192.168.10.142 node0
192.168.10.23 node1
這裡的意思是說,主機名為node0的機器ip地址為192.168.10.142,主機名為node1的機器ip地址為192.168.10.23。
當然,其實這一步也可以跳過,因為我們也可以在操作過程中直接使用ip地址,只不過那樣不太方便。另外就是,有些機器預設情況下第一行可能包括本機的主機名,比如在ip為192.168.10.142的node0上,hosts檔案第一行是
127.0.0.1 localhost.localdomain localhost node0
這樣可能會使得mpdboot工作不正常,所以還是最好給成上面的那種形式。
第二步是建立ssh金鑰,命令列下:
#ssh-keygen -t rsa
-t rsa指的是金鑰型別,具體請察看ssh相關資料,這裡不多說。這樣就在當前使用者的home目錄下生成了一個.ssh目錄,本文中的就是/home/mpi/.ssh。
第三步,將/home/mpi/.ssh下的id_rsa.pub檔案拷貝改名為authorized_keys,即
#cp id_rsa.pub authorized_keys
第四步,在其他所有機器上進行以下操作。
#ssh-keygen -t rsa生成.ssh資料夾
#scp node0的IP:/home/mpi/.ssh/* ~/.ssh拷貝node0上的.ssh資料夾覆蓋本地的
第五步,在所有機器上建立與自己和所有其他機器的信任連線。
對每個節點執行:
#ssh node0
#ssh node1
根據提示鍵入yes即可。然後就可以在不需要使用者名稱密碼的情況下通過ssh登陸其他機器了,比如在node0上#ssh node1,
就可以直接進入node1。
接下來,在啟動mpdboot的機器上建立一個參與計算的host列表檔案,如檔案mpd.hosts,每行是一個主機名,建立過程如
#cd ~
#touch mpd.hosts
#vi mpd.hosts
nod0
node1
現在,就可以啟動運算叢集了
#mpdboot -n 2 -f mpd.hosts
-n表示要啟動的機器個數,一般是不大於mpd.hosts檔案中的機器數,比如本文中的例子就是兩臺機器。這樣,列表中的機器就會啟動其本機上的mpd管理器。
然後,就可以開始執行MPI程式,進行運算了,同windows下一樣,程式需要放在每臺機器上的相同位置(如果用NFS就只需在一臺機器上放置程式,其他機器作對映就行),比如都是程式/home/mpi/mpich2/examples/cpi,在執行mpdboot 的結點機器上:
#mpiexec -n 2 /home/mpi/mpich2/examples/cpi
-n表示要啟動的程序個數,一般是不大於mpd.hosts檔案中的機器數(或者cpu核心數?偶用的機器就是雙核的了,所以單機的時候雙程序比單程序效率好很多,但是三程序就不行)。
Mpd在執行過程中,可以通過mpdtrace顯示參與計算的機器名,mpdtrace –l則是顯示機器名以及其埠。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1638651