下面以兩台計算機為例,配置MPI并行環境。
一、修改機器主機名
為了友善我們給兩台機器分别取名為 master(作為主節點) 和 node1。(不改也無所謂,就是不友善而已)
sudo vi /etc/hostname
二、給機器配置固定 IP
(如果已經配好固定ip,就忽略這一步。)
配置IP:(假設分别配置為 192.168.0.100 和 192.168.0.101)
sudo vi /etc/network/interfaces
打開上述配置檔案 之後 ,編輯内容如下:(下面是 master 節點的,node1 改一下 address 就好)
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
配置兩台機器上的 hosts 檔案:
sudo vi /etc/hosts
修改上述檔案前幾行:(兩台機器做一樣的配置)
127.0.0.1 localhost
192.168.0.100 master
192.168.0.101 node1
四、挂載 NFS 檔案系統
在兩台機器上都執行下述指令:
sudo apt-get install nfs-kernel-server nfs-common
sudo mkdir /mirror
這樣一來,我們就在根目錄下建立了一個 /mirror 目錄,接下來我們将通過挂載把該目錄作為所有節點的共享目錄,那麼,我們後續安裝 mpich2 時,隻要安裝到該目錄,我們就隻需要在主節點 master 上安裝一次即可。
如果目前你所在的使用者組不是 root 的話(假設使用者組為heregy),那麼還需将剛剛建立的 /mirror 目錄的權限改為 heregy:
sudo chown heregy /mirror
然後,我們還要編輯【主節點】的 /etc/exports 檔案,對各個節點進行共享目錄的授權,在檔案中添加以下幾行:
/mirror 192.168.0.100(rw,sync)
/mirror 192.168.0.101(rw,sync)
接下來,就可以在 node1 上執行下述指令實作挂載了:
sudo mount master:/mirror/ /mirror/
五、實作主從節點之間 SSH 無密碼互訪
首先,給兩台機器安裝SSH服務,執行如下指令:
sudo apt-get install ssh
安裝完成之後,兩節點分别執行:
ssh-keygen -t rsa
一直回車,即可生成 .ssh 目錄。
然後,在 master 節點上:
進入 .ssh 目錄:
cd ~/.ssh
生成 authorized_keys 檔案:
cat id_rsa.pub >> authorized_keys
拷貝 authorized_keys 到 node1 節點上:
scp authorized_keys node1:~/.ssh/
在 node1 節點上的操作基本相同,指令如下:
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
六、安裝 mpich2
首先,下載下傳 mpich2 的安裝包到主節點的 /mirror 目錄下,指令如下:
wget -c http://www.mpich.org/static/downloads/3.0.4/mpich-3.0.4.tar.gz
然後,在 /mirror 目錄下解壓:
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
七、配置 mpich2 的環境變量
打開 ~/.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
然後,需要配置 /etc/environment 檔案使 ssh 能找到 mpich2 的安裝目錄:
sudo vi /etc/environment
在該檔案的 PATH 環境變量中添加 /mirror/mpich2/bin(不同路徑用冒号隔開),效果如下:
PATH="/mirror/mpich2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
接下來,用以下指令測試 mpich2 是否安裝成功:
which mpd
which mpiexec
which mpirun
如果安裝正确,執行結果應該分别為:
/mirror/mpich2/bin/mpd
/mirror/mpich2/bin/mpiexec
/mirror/mpich2/bin/mpirun
八、配置 mpd
首先,在兩個節點上執行指令:
vi ~/mpd.hosts
然後,寫入所有節點的hostname:
master
node1
然後,需要配置 ~/.mpd.conf 檔案,(在所有節點上),使用如下指令:
echo secretword=xxx >> ~/.mpd.conf //xxx随便填
将 ~/.mpd.conf 檔案的權限設定為 600:
sudo chmod 600 ~/.mpd.conf
這樣一來,mpd 完成配置,可以使用以下指令測試 mpich2 是否正常工作:
mpd & //啟動該節點
mpdboot -n 2 -f ~/mpd.hosts //啟動mpd.hosts中的兩個節點
mpdtrace //檢視已啟動的節點
mpdallexit //關閉所有運作節點
九、執行 mpi 程式
這裡直接使用 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個節點上。
十、MPI 程式編譯
直接貼一個 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