天天看點

資料收集帖(MPICH2安裝使用) MPICH2軟體包的安裝

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 資料空間。網絡接口層與網絡裝置直接相連, 處于傳輸的最底層, 向上為核心層提供抽象的網絡裝置結構, 屏蔽不同網絡裝置的差別, 實作網絡裝置的統一管理。

資料收集帖(MPICH2安裝使用) MPICH2軟體包的安裝

圖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。

 轉自:http://www.cnblogs.com/lyq105/archive/2010/06/01/1749515.html