RHEL5 下利用MPICH2配置并行運算叢集
李劍,羅元成
(重慶工程職業技術學院計算機系,重慶 400037)
摘 要:MPICH是國内常用的叢集計算消息傳遞系統。本文描述了MPI的基本概念及實作軟體MPICH2,介紹了在Linux環境下如何構架基于 MPICH的高性能計算叢集系統的方法,給出了具體的步驟和基本配置過程。實驗結果表明:在現有并行叢集系統下能有效地利用現有計算機資源,大幅度提高計算效率,為一些複雜問題的求解提供可行方案。
關鍵字:并行計算;MPI;MPICH; 叢集
中圖分類号:TP393.02 文獻辨別碼: A
Configure Parallel Computing Cluster by MPICH2 Based on RHEL5
LI Jian,LUO Yuan-cheng
(Chongqing Vocational Institute of Engineering,computer department,ChongQing 400037)
Key words:parallel computing;MPI;MPICH;cluster
随着工作站和PC機性能的提高和網絡技術的發展,叢集系統(Cluster)是近年來人們開始研究的一種新計算機系統,也稱網絡并行計算系統,是利用高速通訊網絡将一組高性能工作站或PC機連接配接起來而形成的一種分布式并行計算系統。它通常采用消息傳遞(Message Passing)的方式進行并行計算。消息傳遞接口(MPI - Message Passing Interface) 作為并行程式設計模型的代表和事實上的标準, 已經在越來越多的叢集高性能計算中得到了使用。
MPI消息傳遞過程分為三個階段: ⑴消息裝配,将發送資料從發送緩沖區中取出, 加上消息信封等形成一個完整的消息; ⑵消息傳遞,将裝配好的消息從發送端傳遞到接收端; ⑶消息拆卸, 從接收到的消息中取出資料送入接收緩沖區。如圖所示, 整個傳遞過程可劃分為三個層次: MPI 層、核心層和網絡接口層。MPI層處于整個傳輸的頂部, 為使用者提供一個透明通用的函數庫, 來完成使用者程式的通信操作。核心層起到一個承上啟下的作用, 向上為MPI 層提供socket 接口函數, 向下為網絡接口程式準備skb 資料空間。網絡接口層與網絡裝置直接相連, 處于傳輸的最底層, 向上為核心層提供抽象的網絡裝置結構, 屏蔽不同網絡裝置的差別, 實作網絡裝置的統一管理。
圖1 MPI消息傳遞過程
MPI是為開發基于消息傳遞模型的并行程式而制定的工業标準,其目的是為了提高并行程式的可移植性和易用性。參與MPI标準制定的人員來自歐美40多個組織,大部分主要的并行計算機制造商、大學研究所、政府實驗室、工業組織等都投入到MPI标準化工作。有了統一的并行程式設計語言标準,并行計算環境下的應用軟體及軟體工具就都能夠實作透明的移植,各個廠商就可以依據标準提供獨具特色和優勢的軟體實作和軟體支援,進而提高了并行處理的能力。
MPI隻是一個并行程式設計語言标準,要編寫基于MPI的并行程式,還必須借助某一MPI具體實作。MPICH是Linux平台下最重要的一種MPI實作,是一個與MPI規範同步發展的版本。LAM(Local Area Multicomputer)是Linux平台下另一免費的MPI實作。它由Ohio州立大學開發,主要用于異構的網格計算并行系統。
MPICH是可以免費從http://www-unix.mcs.anl.gov/mpi/mpich 取得,更為重要的是,MPICH是一個與MPI-1規範同步發展的版本,每當MPI推出新的版本,就會有相應的MPICH的實作版本。MPICH2是 MPI(Message-Passing Interface)的一個應用實作,支援最新的MPI-2接口标準,是用于并行運算的工具,與之前版本相比MPICH2具備更加嚴謹和合理的結構,可移植性和效率更好,在程式設計語言上支援C/C++和Fortran。MPICH2的首頁是http://www-unix.mcs.anl.gov /mpi/mpich2/index.htm,在這個頁面上就能找到各平台最新版本MPICH2的下載下傳位址,其中還包括源代碼。最新源代碼連結的位址是 ftp://ftp.mcs.anl.gov/pub/mpi/mpich2-1.0.8.tar.gz。在ftp://ftp.mcs.anl.gov /pub/mpi下還有MPICH2的安裝和使用指南文檔,主要有三個,分别是User's Guide,Installer's Guide和Windows Developer's Guide。
1 準備工作:
1.1 設定IP,更改主機名為station1,station3,station6,station8
pc
主機名
IP
節點1
station1
172.17.2.1
節點2
Station3
172.17.2.3
節點3
Station6
172.17.2.6
節點4
Station8
172.17.2.8
以四台pc為例,為了友善,分别更改了四台機器的主機名為station1,station3,station6,station8,以第一台為例:
hostname station1
這隻是臨時更改主機名,要想永久更改主機名,編輯下面檔案:
vim /etc/sysconfig/network
編輯内容為(最後一行就是要改的主機名):
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=station1
更改/etc/hosts檔案
#vi /etc/hosts 打開hosts檔案,更改如下:
127.0.0.1 localhost.localdomain localhost
172.17.2.1 station1
172.17.2.3 station3
172.17.2.6 station6
172.17.2.8 station8
1.2 建立SSH信任連接配接(在root目錄下)
1.2.1 在station1生成SSH秘鑰對
#ssh-keygen -t rsa 一路回車即可
産生.ssh檔案,
#ls -a 檢視是否有.ssh檔案夾
1.2.2進入.ssh目錄
#cd .ssh
1.2.3 生成authorized_keys檔案
#cp id_rsa.pub authorized_keys
1.2.4 退出到root目錄
#cd ..
1.2.5 建立本身的信任連接配接
#ssh station1 按提示輸入yes
1.2.6 設定station3(station3的root目錄下)
#ssh-keygen -t rsa 生成.ssh檔案夾
#scp 172.17.2.1:/root/.ssh/* /root/.ssh 拷貝station1上的.ssh檔案夾覆寫本地的
#scp 172.17.2.1:/etc/hosts /etc/hosts 拷貝station1上的hosts檔案覆寫本地的
#ssh station1 提示處輸入yes回車
設定station6,station8的方法與station3相同
1.2.7 确認四台機器的信任連接配接已建立
對每個節點執行:
#ssh station1
#ssh station3
#ssh station6
#ssh station8
在提示處輸入yes回車,最後确定無需輸入密碼并且沒有任何提示資訊即可登陸("Last login:時間日期"提示資訊除外)
2 安裝mpich2
2.1 到MPICH官方網站下載下傳源代碼包,解壓縮
#tar -zxvf mpich2-1.0.8.tar.gz
2.2 進入mpich2解壓目錄
#cd mpich2-1.0.8
2.3 設定安裝目錄
#./configure --prefix=/usr/loca/mpich
2.4 編譯
#make
2.5 安裝
#make install
2.6 改變目錄
#mv mpich2-1.0.8 /usr/local/mpich/install
2.7 退出到root目錄
#cd
2.8 通過編輯.bashrc檔案修改環境變量
#vim .bashrc
修改後的.bashrc檔案如下:
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
PATH="$PATH:/usr/local/mpich/bin" #新增加的
#Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
2.9 測試環境變量設定
#which mpd
#which mpicc
#which mpiexec
#which mpirun
2.10 修改/etc/mpd.conf檔案,内容為secretword=myword
#vi /etc/mpd.conf
設定檔案讀取權限和修改時間
#touch /etc/mpd.conf
#chmod 600 /etc/mpd.conf
2.11 建立主機名稱集合檔案/root/mpd.hosts
#vi mpd.hosts
檔案内容如下:
station1
station3
station6
station8
3 測試
3.1 本地測試
啟動:
#mpd &
[1] 24455
觀看啟動機器:
#mpdtrace
station1
退出:
#mpdallexit
3.2運作叢集系統
#mpdboot -n 4 -f mpd.hosts
參數-n 4指定了要起動的機器個數,-f mpd.hosts指定了通過mpd.hosts運作
#mpdtrace
station1
station6
station3
station8
#mpdallexit
3.3測試運作MPICH的圓周率的程式
在軟體的安裝包裡有圓周率計算的原代碼icpi.c,先編譯成可執行檔案
#cd /usr/local/mpich/install/examples/
mpicc icpi.c -o icpi
3.1 叢集測試
#mpdboot -n 4 -f mpd.hosts
啟動這四台機器
#mpiexec -n 4 /usr/local/mpich/install/examples/icpi
用num指定使用的程序數
Enter the number of intervals: (0 quits) 100000000
pi is approximately 3.1415926535901937, Error is 0.0000000000004006
wall clock time = 18.460739
Enter the number of intervals: (0 quits) 10000
pi is approximately 3.1415926544231239, Error is 0.0000000008333307
wall clock time = 0.022534
Enter the number of intervals: (0 quits) 0
#mpdallexit
3.2 單機測試
#cd /usr/local/mpich/install/examples/
#./icpi
Enter the number of intervals: (0 quits) 100000000
pi is approximately 3.1415926535902345, Error is 0.0000000000004414
wall clock time = 73.898167
Enter the number of intervals: (0 quits) 10000
pi is approximately 3.1415926544231341, Error is 0.0000000008333410
wall clock time = 0.010941
測試結果表明:在intervals的值設為100000000,既精确值比較大時,群集的4程序并發運作時間是18.460739秒,單機單程序運作時間是73.898167秒,明顯快很多,并行運算還是很有效果的。在intervals的值設為10000,既精确值比較小時,群集的4程序并發運作時間是0.022534秒,單機單程序運作時間是0.010941秒,這是因為并行運算過程中,參與運算的機器需要通過網絡傳遞一些消息,如果計算量不大的話,花在了這上面的時間影響會比較明顯,因而反不如單機的來得快。
4 查錯
4.1 通過mpdcheck獲得幫助資訊
#mpdcheck -pc
4.2 查錯
#mpdcheck -l
4.3 通過mpd.hosts檔案查錯
#mpdcheck -f mpd.hosts
如果無錯誤
#mpdcheck -f mpd.hosts -ssh
4.4 對任意兩台機器進行查錯
Station1上:
#mpdcheck -s
傳回主機名host和端口port
server listening at INADDR_ANY on: station1 40782
station3上:
# mpdcheck -c 172.17.2.1 40782
client successfully recvd ack from server: ack_from_server_to_client
station1 上傳回結果
server has conn on <socket._socketobject object at 0xb7ffe35c> from ('172.17.2.3', 54438)
server successfully recvd msg from client: hello_from_client_to_server
傳回消息傳遞結果
4.4 mpd查錯
station1上:
#mpd -e &
傳回使用的端口
[1] 14065
[[email protected] ~]# mpd_port=41563
station3上:
# mpd -h station1 -p 41563 &
[1] 5122
以上測試通過,叢集系統就建成了。
5 結束語
利用區域網路和MPI可以建構由PC組成的廉價、實用且性能優良的并行計算機。文中利用普通PC機在Linux環境下建構了基于MPICH2的高性能計算叢集系統,并對其進行了高性能測試。實驗結果表明這種建構高性能計算叢集系統的方法切實可行,不但可以節省計算時間,提高計算精度,而且可以解決單機無法完成的超大規模求解問題。并行計算使用多台計算機或者具有多個處理器的計算機來求解問題,進而為求解大規模複雜問題提供了可能。作為一個優秀的作業系統,Linux特别适合用來組建并行計算平台。
參考文獻:
[1] William Gropp and Ewing Lusk in Mathematics and Computer Science Division
Argonne National Laboratory. MPICH2的安裝和使用指南文檔[EB/OL],ftp://ftp.mcs.anl.gov/pub/mpi/ mpich2-doc-install.pdf.
[2]徐巍,李玉榕.MPICH在PC叢集系統中的運用[J].福建工程學院學報,2006-4.
[3]高飛,劉青昆,向文,黃丹.MPICH标準通信模式下消息傳遞機制的研究[J].長春師範學院學報(自然科學版),2007-10.
[4]龐麗萍,何飛躍,嶽建輝等.并行檔案系統集中式中繼資料管理高可用系統設計[J].計算機工程與科學,2004, 26 (11): 87-88.
MPICH2軟體包的安裝
MPICH2是與MPI-2相對應的MPICH實作版本,包含了MPI-2相對于MPI-1擴充後的一些功能,比如動态任務管理,并行I/O等。目前最新版本是MPICH2-1.0.2.
(1)下載下傳MPICH2源程式包mpich2-1.0.2p1.tar.gz(http://www-unix.mcs.anl.gov/mpi/mpich2/)。
(2)解壓源程式包到目前目錄下:tar zxf mpich2-1.0.2p1.tar.gz,此時會得到一個名為mpich2-1.0的子檔案夾。
(3)建立一個安裝目錄(比如/home/transim/mpich2,預設為/usr/local/bin),為了以後使用友善,可以将此安裝 目錄共享到其他所有将要運作mpich2的節點機上;否則就需要分别在其他機器上安裝mpich2。如果不建立安裝目錄,則在下面的configure步 驟中會自動建立安裝目錄。
(4)選擇一個編譯目錄,最好将編譯目錄與源代碼目錄分離開,以便能保持一個幹淨的源代碼用來在其他機器上重新安裝。比如将源代碼拷貝到/tmp /mpich2下。
(5)配置MPICH2,指定安裝目錄,并在編譯目錄下運作configure腳本。
如:cd /tmp/mpich2
./configure –prefix=/home/transim/mpich2 2>&1 | tee configure.log
(6) 編譯連結MPICH2:make 2>1& | tee make.log
(1)安裝MPICH2:make install 2>1& | tee install.log
(2)将安裝目錄中子目錄bin加入到環境變量PATH中:
setenv PATH /home/transim/mpich2/bin:$PATH (csh或tcsh)
export PATH=/home/transim/mpich2/bin:$PATH (bash或sh)
用以下指令檢查安裝是否成功:
which mpd
which mpicc
which mpiexec
which mpirun
所有以上的指令都應該指向安裝目錄的bin子目錄。此外,如果沒有用NFS來共享安裝目錄,則需要将bin子目錄拷貝到其他每台機器上。
(9)與MPICH不同的是,MPICH2使用一個外部程序管理器來啟動MPI任務,預設管理器為MPD。為了安全考慮,MPD需要搜尋使用者主目錄 下的檔案.mpd.conf,檔案中包含:secretword=<secretword>,其中secretword應該是一個隻有使用者知 道的字元串(最好不要與使用者密碼相同),将此檔案權限設定為隻有所有者可讀及可寫。
(10)用以下指令檢查測試MPICH2在本機是否已正确安裝并可以啟動:
Mpd & (啟動mpd)
Mpdtrace (輸出應該是本機機器名)
Mpdallexit (退出mpd)
(11)在mpd下運作非mpi程式測試:
mpd &
mpiexec –n 1 /bin/hostname (輸出本機機器名)
mpdallexit
(12)配置所有機器,使用機器間采用rsh或ssh互相通路時不需要輸入密碼。配置完後可用以下指令進行測試:
ssh hostname date 或 rsh hostname date
(13)使用mpd.hosts檔案來啟動檔案所列機器上的mpd:
mpdboot –n <number to start> -f mpd.hosts
在以上指令行中所要啟動的機器數量必須小于等于mpd.hosts檔案中所列的機器數,即使同一台機器名在檔案中出現多次,預設情況下在每台機器上隻啟動一個mpd。在各台機器啟動mpd後,運作mpdtrace,應該輸出每台機器的機器名稱。
若不能啟動所有機器上的mpd,可采用手動方法來啟動,方法如下:
在本地機器上運作:
mpd & (啟動本地mpd守護程序)
mpdtrace –l (輸出本地mpd守護程序的主機名及端口号)
然後登入到其他機器,運作:
mpd –h <hostname> -p <port> &
hostname及port都為剛才輸出的本地機器名及端口号。可以用mpdtrace指令檢查哪些機器已經加入到mpd環中。
(14)用mpdtrace指令檢查是否所有機器都已啟動mpd,然後用mpdringtest指令測試在環中傳遞一個消息,如:
mpdringtest 100
mpdringtest 1000
(15)有環中測試運作多程序任務:
mpdrun –n <number> hostname
其中number不一定非要等于機器數。
(16)用mpiexec指令運作MPI任務,可以用程式包自帶的cpi例子:
mpiexec –n 5 cpi
關于mpiexec指令更多選項可運作mpiexec --help來檢視。
MPI2與MPI1的不同之處:
原來在MPI1中configure指令的一些選項參數在MPI2中必須用環境變量的形式來定義,比如選項參數-cc=<compile- name>必須改為setenv cc <compile-name>。原來在MPICH1中不以--enable或--with開關的選項參數在MPICH2中都要定義成環境變量 的形式。
此外,在程序管理器的處理及通信裝置的選擇上也有所不同。
MPICH2中的程序管理器
在MPICH2中用一種叫做PMI的接口将MPICH2的代碼庫與程序管理器分離開來,有三種程序管理器可供選擇:mpd,smpd及 gforker。
mpd是預設的程序管理器,它由一個守護程序環組成。
smpd支援windows和linux版本,它是在windows版本的MPICH2中所唯一包含的程序管理器。
gforker在一台單獨的機器上啟動所有的程序,對調試程式及共享存儲的多處理器主機上較有用。
Configure指令中的兩個選項參數:
--enable-thread=multiple (使用多線程)
--enable-cxx (使用c++語言綁定)
--enable-timing=none/all/runtime (定義是否加入計時功能)
MPICH2中程式的編譯與連結
在MPICH2中,C、C++、FORTRAN77、FORTRAN90對應的預設編譯指令分别是mpicc、mpicxx、mpif77、 mpif90,可以通過設定MPICH_CC、MPICH_CXX、 MPI_F77、MPICH_F90的值來指定編譯器。
由于在stdio.h及mpi的C++接口中都定義了SEEK_SET,SEEK_CUR,SEEK_END,是以在編譯采用mpi的c++程式時會出錯,解決方法是在源代碼中,#include <stdio.h>之前取消以下宏定義:
#undef SEEK_SET
#undef SEEK_ CUR
#undef SEEK_ END
另一種方法就是在指令行中加入:-DMPICH_IGNORE_CXX_SEEK選項。
MPICH2中程式的調試
可以在mpiexec指令中加入-gdb選項來使用調試器gdb調試程式,用-gdba選項來将一個正在運作的程式附加到調試器中。若使用 totalview來調試程式,需要使用選項參數-tv。