1. 程式人生 > >MPICH2簡單的安裝配置總結

MPICH2簡單的安裝配置總結

 

MPICH2MPI)的一個應用實現,支援最新的MPI-2介面標準,是用於並行運算的工具,在程式設計語言上支援C/C++Fortran。最近因為有專案需要的計算量比較大,所以就學習使用了MPICH2,在此根據網路上查詢的相關資訊和我自己的實際使用經歷,分別總結一下MPICH2windowslinux下基本的安裝使用方法。

軟體下載

MPICH2的主頁是,在這個頁面上就能找到各平臺最新版本MPICH2的下載地址,其中還包括原始碼,我在開始作這個專案的時候最新版本是windowsmpich2-1.0.5p2,原始碼mpich2-1.0.5p4。我們的專案是一個CentOSlinux下的程式,所以最終是要在

linux下執行的,但是又捨不得windows,於是就打算可能的話就在windows下寫程式,用MinGWwindows版的MPICH2編譯除錯,通過後再到wmware虛擬機器組成的簡單叢集作測試。所以,為避免不必要的麻煩,就要統一一下windowslinux下的MPICH2版本,而且不打算用最新的,因此決定用mpich2-1.0.5版。但是,如果在主頁上找的話是沒有以前舊版本下載的連結的(至少我沒找到),只有最新版本的httpftp下載。這難不住我等有心之人,既然提供了ftp下載,那咱就直接到他ftp伺服器上找,最新原始碼連結的地址是,把後面檔名去掉就應該是檔案的ftp存放路徑,把這個路徑直接寫到瀏覽器位址列裡回車(偶用的是
FireFox2),就能看到他們伺服器上這個目錄的檔案列表,裡面就有1.0.5版的windows安裝檔案和原始碼包,分別為 msi檔案不用多說,這是windows下安裝用的,原始碼包我們拿來在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計算圓周率的程式,分別有CC++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.exempiexec是安裝目錄下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,密碼也是mpihome路徑也都是/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支援通過sshrsh來做到這一點,其中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地址,只不過那樣不太方便。另外就是,有些機器預設情況下第一行可能包括本機的主機名,比如在ip192.168.10.142node0上,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 node0IP:/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