MPI并行计算环境的建立
假设机群是3个节点。
笔者并没采用真实的3台机器,而是利用虚拟机(VMware Workstation6.5)在一台装有XP系统的机器上安装多个Linux系统进行模拟。
注意事项:
(1)因为笔者采用mpich2-1.3.2p1.tar.gz,此版本对gcc、autoconf等软件包版本要求较高,为避免出错,尽量安装最新的Linux系统。
(2)在用VMware Workstation安装Linux系统时可能会遇到磁盘类型不兼容的问题,笔者采用的版本就出现了这样的问题,解决要点如下:
a.启动Workstation选择创建定制的虚拟机;
b.SCSI适配器类型选LSI Logic (Linux内核在2.4以下的选择BusLogic);
c.选择虚拟磁盘类型(IDE)。
(3)安装VMware Workstation tools。
Linux系统启动后,选择菜单栏——虚拟机——安装VMware tools,按照提示将相应的安装包复制到你想要的目录下,执行命令:
tar zxvf vmware-tools.tar.gz
cd vmware-tools(进入解压目录)
./install.pl(因版本不同,名字不一定相同,读者注意,执行名字类似的即可)
192.168.1.2 node1
192.168.1.3 node2
192.168.1.4 node3
通过以上配置后节点之间能够通过各节点的机器名称相互访问。例如,可以通过ping node2进行测试。
注意事项:
该测试必须在关闭Linux防火墙的条件下进行,否则可能失败。
永久生效:chkconfig iptables on/off(重启生效)
即时生效:service iptables start/stop(重启失效)
由于MPICH的安装目录和用户可执行程序在并行计算时需要在所有节点保存副本,而且目录要相互对应,每次一个节点一个节点的复制非常麻烦,采用NFS文件系统后可以实现所有节点内容与主节点内容同步更新,并自动实现目录的对应。NFS文件系统使得所有机器都能以同样的路径访问服务器上保存的文件,访问方法如同对本地文件的访问。通常我们会将MPICH的安装目录及并行程序存放目录配置为NFS共享目录,这样可以省去将文件向各个节点复制的麻烦,大大提高工作效率。
NFS文件系统的配置方法示例如下(假设NFS服务器IP为192.168.1.2,配置需要在root用户下完成)。
(1)/etc/exports文件配置
在文件/etc/exports中增加以下几行:
/usr/cluster 192.168.1.3(rw,sync,no_root_squash,no_subtree_check)
/usr/cluster 192.168.1.4(rw,sync,no_root_squash,no_subtree_check)
这几行文字表明NFS服务器向IP地址为192.168.1.3,192.168.1.4的2个节点共享其/usr/cluster目录(目录必须存在),并使这些节点具有相应的权限(可查询相关的文档)。如有更多的节点可按此方法填写。
(2)启动NFS服务
启动NFS服务只需要以下两个命令:
service portmap start
注:在最新的内核中,NFS守护进程改为rpcbind,如是新内核,启动NFS守护进程的命令是“service rpcbind start”。
service nfs start
到此IP为192.168.1.2的服务器已可以向其他两个节点提供/usr/cluster目录的文件共享。
(1)建立共享目录。
建立与服务器相同的共享目录用于共享服务器文件:
mkdir /usr/cluster
(2)查看服务器已有的共享目录(这步可省略)。
showmount -e 192.168.1.2
通过这条命令我们可以查看IP地址为192.168.1.2服务器可以共享的目录情况。
(3)挂载共享目录。
mount -t nfs 192.168.1.2:/usr/cluster /usr/cluster
这一命令将NFS服务器192.168.1.2上的共享目录挂载到本地/usr/cluster目录下。我们也可在所有子节点的/etc/fstab文件中输入以下的代码,使文件系统在启动时实现自动挂载NFS:
192.168.1.2:/usr/cluster /usr/cluster nfs defaults 0 0
至此我们已可以实现对NFS共享目录的本地访问,所有子节点的/usr/cluster文件夹都共享了NFS服务器的同名文件夹的内容,我们可以像访问本地文件一样访问共享文件。MPICH的安装目录和用户存放并行程序的文件夹都需要实现NFS共享,从而避免了每次向各节点发送程序副本。
由于MPI并行程序需要在各节点间进行信息传递,所以必须实现所有节点两两之间能无密码访问。节点间的无密码访问是通过配置ssh公钥认证来实现的。
例如,对新用户user配置ssh公钥认证,先在node1上做以下操作。
(1)生成了私钥id_dsa和公钥id_dsa.pub,具体操作方法如下。
mkdir ~/.ssh
cd ~/.ssh
ssh-keygen -t dsa
系统显示一些信息,遇到系统询问直接回车即可。
(2)将该密钥用作认证,进行访问授权。按如下命令在node1执行。
cp ~/.ssh/id_dsa.pub ~/.ssh/authorized_keys
chmod go-rwx ~/.ssh/authorized_keys
(3)将~/.ssh目录下的文件复制到所有节点。
scp -r ~/.ssh node2:
scp -r ~/.ssh node3:
(4)检查是否可以直接(不需要密码)登录其他节点。
ssh node1
ssh node2
如能两两之间不需要密码登录其他节点,则表明配置成功。
tar zxvf mpich2-1.3.2p1.tar.gz
解压完成后将在当前目录生成一个MPICH文件目录。
注意事项:
最新版本mpich2的进程管理默认使用hydra,而不是mpd。如果你要使用mpd,使用./configure --with-pm=mpd:hydra
./configure --prefix=/usr/cluster/mpich2 --with-pm=mpd:hydra
根据以上配置MPICH将安装在目录/usr/cluster/mpich2,并确保所有节点已建立针对该目录的NFS共享。
node1
node2
node3
node4
注意,文中包含自己的目的是为了在只有一个节点时也可以模拟并行计算环境。
PATH="$PATH:/usr/cluster/mpich2/bin"
这一行代码将MPI的安装路径加入用户的当前路径列表。重新打开命令行窗口后生效。
其中,“123456”为识别口令,在所有节点中都建立该文件并保持口令一致,口令可自己设定。
进入/usr/MPICHI-install/etc/目录执行以下命令
touch mpd.conf
chmod 600 mpd.conf
mpd &
mpd &为启动本地mpd的命令,我们也可以采用以下命令同时启动mpd.hosts中所列节点的mpd。
mpdboot -n <节点个数> -f mpd.hosts
这一命令将同时在mpd.hosts文件中所指定的节点上启动mpd管理器。
mpd启动后执行“mpdtrace -l”可以查看各个节点机器名。
运行命令如下:
mpirun -np 3 ./cpi
mpi的编译命令为mpicc,如编译test.c可用如下命令:
mpicc test.c -o test
mpirun –np 3 ./test