并行计算
主要内容:基本说明、系统安装1、系统安装2、MPICH2安装、简单用法。
1 基本说明
这里的并行计算环境基于MPICH2和OpenMP,其中MPICH2是MPI(Message Passing Interface)的一个开源实现。
操作系统平台为Linux。正式支持OpenMP的gcc版本是4.2,所以这里选择的发行版为Slackware 12.1和Ubuntu-server 8.04,分别作为32位和64位的计算平台。
每种平台目前各配6个节点,将来需要再增加。机器名和IP地址分配如下:
架构 | hostname | ip地址 |
---|---|---|
i386 | pa32-001 | 172.31.2.10/16 |
i386 | pa32-002 | 172.31.2.20/16 |
i386 | pa32-003 | 172.31.2.30/16 |
i386 | pa32-004 | 172.31.2.40/16 |
i386 | pa32-005 | 172.31.2.50/16 |
i386 | pa32-006 | 172.31.2.60/16 |
x86_64 | pa64-001 | 172.31.3.10/16 |
x86_64 | pa64-002 | 172.31.3.20/16 |
x86_64 | pa64-003 | 172.31.3.30/16 |
x86_64 | pa64-004 | 172.31.3.40/16 |
x86_64 | pa64-005 | 172.31.3.50/16 |
x86_64 | pa64-006 | 172.31.3.60/16 |
2 系统安装1-slackware
操作系统的安装方式多样,在硬件资源不紧张的情况下,可以选择较为宽松的安装方式。这里只安装基本软件包。
2.1 基本安装
只安装a/部分的软件包,采用expet模式,选择全部。
安装lilo作为引导管理器。
2.2 安装帮助系统
添加软件包:
- ap/groff-1.19.2-i486-1
- ap/man-1.6f-i486-1
- ap/man-pages-2.79-noarch-1
- ap/texinfo-4.8-i486-1
2.3 安装diff
- ap/diffutils-2.8.1-i486-3
2.4 安装网络工具
- n/gnupg2-2.0.9-i486-1
- n/iptables-1.4.0-i486-1
- n/iputils-s20070202-i486-2
- n/lftp-3.7.0-i486-1
- n/mailx-12.3-i486-1
- n/net-tools-1.60-i486-2
- n/netkit-ftp-0.17-i486-1
- n/network-scripts-12.1-noarch-1
- n/openssh-5.0p1-i486-1
- n/openssl-0.9.8g-i486-1
- n/tcpdump-3.9.8-i486-1
2.5 安装库
- l/glibc-2.7-i486-10
- l/glibc-i18n-2.7-noarch-10
- l/glibc-profile-2.7-i486-10
- l/mpfr-2.3.1-i486-1
- l/ncurses-5.6-i486-3
- l/zlib-1.2.3-i486-2
2.6 安装开发工具
- d/autoconf-2.61-noarch-1
- d/automake-1.9.6-noarch-1
- d/binutils-2.17.50.0.17-i486-1
- d/bison-2.3-i486-1
- d/cvs-1.11.22-i486-1
- d/flex-2.5.33-i486-3
- d/gcc-4.2.3-i486-1
- d/gcc-g++-4.2.3-i486-1
- d/gcc-gfortran-4.2.3-i486-1
- d/gdb-6.8-i486-1
- d/gettext-tools-0.17-i486-2
- d/kernel-headers-2.6.24.5_smp-x86-2
- d/libtool-1.5.24-i486-1
- d/m4-1.4.11-i486-1
- d/make-3.81-i486-1
- d/perl-5.8.8-i486-6
- d/python-2.5.2-i486-1
2.7 配置网络
执行配置工具:
# netconfig
涉及文件:
- /etc/udev/rules.d/70-persistent-net.rules
- /etc/rc.d/rc.inet1.conf
- /etc/hosts
- /etc/HOSTNAME
2.8 安装补丁
获得系统补丁(有的话),进行安装,以修补漏洞。
# upgradepkg *.tgz
2.9 添加普通用户
这里的并行计算都是在受限用户下进行的,不使用root。
# useradd -m -s /bin/bash duangw
2.10 建立目录
以普通用户登录,建立几个这里要用到目录:
$ mkdir tmp $ mkdir src $ mkdir .ssh
3 系统安装2-ubuntu
3.1 基本安装
语言选择english。
只安装openssh服务器。
3.2 配置网络
涉及文件:
- /etc/network/interfaces
- /etc/hostname
- /etc/hosts
- /etc/resolv.conf
- /etc/udev/rules.d/70-persistent-net.rules
3.3 安装开发工具
$ sudo apt-get update $ sudo apt-get install build-essential $ sudo apt-get install manpages-dev $ sudo apt-get install glibc-doc $ sudo apt-get install gdb $ sudo apt-get install gdb-doc $ sudo apt-get install flex $ sudo apt-get install bison $ sudo apt-get install bison-doc $ sudo apt-get install autoconf $ sudo apt-get install automake $ sudo apt-get install libtool
3.4 建立目录
以普通用户登录,建立几个这里要用到目录:
$ mkdir tmp $ mkdir src $ mkdir .ssh
4 MPICH2安装
4.1 安装软件包
该部分的操作都是在普通用户下进行的,这里不使用NFS来共享同一份安装,所以每个节点上都要进行。
从mpich2的主页获得源代码包,这里使用的是mpich2-1.0.7.tar.gz。
软件包里的README含有具体的说明,这里只列出操作步骤。
编译:
$ cd $ mkdir mpich2-install $ tar xzvf mpich2-1.0.7.tar.gz $ cd mpich2-1.0.7 $ ./configure --prefix=$HOME/mpich2-install $ make $ make install
编辑.profile,增加环境变量:
export PATH=$HOME/mpich2-install/bin:$PATH export MANPATH=$HOME/mpich2-install/man:$MANPATH
创建$HOME/.mpd.conf文件,内容:
secretword=XXXXX(具体内容自己设定,但所有节点都必须一致)
修改文件权限:
$ chmod 600 .mpd.conf
单机测试:
$ mpd & $ mpdtrace $ mpdallexit
4.2 多机配置
编辑每个节点的/etc/hosts文件,建立主机名和IP地址的对应关系。以64位环境为例:
172.31.3.10 pa64-001 172.31.3.20 pa64-002 172.31.3.30 pa64-003 172.31.3.40 pa64-004 172.31.3.50 pa64-005 172.31.3.60 pa64-006
这里选择第一个节点为root节点,保证root节点能够通过ssh密钥方式登录其余节点。以32位root节点pa32-001为例:
$ ssh-keygen $ cd ~/.ssh $ scp id_rsa.pub pa32-002:.ssh/authorized_keys $ scp id_rsa.pub pa32-003:.ssh/authorized_keys $ scp id_rsa.pub pa32-004:.ssh/authorized_keys $ scp id_rsa.pub pa32-005:.ssh/authorized_keys $ scp id_rsa.pub pa32-006:.ssh/authorized_keys
在root节点创建~/mpd.hosts文件,内容为所有节点的主机名(每个节点一行)。以32位root节点pa32-001为例:
pa32-001 pa32-002 pa32-003 pa32-004 pa32-005 pa32-006
配置完毕,在root节点上启动mpd:
$ mpdboot -n 6 -f ~/mpd.hosts
多机测试:
$ mpdtrace $ mpdringtest $ mpdringtest 100 $ mpdringtest 1000 $ mpiexec -l -n 30 hostname $ cd ~/mpich2-1.0.7/examples $ mpiexec -n 6 ./cpi
结束,停止mpd:
$ mpdallexit
5 简单用法
5.1 MPICH2
主要命令:
- 使用mpdboot启动服务进程。
- 使用mpicc编译mpi代码。
- 使用mpiexec/mpirun运行程序。
- 使用mpdallexit结束服务进程。
以上所有步骤都只在root节点上进行。
注意:编译生成的目标程序必须在每个参与运算的节点上都要存在(因为不使用NFS)。这里在Makefile中实现:
MPICC := mpicc LDLIBS := -lm TARGETS := sieve all: $(TARGETS) sieve: sieve.o common.o .PHONY: all clean %: %.o $(MPICC) -o $@ $^ $(LDLIBS) @machine=`uname -m`; \ if [ "$$machine" = "x86_64" ]; \ then \ ARCH=64; \ else \ ARCH=32; \ fi; \ echo "cp $@ to pa$${ARCH}-002:"; \ scp $@ pa$${ARCH}-002:src/; \ echo "cp $@ to pa$${ARCH}-003:"; \ scp $@ pa$${ARCH}-003:src/; \ echo "cp $@ to pa$${ARCH}-004:"; \ scp $@ pa$${ARCH}-004:src/; \ echo "cp $@ to pa$${ARCH}-005:"; \ scp $@ pa$${ARCH}-005:src/; \ echo "cp $@ to pa$${ARCH}-006:"; \ scp $@ pa$${ARCH}-006:src/ %.o: %.c mympi.h $(MPICC) -Wall -g -c $< clean: rm -rf $(TARGETS) *.o
5.2 OpenMP
编译OpenMP程序,需要使用特殊选项-fopenmp,如:
$ gcc -fopenmp test.c