MPI是一个库,而不是一门语言。许多人认为,MPI就是一种并行语言,这是不准确的。但是,按照并行语言的分类,可以把FORTRAN+MPI或C+MPI看作是一种在原来串行语言基础之上扩展后得到的,并行语言MPI库可以被FORTRAN77/C/Fortran90/C++调用,从语法上说,它遵守所有对库函数/过程的调用规则,和一般的函数/过程没有什么区别。
MPI已在IBM PC机上、MS Windows上、所有主要的Unix工作站上和所有主流的并行机上得到实现。使用MPI作消息传递的C或Fortran并行程序可不加改变地运行在IBM PC、MS Windows、Unix工作站、以及各种并行机上。
高性能并行计算计算机技术由于具有巨大的数值计算和数据处理能力,在国内外受到高度重视,他在科学研究、工程技术以及军事等方面的应用,已经取得巨大的成就。并行计算就是通过把一个大的计算问题分解成许多彼此独立且有相关的子问题,然后把他们散列到各个节点机上并行执行从而最终解决问题的一种方法。
一、安装环境
CentOS 6.4 最小化图形安装,保证每个节点的sshd服务能正常启动,确保防火墙与selinux已经关闭,所需软件: Intel_ Fortran,Intel_C++,Intel_ MPI
二、设置通过主机名无密码登录
1、通过主机名访问
为每个节点分配IP地址,IP地址***连续分配,配置/etc/hosts文件,实现IP地址和机器的对应解析。可以在所有机器上使用同样的/etc/hosts 文件,它包含如下形式的内容:
- 10.12.190.183 dell
- 10.12.190.187 lenovo
- ……
2、计算节点之间的无密码访问
假设 A(110.12.190.183)为客户机器,B(10.12.190.187)为目标机,
- #ssh-keygen -t rsa #使用rsa加密,默认就是rsa加密
显示信息如下,遇到系统询问直接回车即可。
- 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. |
- | ... |
- +-----------------+
将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub。
将A的~/.ssh/ id_rsa.pub 文件复制到B机器的 .ssh 目录, 并 cat id_rsa.pub >> ~/.ssh/authorized_keys,同样方法,把B的~/.ssh/ id_rsa.pub也复制到A机器上。
设置authorized_keys权限:
- #chmod 600 authorized_keys
设置.ssh目录权限:
- #chmod 700 -R .ssh
如果使用ssh-copy-id命令,可以更方便把本地主机的公钥复制到远程主机的authorized_keys文件上,ssh-copy-id 也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限。
- #ssh-copy-id –i ~/.ssh/id_rsa.pub 10.12.190.187
完成以上操作之后,用户从本地机器到远程机器就不需要用密码了,文件和目录的权限千万别设置成chmod 777.这个权限太大了,不安全,数字签名也不支持。
也可以用一台机器生成ssh-keygen,将.ssh目录连同id_rsa,authorized_keys一起复制到每个节点上去。检查是否可以直接(不需要密码,询问时输入yes回车)登录其他节点:
- ssh node1
- ssh node2
- ssh node3
- ssh node4
如能任意两节点之间不需要密码登录其他节点则表明配置成功。
三、NFS文件系统的配置
方法示例如下(假设NFS 服务器IP 为10.12.190.183,配置需在root用户下完成):
服务器端配置方法(下面的配置只在主节点进行):
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 服务器向IP 地址为10.12.190.183,10.12.190.185,10.12.190.185 的三个节点共享其/home/cluster目录,并使这些节点具有可读写权限。如有更多的节点可按此方法填写。
接着执行如下命令,启动端口映射:
- # /etc/rc.d/init.d/rpcbind start (注:在***内核中NFS守护进程改为rpcbind,如是旧内核启动NFS守护进程的命令是 service portmapstart)
***执行如下命令启动NFS 服务,此时NFS 会激活守护进程,然后就开始监听 Client 端的请求:
- # /etc/rc.d/init.d/nfs start
- # chkconfig nfs on
也可以重新启动Linux 服务器,自动启动NFS 服务。
2、客户端配置方法(需要在所有子节点做同样的配置)
建立与服务器相同的共享目录用于共享服务器文件:
- mkdir /usr/cluster
查看服务器已有的共享目录(这步可省略)
- showmount -e 10.12.190.183
通过这条命令我们可以查看IP地址为10.12.190.183的服务器可以共享的目录情况。
挂载共享目录:
- mount -t nfs 10.12.190.183:/home/cluster /home/cluster
这一命令将 NFS 服务器10.12.190.183上的共享目录挂载到本地/home/cluster 目录下。我们也可在所有子节点的/etc/fstab 文件中输入以下的代码,使文件系统在启动时实现自动挂载NFS:
- 10.12.190.183:/home/cluster /home/cluster nfs defaults 0 0
至此我们已可以实现对 NFS 共享目录的本地访问,所有子节点的/home/cluster 文件夹都共享了NFS 服务器的同名文件夹的内容,我们可以像访问本地文件一样访问共享文件。用户存放并行程序的文件夹都可以实现NFS 共享,从而避免了每次向各节点发送程序副本。
四、安装Intel_C++
- #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编译器
- #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
1、安装与设置
安装前一定要将Fortran编译器安装好,c++放到***没有影响,其它版本MPI就需要先将前2个软件安装好,设置好环境变量,***在安装MPI程序,如开源的mpich。
- #tar fxvz l_mpi_p_4.1.3.045.tgz
- #cd l_mpi_p_4.1.3.045
- #./install.sh
设置环境变量:
- #vi /etc/profile
添加一行source /opt/intel/impi/4.1.3.045/bin64/mpivars.sh。
测试环境变量设置:
- #which mpd
- #which mpicc
- #which mpiexec
- #which mpirun
如果能看到所有命令的路径说明,安装设置成功了。
修改/etc/mpd.conf文件,
- vi /etc/mpd.conf
设置文件读取权限为只有自己能读写:
- chmod 600 /etc/mpd.conf
非root用户在家目录创建内容相同的.mpd.conf,每个节点都要添加:
创建主机名称集合文件/root/mpd.hosts:
- #vi mpd.hosts
文件内容如下:
- dell #主机名1 ,(主机名:数字 可以指定节点开启的进程数 dell:2)
- lenovo #主机名2
在协处理器上***运行MPI应用之前,请将MPI库复制到该系统的所有节点以下目录。
- # 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官方文档的操作步骤,个人感觉比较麻烦,没有采用这种方法。
我使用的是将/opt设置成nfs共享,然后挂载到每个节点下的相同目录,设置一下环境变量就可以了。服务器端一定要将Intel_ Fortran,Intel_C++,Intel_ MPI全部安装上,各个节点只需要MPI就可以了,服务器端将程序编译好后,分发给各个节点,然后这个程序就可以通过MPI接口,进行并行运算了。
2、MPI使用方法
MPI采用mpd服务来对进程进行管理,使用mpiexec或mpirun运行mpi程序。
启动单机上的mpd服务:
- # mpd &
查看mpd服务:
- # mpdtrace 查看主机名
- # mpdtrace -l 查看主机名和端口号
关闭mpd进程管理:
- #mpdallexit
测试mpi程序,
- #mpicc -o Hello Hello.c //生成可执行文文件Hello
- #mpicc cpi.c //默认输出文件名a.out
- #mpdrun -np 4 ./a.out //-n或-np启动的进程数
- #mpiexec [-h or -help or --help] //查看帮助文件
启动集群上的mpd服务:
- # mpdboot -n process-num -f mpd.hosts
启动 process-num个进程,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
关闭mpd服务:
- #mpdallexit
使用MPIEXEC|MPIRUN来执行mpi任务:
- #mpiexec -np 4 ./a.out //a.out所有节点在相同的路径下,需都有a.out文件
- 或mpiexec -machinefile filename -np 4 ./a.out
http://blog.sina.com.cn/s/blog_605f5b4f0100sw3j.html
运行结果如下:
- [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
注意:以上的环境变量设置好后都需要重启,或者使用source命令重新执行一下文件。