Duangw

并行计算

 

主要内容:基本说明系统安装1系统安装2MPICH2安装简单用法

 

1 基本说明

这里的并行计算环境基于MPICH2OpenMP,其中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 安装帮助系统

添加软件包:

2.3 安装diff

2.4 安装网络工具

2.5 安装库

2.6 安装开发工具

2.7 配置网络

执行配置工具:

# netconfig

涉及文件:

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 配置网络

涉及文件:

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

主要命令:

以上所有步骤都只在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