写在之前:
MPI简述:
MPI的全称是Message Passing Interface即标准消息传递界面,可以用于并行计算。MPI有多种实现版本,如MPICH, CHIMP以及OPENMPI。而Intel MPI是基于MPICH进行开发与发布的。
MPI是一个库,而不是一门语言。许多人认为,MPI就是一种并行语言,这是不准确的。但是,按照并行语言的分类,可以把FORTRAN+MPI或C+MPI看作是一种在原来串行语言基础之上扩展后得到的,并行语言MPI库可以被FORTRAN77/C/Fortran90/C++调用,从语法上说,它遵守所有对库函数/过程的调用规则,和一般的函数/过程没有什么区别。
高性能并行计算计算机技术由于具有巨大的数值计算和数据处理能力,在国内外受到高度重视,他在科学研究、工程技术以及军事等方面的应用,已经取得巨大的成就。并行计算就是通过把一个大的计算问题分解成许多彼此独立且有相关的子问题,然后把他们散列到各个节点机上并行执行从而最终解决问题的一种方法。
安装环境:
网络拓扑图:
其中InfiniBand网络用于MPI并行计算集群的数据通信,普通千兆以太网用于服务器管理、存储共享等。
服务器清单
用途 | 主机名 | IP Private Management | IP Application InfiniBand | OS Version | Intel MPI Version | ||
存储节点 | stor | 10.10.10.253 | RHEL 6.8 x64 | 5.1.3.181 | |||
管理节点 | master | 10.10.10.10 | 10.10.11.10 | RHEL 6.8 x64 | 5.1.3.181 | ||
计算节点1 | compute01 | 10.10.10.1 | 10.10.11.1 | RHEL 6.8 x64 | 5.1.3.181 | ||
计算节点2 | compute02 | 10.10.10.2 | 10.10.11.2 | RHEL 6.8 x64 | 5.1.3.181 | ||
计算节点3 | compute03 | 10.10.10.3 | 10.10.11.3 | RHEL 6.8 x64 | 5.1.3.181 | ||
计算节点4 | compute04 | 10.10.10.4 | 10.10.11.4 | RHEL 6.8 x64 | 5.1.3.181 | ||
计算节点5 | compute05 | 10.10.10.5 | 10.10.11.5 | RHEL 6.8 x64 | 5.1.3.181 | ||
计算节点6 | compute06 | 10.10.10.6 | 10.10.11.6 | RHEL 6.8 x64 | 5.1.3.181 | ||
计算节点7 | compute07 | 10.10.10.7 | 10.10.11.7 | RHEL 6.8 x64 | 5.1.3.181 | ||
计算节点8 | compute08 | 10.10.10.8 | 10.10.11.8 | RHEL 6.8 x64 | 5.1.3.181 |
一、安装操作系统
计算节点、管理节点的操作系统为RHEL 6.8 x64,安装方式:Minual+Network File System Client+Development所有开发工具+Chinese Support。
存储节点由于接有显示器,操作系统为RHEL 6.8 x64,安装方式:Desktop+NFS File Server+Development所有开发工具+Chinese Support 或 Minual+NFS File Server+Development所有开发工具+Chinese Support。
1、系统安装完成后,配置网络、安装IB卡驱动及配置IB网络,保证ssh服务正常启动,再依次关闭防火墙、关闭SELinux。
所有服务器的/etc/hosts文件配置如下
10.10.10.1 compute01eth0 10.10.10.2 compute02eth0 10.10.10.3 compute03eth0 10.10.10.4 compute04eth0 10.10.10.5 compute05eth0 10.10.10.6 compute06eth0 10.10.10.7 compute07eth0 10.10.10.8 compute08eth0 10.10.10.10 mastereth0 10.10.10.253 stor 10.10.11.1 compute01 10.10.11.2 compute02 10.10.11.3 compute03 10.10.11.4 compute04 10.10.11.5 compute05 10.10.11.6 compute06 10.10.11.7 compute07 10.10.11.8 compute08 10.10.11.10 master |
网络配置信息请参照/etc/hosts文件进行配置,以太网网关10.10.10.254,IB网络无网关。
##关闭防火墙 chkconfig iptables off chkconfig|grep iptables ##关闭SELinux more /etc/selinux/config vi /etc/selinux/config SELINUX=disabled ##保存后reboot生效 |
2、服务器重启完成后,配置ntp服务
其中NTP Server端为stor节点,管理节点和计算节点通过crontab来同步时间
[root@stor ~]# more /etc/ntp.conf restrict default kod nomodify notrap nopeer noquery restrict -6 default kod nomodify notrap nopeer noquery restrict 127.0.0.1 restrict -6 ::1 restrict 10.10.0.0 mask 255.255.0.0 nomodify //该网段可以进行校时 server time.windows.com prefer //prefer 该服务器优先 fudge 127.127.1.0 stratum 10 driftfile /var/lib/ntp/drift keys /etc/ntp/keys [root@master ~]# crontab -l 00 8 * * * /usr/sbin/ntpdate 10.10.10.253 ##每天8点向10.10.10.253同步时间 |
3、创建普通用户
##所有节点都创建,torque任务调度软件需用普通账户执行
[root@stor ~]# groupadd -g 500 test [root@stor ~]# useradd -u 500 -g 500 -d /home/test -m test [root@stor ~]# passwd test |
4、配置yum
可以利用安装ISO文件配置为yum源
A、上传安装ISO文件到服务器,并挂载 [root@stor ~]# mount -o loop /root/rhel-server-6.8-x86_64-dvd.iso /mnt
B、编写yum配置文件 [root@mpitest ~]# more /etc/yum.repos.d/rhel-source.repo [rhel-source] name=Red Hat Enterprise Linux $releasever - $basearch - Source baseurl=file:///mnt enabled=1 gpgcheck=0
C、刷新yum缓存 [root@stor ~]# yum clean all ##清空现有yum缓存 [root@stor ~]# yum makecache ##配置yum缓存
其他节点也可参照此配置。 还可以通过NFS将rhel-server-6.8-x86_64-dvd.iso的安装文件共享,再参照此配置。 |
二、设置通过主机名无密码登录
1、通过主机名访问
为每个节点分配IP地址,IP地址最好连续分配,配置/etc/hosts文件,实现IP地址和机器的对应解析。
可以在所有机器上使用同样的/etc/hosts 文件,它包含如下形式的内容:
10.10.10.1 compute01eth0 10.10.10.2 compute02eth0 10.10.10.3 compute03eth0 10.10.10.4 compute04eth0 10.10.10.5 compute05eth0 10.10.10.6 compute06eth0 10.10.10.7 compute07eth0 10.10.10.8 compute08eth0 10.10.10.10 mastereth0 10.10.10.253 stor
10.10.11.1 compute01 10.10.11.2 compute02 10.10.11.3 compute03 10.10.11.4 compute04 10.10.11.5 compute05 10.10.11.6 compute06 10.10.11.7 compute07 10.10.11.8 compute08 10.10.11.10 master |
2、计算节点与管理节点之间的无密码访问
A、所有计算节点compute0[1-8]和master分别执行 mkdir -p ~/.ssh chmod 755 ~/.ssh /usr/bin/ssh-keygen -t rsa ##会生成两个文件 id-rsa #私钥 id-rsa.pub #公钥
B、复制key到master ###########拷贝方法1,二选一 以下命令只在一个节点上执行,此例为master ssh compute0[1-8] cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ssh compute0[1-8] cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
###########拷贝方法2,二选一 所有计算节点compute0[1-8]和master分别执行 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys 以下命令只在一个节点上执行,此例为master ssh compute0[1-8] cat ~/.ssh/authorized_keys >> ~/.ssh/authorized_keys
C、将key下发到各compute节点 在master上将所有节点的authorized_keys下发到所有节点 scp ~/.ssh/authorized_keys compute0[1-8]:~/.ssh/authorized_keys
D、测试 以下命令在所有节点上执行,不做任何操作就能反馈命令结果,即为测试通过。 ssh compute0[1-8] hostname ssh master hostname |
##备注:第2操作需在root账户和test账户下都执行,因为mpi与torque安装会通过root超级账户、 mpi与torque软件配置与使用要通过test普通账户。
在RHEL 6.6后的版本中,普通账户的ssh无密码认证需要通过ssh-copy-id命令来拷贝密钥。 同理,root账户的也可以通过这种方式,效率比上一种方式更高。 依次在master和计算节点上运行 Master: # ssh-keygen -r rsa # ssh-copy-id -i ~/.ssh/id_rsa.pub master ##将master的公钥拷贝到master上 # ssh-copy-id -i ~/.ssh/id_rsa.pub node ##将master的公钥拷贝到node上
Node: # ssh-keygen -r rsa # ssh-copy-id -i ~/.ssh/id_rsa.pub master ##将node的公钥拷贝到master上 # ssh-copy-id -i ~/.ssh/id_rsa.pub node ##将node的公钥拷贝到node上 |
三、NFS文件系统的配置
通过NFS方式,执行文件只需要上传一次到存储服务器,其他节点就可以访问。
方法示例如下:(NFS存储服务器IP 为10.10.10.253,配置需在root用户下完成)
1、服务器端配置方法(下面的配置只在存储节点进行):
NFS服务器端配置
/etc/exports 文件配置
在文件/etc/exports 中增加以下几行:
/data 10.10.10.1(rw,sync,no_root_squash) /data 10.10.10.2(rw,sync,no_root_squash) /data 10.10.10.3(rw,sync,no_root_squash) /data 10.10.10.4(rw,sync,no_root_squash) /data 10.10.10.5(rw,sync,no_root_squash) /data 10.10.10.6(rw,sync,no_root_squash) /data 10.10.10.7(rw,sync,no_root_squash) /data 10.10.10.8(rw,sync,no_root_squash) /data 10.10.10.10(rw,sync,no_root_squash) |
这几行文字表明NFS 服务器向IP 地址为10.10.10.【1-8,10】的9个节点共享其/data目录,并使这些节点具有可读写权限、继承root账户权限、且保证数据唯一性。
接着执行如下命令,启动端口映射:
# /etc/rc.d/init.d/rpcbind start (注:在最新内核中NFS守护进程改为rpcbind,如是旧内核启动NFS守护进程的命令是 service portmap start)
最后执行如下命令启动NFS 服务,此时NFS 会激活守护进程,然后就开始监听 Client 端的请求:
# /etc/rc.d/init.d/nfs start ##启动nfs服务,也可以执行完以下两个命令后,重新启动Linux 服务器,系统自动启动NFS 服务。
[root@mpitest ~]# chkconfig rpcbind on ##将NFS守护进程设置为随系统自动启动
[root@mpitest ~]# chkconfig nfs on ##将nfs服务设置为随系统自动启动
2、客户端配置方法(需要在所有子节点做同样的配置)
建立与服务器相同的共享目录用于共享服务器文件:
mkdir /data
挂载共享目录:
mount -t nfs 10.10.10.253:/data /data
这一命令将 NFS 服务器10.10.10.253上的共享目录/data挂载到本地/data目录下
我们也可在所有子节点的/etc/fstab 文件中输入以下的代码,使文件系统在启动时实现自动挂载NFS:
10.10.10.253:/data /data nfs defaults 0 0
至此我们已可以实现对 NFS 共享目录的本地访问,所有子节点的/data目录都共享了NFS 服务器的同名文件夹的内容,我们可以像访问本地文件一样访问共享文件。
用户存放并行程序的文件夹都可以实现NFS 共享,从而避免了每次向各节点发送程序副本。
四、安装其他组件(在Intel mpi 5.1.3版本中已经集成了这部分,可不安装)
Intel C++ Compiler,即icc
#tar xvzf l_ccompxe_2013.1.117.tgz
# cd composer_xe_2013.1.117
#./install.sh
设置环境变量:
#vi /etc/profile
添加一行source /opt/intel/composer_xe_2013.1.117/bin/iccvars.sh intel64
测试环境变量设置:
#which icc
如果能看到/opt/intel/composer_xe_2013.1.117/bin/intel64/icc,那么就安装设置成功了。
安装Intel_Fortran编译器
###在Intel mpi 5.1.3版本中已经集成了这部分,可不安装
#tar fxvz l_fcompxe_2013.1.117.tgz
# cd l_fcompxe_2013.1.117
#./install.sh
设置环境变量:
#vi /etc/profile
添加一行source /opt/intel/composer_xe_2013.1.117/bin/compilervars.sh intel64。
测试环境变量设置:
#which ifort
如果能看到/opt/intel/composer_xe_2013.1.117/bin/intel64/ifort ,那么就安装设置成功了。
五、安装Intel MPI
将软件上传到存储节点的/data目录,这样子其他节点可直接使用。
1、软件安装
安装前一定要将Fortran编译器安装好,c++放到最后没有影响,其它版本MPI就需要先将前2个软件安装好,设置好环境变量,最后在安装MPI程序。
###用root账户在每个计算节点和管理节点执行安装过程
#tar xzvf l_mpi_p_5.1.3.181.tgz
#cd l_mpi_p_5.1.3.181
#./install.sh
提示安装一共分为6个步骤,敲击Enter键继续安装过程,q键退出安装过程
第二步:显示软件授权信息,通过空格键翻页显示,到最底下输入accept接受授权许可并继续下一步安装操作,或者decline退回到上一安装界面。
第三步:激活软件。根据Intel的授权协议,Runtime版本的MPI属于免费,Developer版本的MPI属于收费项目。
此处我们安装的属于Runtime版本,选择2“评估使用此软件或者稍后激活”,
回车下一步安装操作
第四步:选择软件安装方式,可通过集群安装或者单节点安装,此处输入1并回车
第四步:确认安装方式,根据安装界面提示的软件安装目录、软件安装组件、软件安装容量需求、软件安装目标等信息,选择安装方式。包括1默认的安装方式还是2自定义的,此处选择1并回车。
提示/opt/intel目录已经存在,yes确认回车,开始安装过程。
第五步:软件安装过程。显示安装过程,安装完成后,Enter回车继续
第六步:安装完成,敲击Enter退出安装界面。
2、基础配置
设置环境变量:每个节点都要配置
#vi /etc/profile
添加
source /opt/intel/compilers_and_libraries/linux/bin/compilervars.sh intel64
source /opt/intel/impi/5.1.3.181/bin64/mpivars.sh
注意:以上的环境变量设置好后建议重启,或者重新登录当前会话使环境变量生效。
测试环境变量设置: 每个节点都要检查
which mpd which mpicc which mpiexec which mpirun
如果能看到所有命令的路径,说明软件安装和环境变量设置成功。
创建/etc/mpd.conf文件:每个节点都要添加
内容为secretword=myword 或MPD_SECRETWORD=myword。myword为自定义字符。
##root用户配置
# vi /etc/mpd.conf 或者通过echo命令 #echo "secretword=myword" > /etc/mpd.conf 设置文件读取权限为只有自己能读写: chmod 600 /etc/mpd.conf |
##非root用户在家目录创建内容相同的.mpd.conf,##注意在mpd前有一点“.”。
# more /home/test/.mpd.conf secretword=myword |
设置文件读取权限为只有自己能读写:
chmod 600 /etc/mpd.conf
创建主机名称文件mpd.hosts:每个节点都要添加
文件内容如下:
HOSTNAME:ProcessNumber(主机名:数字(可以指定节点开启的进程数或CPU个数)例如dell:2)或者【如果该机器有两个CPU,就将它的名字加入两次】
##root用户配置,more /root/mpd.hosts
master:8 compute01:12 compute02:12 compute03:12 compute04:12 compute05:12 compute06:12 compute07:12 compute08:12 |
##非root用户在家目录创建内容相同的/home/test/mpd.hosts。
master:8 compute01:12 compute02:12 compute03:12 compute04:12 compute05:12 compute06:12 compute07:12 compute08:12 |
六、测试使用Intel MPI
MPI采用mpd服务来对进程进行管理,使用mpiexec或mpirun运行mpi程序。
启动单机上的mpd服务
# mpd &
查看mpd服务
# mpdtrace 查看主机名
# mpdtrace -l 查看主机名和端口号
关闭mpd进程管理
#mpdallexit 杀死所有的mpd守护进程
#mpdexit 杀死指定节点mpd守护进程
mpd测试命令
mpdcheck用来检查mpi安装和运行时的故障和异常。
mpdcheck -pc
mpdcheck -l
mpdringtest测试一个mpd回环的传输时间。
编译mpi文件
#mpicc -o Hello hellow.c //编译hellow.c文件,-o Hello 指定输出文件的名称为Hello)
#mpicc cpi.c //默认输出文件名a.out ###不加o参数,则默认输出文件名为a.out
icpi.c\ hellow.c\cpi.c这三个测试c语言可在mpich的下载文件中获得 在mpich-3.0.4/examples目录下,mpich下载地址 |
测试mpi程序
#mpdrun -np 4 ./a.out //-n或-np启动的进程数
或者
mpirun -np 4 /.out //-n或-np启动的进程数,n与np的参数意义一样
[root@mpitest ~]# mpdrun -np 4 ./a.out Hello world: rank 0 of 4 running on mpitest Hello world: rank 1 of 4 running on mpitest Hello world: rank 2 of 4 running on mpitest Hello world: rank 3 of 4 running on mpitest [root@mpitest ~]# mpirun -n 4 /root/a.out Hello world: rank 0 of 4 running on mpitest Hello world: rank 1 of 4 running on mpitest Hello world: rank 2 of 4 running on mpitest Hello world: rank 3 of 4 running on mpitest
[root@mpitest ~]# mpirun -n 4 /root/cpi Process 2 of 4 is on mpitest Process 0 of 4 is on mpitest Process 1 of 4 is on mpitest Process 3 of 4 is on mpitest pi is approximately 3.1415926544231239, Error is 0.0000000008333307 wall clock time = 0.001607 [root@mpitest ~]# |
#mpiexec [-h or -help or --help] //查看帮助文件
#mpdhelp 显示所有mpd命令帮助
启动集群上的mpd服务
# mpdboot -n process-num -f mpd.hosts ###启动 process-num个进程,mpd.hosts是前面创建的文件/root/mpd.hosts。
#mpdroot -n <节点个数> -f mpd.hosts 这一命令将同时在mpd.hosts文件中指定的节点上启动mpd管理器
例如:mpdboot -n 4 -f /root/mpd.hosts
mpi默认是使用ssh来登陆集群里的其他机器,也可以使用rsh来登陆集群里的其他机器来启动mpd服务。
只要使用-rsh选项就可以指定用ssh或rsh:
#mpdboot --rsh=rsh -n process-num -f hostfile
或#mpdboot --rsh=ssh -n process-num -f hostfile
使用MPIEXEC|MPIRUN来执行多节点mpi任务:
#mpiexec -np 4 ./a.out //a.out所有节点在相同的路径下,需都有a.out文件
或mpiexec -machinefile filename -np 4 ./a.out ##通过filename来指定计算节点参与计算。
[root@master ~]# mpirun -machinefile maname -np 10 /data/cpi Process 1 of 10 is on compute02 Process 8 of 10 is on compute01 Process 2 of 10 is on compute03 Process 3 of 10 is on compute04 Process 9 of 10 is on compute02 Process 0 of 10 is on compute01 Process 5 of 10 is on compute06 Process 6 of 10 is on compute07 Process 7 of 10 is on compute08 Process 4 of 10 is on compute05 pi is approximately 3.1415926544231261, Error is 0.0000000008333330 wall clock time = 0.011969 |
单机测试
./icpi
Enter the number of intervals: (0 quits) 1000000000
pi is approximately 3.1415926535921401, Error is 0.0000000000023470
wall clock time = 46.571311
Enter the number of intervals: (0 quits) 10000
pi is approximately 3.1415926544231341, Error is 0.0000000008333410
wall clock time = 0.000542
Enter the number of intervals: (0 quits) 0
集群测试
mpdboot -n 2 -f mpd.hosts
mpiexec -n 2 /root/icpi
Enter the number of intervals: (0 quits) 1000000000
pi is approximately 3.1415926535899761, Error is 0.0000000000001830
wall clock time = 15.530082
Enter the number of intervals: (0 quits) 10000
pi is approximately 3.1415926544231323, Error is 0.0000000008333392
wall clock time = 0.006318
Enter the number of intervals: (0 quits) 0
mpdallexit
由上述测试的结果可以看出使用单机单进程运行,intervals设为1000000000,耗时46.571311秒,而用两台机器双进程则只有15.530082秒,明显快很多,并行运算还是很有效果的。
不过,如果我们把intervals改为10000,单机运行只用了0.000542秒,而两台机器却花了0.006318秒。
这是因为并行运算过程中,参与运算的机器之间有大量的消息队列需要传递,如果计算量不大的话,花在了这上面的时间影响会比较明显,因而反不如单机版的来得快
可参考文档见附件