天天看點

Ubuntu下MPI并行環境配置一、修改機器主機名二、給機器配置固定 IP三、配置機器 hosts四、挂載 NFS 檔案系統五、實作主從節點之間 SSH 無密碼互訪六、安裝 mpich2七、配置 mpich2 的環境變量八、配置 mpd九、執行 mpi 程式十、MPI 程式編譯

下面以兩台計算機為例,配置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
           

繼續閱讀