下面以两台计算机为例,配置MPI并行环境。
为了方便我们给两台机器分别取名为 master(作为主节点) 和 node1。(不改也无所谓,就是不方便而已)
sudo vi /etc/hostname
(如果已经配好固定ip,就忽略这一步。)
配置IP:(假设分别配置为 192.168.0.100 和 192.168.0.101)
sudo vi /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.0.100
netmask 255.255.255.0
gateway 192.168.0.1
然后配置 DNS 服务器:
sudo vi /etc/resolv.conf
nameserver xxx.xxx.xxx.xxx(查看自己的网络连接的dns)
然后重启网络服务:
sudo /etc/init.d/networking restart
配置两台机器上的 hosts 文件:
sudo vi /etc/hosts
修改上述文件前几行:(两台机器做一样的配置)
127.0.0.1 localhost
192.168.0.100 master
192.168.0.101 node1
sudo apt-get install nfs-kernel-server nfs-common
sudo mkdir /mirror
如果目前你所在的用户组不是 root 的话(假设用户组为heregy),那么还需将刚刚创建的 /mirror 目录的权限改为 heregy:
sudo chown heregy /mirror
然后,我们还要编辑【主节点】的 /etc/exports 文件,对各个节点进行共享目录的授权,在文件中添加以下几行:
/mirror 192.168.0.100(rw,sync)
/mirror 192.168.0.101(rw,sync)
sudo mount master:/mirror/ /mirror/
sudo apt-get install ssh
安装完成之后,两节点分别执行:
ssh-keygen -t rsa
进入 .ssh 目录:
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
scp authorized_keys node1:~/.ssh/
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
scp authorized_keys master:~/.ssh/
sudo iptables –P INPUT ACCEPT
sudo iptables –P OUTPUT ACCEPT
sudo ufw disable
wget -c http://www.mpich.org/static/downloads/3.0.4/mpich-3.0.4.tar.gz
cd /mirror
mkdir mpich2
tar zxvf mpich-3.0.4.tar.gz
解压完毕后,开始安装:
cd mpich-3.0.4
./configure --enable-fc --enable-cxx --enable-romio --enable-threads=multiple --prefix=/mirror/mpich2 --with-pm=mpd
make
make install
打开 ~/.bashrc 文件:
vi ~/.bashrc
PATH=$PATH:/mirror/mpich2/bin
export PATH
MPI_LIB=$MPI_LIB:/mirror/mpich2/lib
export MPI_LIB
MPI_INCLUDE=$MPI_INCLUDE:/mirror/mpich2/include
export MPI_INCLUDE
sudo vi /etc/environment
PATH="/mirror/mpich2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
which mpd
which mpiexec
which mpirun
/mirror/mpich2/bin/mpd
/mirror/mpich2/bin/mpiexec
/mirror/mpich2/bin/mpirun
首先,在两个节点上执行命令:
vi ~/mpd.hosts
master
node1
echo secretword=xxx >> ~/.mpd.conf //xxx随便填
将 ~/.mpd.conf 文件的权限设置为 600:
sudo chmod 600 ~/.mpd.conf
mpd & //启动该节点
mpdboot -n 2 -f ~/mpd.hosts //启动mpd.hosts中的两个节点
mpdtrace //查看已启动的节点
mpdallexit //关闭所有运行节点
这里直接使用 mpich2 的安装包中自带的 examples 进行测试。(如果要使用自己写的程序,最好放到 /mirror 目录底下,这样只要在一个节点上上传或修改程序就好了,比较方便)
首先启动并行集群:
mpdboot -n 2 -f ~/mpd.hosts
然后进入安装包解压位置里的 example 目录,接下来就可以直接运行了:
cd /mirror/mpich-3.0.4/examples
mpiexec -n 4 ./cpi
Process 0 of 4 is on master
Process 2 of 4 is on master
Process 1 of 4 is on node1
Process 3 of 4 is on node1
pi is approximately 3.1415926544231243, Error is 0.0000000008333312
wall clock time = 0.002129
可以看出来,4个进程被平均分配到了2个节点上。
直接贴一个 makefile 出来:
CC = mpic++
CFLAGS = -g -I$(HOME)/include -I/mirror/mpich2/include
ALL = main
all: $(ALL)
#.SUFFIXES: .cpp .o
#.cpp.o:
# g++ $(CFLAGS) -c $*.cpp
a.o: a.h
gcc $(CFLAGS) -c a.c
b.o: b.h
g++ $(CFLAGS) -c b.cpp
main.o: main.cpp main.h a.h b.h
$(CC) $(CFLAGS) -c main.cpp
main: main.o a.o b.o
$(CC) $(CFLAGS) -o main main.o a.o b.o
clean:
rm -f $(ALL) *.o