基于Intel的并行計(jì)算MPI環(huán)境搭建
原創(chuàng)MPI是一個(gè)庫(kù),而不是一門語(yǔ)言。許多人認(rèn)為,MPI就是一種并行語(yǔ)言,這是不準(zhǔn)確的。但是,按照并行語(yǔ)言的分類,可以把FORTRAN+MPI或C+MPI看作是一種在原來(lái)串行語(yǔ)言基礎(chǔ)之上擴(kuò)展后得到的,并行語(yǔ)言MPI庫(kù)可以被FORTRAN77/C/Fortran90/C++調(diào)用,從語(yǔ)法上說(shuō),它遵守所有對(duì)庫(kù)函數(shù)/過(guò)程的調(diào)用規(guī)則,和一般的函數(shù)/過(guò)程沒(méi)有什么區(qū)別。
MPI已在IBM PC機(jī)上、MS Windows上、所有主要的Unix工作站上和所有主流的并行機(jī)上得到實(shí)現(xiàn)。使用MPI作消息傳遞的C或Fortran并行程序可不加改變地運(yùn)行在IBM PC、MS Windows、Unix工作站、以及各種并行機(jī)上。
高性能并行計(jì)算計(jì)算機(jī)技術(shù)由于具有巨大的數(shù)值計(jì)算和數(shù)據(jù)處理能力,在國(guó)內(nèi)外受到高度重視,他在科學(xué)研究、工程技術(shù)以及軍事等方面的應(yīng)用,已經(jīng)取得巨大的成就。并行計(jì)算就是通過(guò)把一個(gè)大的計(jì)算問(wèn)題分解成許多彼此獨(dú)立且有相關(guān)的子問(wèn)題,然后把他們散列到各個(gè)節(jié)點(diǎn)機(jī)上并行執(zhí)行從而最終解決問(wèn)題的一種方法。
一、安裝環(huán)境
CentOS 6.4 最小化圖形安裝,保證每個(gè)節(jié)點(diǎn)的sshd服務(wù)能正常啟動(dòng),確保防火墻與selinux已經(jīng)關(guān)閉,所需軟件: Intel_ Fortran,Intel_C++,Intel_ MPI
二、設(shè)置通過(guò)主機(jī)名無(wú)密碼登錄
1、通過(guò)主機(jī)名訪問(wèn)
為每個(gè)節(jié)點(diǎn)分配IP地址,IP地址***連續(xù)分配,配置/etc/hosts文件,實(shí)現(xiàn)IP地址和機(jī)器的對(duì)應(yīng)解析??梢栽谒袡C(jī)器上使用同樣的/etc/hosts 文件,它包含如下形式的內(nèi)容:
- 10.12.190.183 dell
- 10.12.190.187 lenovo
- ……
2、計(jì)算節(jié)點(diǎn)之間的無(wú)密碼訪問(wèn)
假設(shè) A(110.12.190.183)為客戶機(jī)器,B(10.12.190.187)為目標(biāo)機(jī),
- #ssh-keygen -t rsa #使用rsa加密,默認(rèn)就是rsa加密
顯示信息如下,遇到系統(tǒng)詢問(wèn)直接回車即可。
- Generating public/private rsa key pair.
- Enter file in which to save the key (/root/.ssh/id_rsa):
- Enter passphrase (empty for no passphrase):
- Enter same passphrase again:
- Your identification has been saved in /root/.ssh/id_rsa.
- Your public key has been saved in /root/.ssh/id_rsa.pub.
- The key fingerprint is:
- b3:8e:87:44:71:67:81:06:d2:51:01:a4:f8:74:78:fd root@kvm.local
- The key's randomart image is:
- +--[ RSA 2048]----+
- | .o==oo.. |
- | . +o.+ o |
- | . + o+.o |
- | o o. . |
- | .. S E |
- | . o |
- | . .. |
- | .o. |
- | ... |
- +-----------------+
將會(huì)生成密鑰文件和私鑰文件 id_rsa,id_rsa.pub。
將A的~/.ssh/ id_rsa.pub 文件復(fù)制到B機(jī)器的 .ssh 目錄, 并 cat id_rsa.pub >> ~/.ssh/authorized_keys,同樣方法,把B的~/.ssh/ id_rsa.pub也復(fù)制到A機(jī)器上。
設(shè)置authorized_keys權(quán)限:
- #chmod 600 authorized_keys
設(shè)置.ssh目錄權(quán)限:
- #chmod 700 -R .ssh
如果使用ssh-copy-id命令,可以更方便把本地主機(jī)的公鑰復(fù)制到遠(yuǎn)程主機(jī)的authorized_keys文件上,ssh-copy-id 也會(huì)給遠(yuǎn)程主機(jī)的用戶主目錄(home)和~/.ssh, 和~/.ssh/authorized_keys設(shè)置合適的權(quán)限。
- #ssh-copy-id –i ~/.ssh/id_rsa.pub 10.12.190.187
完成以上操作之后,用戶從本地機(jī)器到遠(yuǎn)程機(jī)器就不需要用密碼了,文件和目錄的權(quán)限千萬(wàn)別設(shè)置成chmod 777.這個(gè)權(quán)限太大了,不安全,數(shù)字簽名也不支持。
也可以用一臺(tái)機(jī)器生成ssh-keygen,將.ssh目錄連同id_rsa,authorized_keys一起復(fù)制到每個(gè)節(jié)點(diǎn)上去。檢查是否可以直接(不需要密碼,詢問(wèn)時(shí)輸入yes回車)登錄其他節(jié)點(diǎn):
- ssh node1
- ssh node2
- ssh node3
- ssh node4
如能任意兩節(jié)點(diǎn)之間不需要密碼登錄其他節(jié)點(diǎn)則表明配置成功。
三、NFS文件系統(tǒng)的配置
方法示例如下(假設(shè)NFS 服務(wù)器IP 為10.12.190.183,配置需在root用戶下完成):
服務(wù)器端配置方法(下面的配置只在主節(jié)點(diǎn)進(jìn)行):
1. /etc/exports 文件配置
在文件/etc/exports 中增加以下幾行:
- /home/cluster 10.12.190.183(rw,sync,no_root_squash)
- /home/cluster 10.12.190.185(rw,sync,no_root_squash)
- /home/cluster 10.12.190.187(rw,sync,no_root_squash)
這幾行文字表明NFS 服務(wù)器向IP 地址為10.12.190.183,10.12.190.185,10.12.190.185 的三個(gè)節(jié)點(diǎn)共享其/home/cluster目錄,并使這些節(jié)點(diǎn)具有可讀寫權(quán)限。如有更多的節(jié)點(diǎn)可按此方法填寫。
接著執(zhí)行如下命令,啟動(dòng)端口映射:
- # /etc/rc.d/init.d/rpcbind start (注:在***內(nèi)核中NFS守護(hù)進(jìn)程改為rpcbind,如是舊內(nèi)核啟動(dòng)NFS守護(hù)進(jìn)程的命令是 service portmapstart)
***執(zhí)行如下命令啟動(dòng)NFS 服務(wù),此時(shí)NFS 會(huì)激活守護(hù)進(jìn)程,然后就開始監(jiān)聽 Client 端的請(qǐng)求:
- # /etc/rc.d/init.d/nfs start
- # chkconfig nfs on
也可以重新啟動(dòng)Linux 服務(wù)器,自動(dòng)啟動(dòng)NFS 服務(wù)。
2、客戶端配置方法(需要在所有子節(jié)點(diǎn)做同樣的配置)
建立與服務(wù)器相同的共享目錄用于共享服務(wù)器文件:
- mkdir /usr/cluster
查看服務(wù)器已有的共享目錄(這步可省略)
- showmount -e 10.12.190.183
通過(guò)這條命令我們可以查看IP地址為10.12.190.183的服務(wù)器可以共享的目錄情況。
掛載共享目錄:
- mount -t nfs 10.12.190.183:/home/cluster /home/cluster
這一命令將 NFS 服務(wù)器10.12.190.183上的共享目錄掛載到本地/home/cluster 目錄下。我們也可在所有子節(jié)點(diǎn)的/etc/fstab 文件中輸入以下的代碼,使文件系統(tǒng)在啟動(dòng)時(shí)實(shí)現(xiàn)自動(dòng)掛載NFS:
- 10.12.190.183:/home/cluster /home/cluster nfs defaults 0 0
至此我們已可以實(shí)現(xiàn)對(duì) NFS 共享目錄的本地訪問(wèn),所有子節(jié)點(diǎn)的/home/cluster 文件夾都共享了NFS 服務(wù)器的同名文件夾的內(nèi)容,我們可以像訪問(wèn)本地文件一樣訪問(wèn)共享文件。用戶存放并行程序的文件夾都可以實(shí)現(xiàn)NFS 共享,從而避免了每次向各節(jié)點(diǎn)發(fā)送程序副本。
四、安裝Intel_C++
- #tar xvzf l_ccompxe_2013.1.117.tgz
- # cd composer_xe_2013.1.117
- #./install.sh
設(shè)置環(huán)境變量:
- #vi /etc/profile
添加一行source /opt/intel/composer_xe_2013.1.117/bin/iccvars.sh intel64
測(cè)試環(huán)境變量設(shè)置:
- #which icc
如果能看到/opt/intel/composer_xe_2013.1.117/bin/intel64/icc,那么就安裝設(shè)置成功了。
五、安裝Intel_Fortran編譯器
- #tar fxvz l_fcompxe_2013.1.117.tgz
- # cd l_fcompxe_2013.1.117
- #./install.sh
設(shè)置環(huán)境變量:
- #vi /etc/profile
添加一行source /opt/intel/composer_xe_2013.1.117/bin/compilervars.sh intel64。
測(cè)試環(huán)境變量設(shè)置:
- #which ifort
如果能看到/opt/intel/composer_xe_2013.1.117/bin/intel64/ifort ,那么就安裝設(shè)置成功了。
六、配置安裝Intel_MPI
1、安裝與設(shè)置
安裝前一定要將Fortran編譯器安裝好,c++放到***沒(méi)有影響,其它版本MPI就需要先將前2個(gè)軟件安裝好,設(shè)置好環(huán)境變量,***在安裝MPI程序,如開源的mpich。
- #tar fxvz l_mpi_p_4.1.3.045.tgz
- #cd l_mpi_p_4.1.3.045
- #./install.sh
設(shè)置環(huán)境變量:
- #vi /etc/profile
添加一行source /opt/intel/impi/4.1.3.045/bin64/mpivars.sh。
測(cè)試環(huán)境變量設(shè)置:
- #which mpd
- #which mpicc
- #which mpiexec
- #which mpirun
如果能看到所有命令的路徑說(shuō)明,安裝設(shè)置成功了。
修改/etc/mpd.conf文件,
- vi /etc/mpd.conf
設(shè)置文件讀取權(quán)限為只有自己能讀寫:
- chmod 600 /etc/mpd.conf
非root用戶在家目錄創(chuàng)建內(nèi)容相同的.mpd.conf,每個(gè)節(jié)點(diǎn)都要添加:
創(chuàng)建主機(jī)名稱集合文件/root/mpd.hosts:
- #vi mpd.hosts
文件內(nèi)容如下:
- dell #主機(jī)名1 ,(主機(jī)名:數(shù)字 可以指定節(jié)點(diǎn)開啟的進(jìn)程數(shù) dell:2)
- lenovo #主機(jī)名2
在協(xié)處理器上***運(yùn)行MPI應(yīng)用之前,請(qǐng)將MPI庫(kù)復(fù)制到該系統(tǒng)的所有節(jié)點(diǎn)以下目錄。
- # scp /opt/intel/impi/4.1.3.045/mic/bin/* dell:/bin/
- mpiexec 100% 1061KB 1.0MB/s 00:00
- pmi_proxy 100% 871KB 871.4KB/s 00:00
- ……
- #scp /opt/intel/impi/4.1.3.045/mic/lib/* dell:/lib64/
- libmpi.so.4.1 100% 4391KB 4.3MB/s 00:00
- libmpigf.so.4.1 100% 321KB 320.8KB/s 00:00
- libmpigc4.so.4.1 100% 175KB 175.2KB/s 00:00
- ……
- # scp /opt/intel/composer_xe_2013_sp1.0.080/compiler/lib/mic/* dell:/lib64/
- libimf.so 100% 2516KB 2.5MB/s 00:01
- libsvml.so 100% 4985KB 4.9MB/s 00:01
- libintlc.so.5 100% 128KB 128.1KB/s 00:00
- ……
以上是intel官方文檔的操作步驟,個(gè)人感覺比較麻煩,沒(méi)有采用這種方法。
我使用的是將/opt設(shè)置成nfs共享,然后掛載到每個(gè)節(jié)點(diǎn)下的相同目錄,設(shè)置一下環(huán)境變量就可以了。服務(wù)器端一定要將Intel_ Fortran,Intel_C++,Intel_ MPI全部安裝上,各個(gè)節(jié)點(diǎn)只需要MPI就可以了,服務(wù)器端將程序編譯好后,分發(fā)給各個(gè)節(jié)點(diǎn),然后這個(gè)程序就可以通過(guò)MPI接口,進(jìn)行并行運(yùn)算了。
2、MPI使用方法
MPI采用mpd服務(wù)來(lái)對(duì)進(jìn)程進(jìn)行管理,使用mpiexec或mpirun運(yùn)行mpi程序。
啟動(dòng)單機(jī)上的mpd服務(wù):
- # mpd &
查看mpd服務(wù):
- # mpdtrace 查看主機(jī)名
- # mpdtrace -l 查看主機(jī)名和端口號(hào)
關(guān)閉mpd進(jìn)程管理:
- #mpdallexit
測(cè)試mpi程序,
- #mpicc -o Hello Hello.c //生成可執(zhí)行文文件Hello
- #mpicc cpi.c //默認(rèn)輸出文件名a.out
- #mpdrun -np 4 ./a.out //-n或-np啟動(dòng)的進(jìn)程數(shù)
- #mpiexec [-h or -help or --help] //查看幫助文件
啟動(dòng)集群上的mpd服務(wù):
- # mpdboot -n process-num -f mpd.hosts
啟動(dòng) process-num個(gè)進(jìn)程,mpd.hosts是前面創(chuàng)建的文件。
mpi默認(rèn)是使用ssh來(lái)登陸集群里的其他機(jī)器,也可以使用rsh來(lái)登陸集群里的其他機(jī)器來(lái)啟動(dòng)mpd服務(wù)。
只要使用-rsh選項(xiàng)就可以指定用ssh或rsh:
- #mpdboot --rsh=rsh -n process-num -f hostfile
- 或#mpdboot --rsh=ssh -n process-num -f hostfile
關(guān)閉mpd服務(wù):
- #mpdallexit
使用MPIEXEC|MPIRUN來(lái)執(zhí)行mpi任務(wù):
- #mpiexec -np 4 ./a.out //a.out所有節(jié)點(diǎn)在相同的路徑下,需都有a.out文件
- 或mpiexec -machinefile filename -np 4 ./a.out
http://blog.sina.com.cn/s/blog_605f5b4f0100sw3j.html
運(yùn)行結(jié)果如下:
- [root@kvm ~]# mpiexec -np 4 ./a.out
- Process 0 of 4 is on dell
- Process 2 of 4 is on dell
- Process 3 of 4 is on kvm.local
- Process 1 of 4 is on kvm.local
- pi is approximately 3.1415926544231274, Error is 0.0000000008333343
- wall clock time = 0.037788
注意:以上的環(huán)境變量設(shè)置好后都需要重啟,或者使用source命令重新執(zhí)行一下文件。