MPICH安裝與設定
MPICH是一個免費的,便攜式的MPI實作訊息傳遞庫的標準。它實現MPI標準的所有版本,包括MPI-1,MPI-2,MPI-2.1,MPI-2.2和MPI-3。
將MPI與多核處理器或多處理器節點配合使用有兩種常見方法:
- 每個核使用一個MPI行程(這裡,一個核定義為程序計數器和一組算術,邏輯和加載/存儲單元)。
- 每個節點使用一個MPI行程(這裡,一個節點定義為共享單個地址空間的核心集合)。使用線程或編譯器提供的並行性來利用多個內核。
- MPICH自動識別多核架構並優化此類平台的通信。不需要特殊的配置選項。
Ubuntu 16.04(Xenial)安裝
官方網站有提供從原始碼編譯的安裝教學(3.2)
直接輸入 sudo apt-get install mpich libmpich-dev 即可,預設版本為3.2。
# mpich安裝檔案
/.
/usr
/usr/bin
/usr/bin/hydra_pmi_proxy
/usr/bin/parkill
/usr/bin/hydra_persist
/usr/bin/hydra_nameserver
/usr/bin/mpiexec.hydra
/usr/share
/usr/share/doc
/usr/share/doc/mpich
/usr/share/doc/mpich/copyright
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/mpiexec.mpich.1.gz
/usr/share/man/man1/hydra_persist.1.gz
/usr/share/man/man1/hydra_nameserver.1.gz
/usr/share/man/man1/parkill.1.gz
/usr/share/man/man1/hydra_pmi_proxy.1.gz
/usr/bin/mpiexec.mpich
/usr/bin/mpirun.mpich
/usr/share/doc/mpich/changelog.Debian.gz
/usr/share/man/man1/mpiexec.hydra.1.gz
/usr/share/man/man1/mpirun.mpich.1.gz
# libmpich-dev
/.
/usr
/usr/bin
/usr/bin/mpicxx.mpich
/usr/bin/mpicc.mpich
/usr/bin/mpichversion
/usr/bin/mpifort.mpich
/usr/bin/mpivars
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/pkgconfig
/usr/lib/x86_64-linux-gnu/pkgconfig/mpich.pc
/usr/lib/x86_64-linux-gnu/libmpichfort.a
/usr/lib/x86_64-linux-gnu/libmpichcxx.a
/usr/lib/x86_64-linux-gnu/libmpich.a
/usr/lib/mpich
/usr/include
/usr/include/mpich
/usr/include/mpich/mpi.mod
/usr/include/mpich/mpi.h
/usr/include/mpich/opa_config.h
/usr/include/mpich/opa_util.h
/usr/include/mpich/mpi_sizeofs.mod
/usr/include/mpich/mpi_base.mod
/usr/include/mpich/opa_primitives.h
/usr/include/mpich/mpio.h
/usr/include/mpich/primitives
/usr/include/mpich/primitives/opa_nt_intrinsics.h
/usr/include/mpich/primitives/opa_gcc_ia64.h
/usr/include/mpich/primitives/opa_gcc_sicortex.h
/usr/include/mpich/primitives/opa_by_lock.h
/usr/include/mpich/primitives/opa_gcc_intel_32_64_barrier.h
/usr/include/mpich/primitives/opa_gcc_intel_32_64_ops.h
/usr/include/mpich/primitives/opa_emulated.h
/usr/include/mpich/primitives/opa_unsafe.h
/usr/include/mpich/primitives/opa_gcc_intel_32_64.h
/usr/include/mpich/primitives/opa_gcc_intel_32_64_p3barrier.h
/usr/include/mpich/primitives/opa_gcc_ppc.h
/usr/include/mpich/primitives/opa_gcc_intrinsics.h
/usr/include/mpich/primitives/opa_sun_atomic_ops.h
/usr/include/mpich/primitives/opa_gcc_intel_32_64_p3.h
/usr/include/mpich/mpif.h
/usr/include/mpich/opa_queue.h
/usr/include/mpich/mpicxx.h
/usr/include/mpich/mpi_constants.mod
/usr/include/mpich/mpiof.h
/usr/share
/usr/share/doc
/usr/share/doc/libmpich-dev
/usr/share/doc/libmpich-dev/copyright
/usr/share/doc/libmpich-dev/README.Debian
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/mpicxx.mpich.1.gz
/usr/share/man/man1/mpif77.mpich.1.gz
/usr/share/man/man1/mpivars.1.gz
/usr/share/man/man1/mpicc.mpich.1.gz
/usr/share/man/man1/mpifort.mpich.1.gz
/usr/share/man/man1/mpichversion.1.gz
/usr/bin/mpif90.mpich
/usr/bin/mpif77.mpich
/usr/lib/x86_64-linux-gnu/libmpl.so
/usr/lib/x86_64-linux-gnu/libmpichfort.so
/usr/lib/x86_64-linux-gnu/libmpichcxx.so
/usr/lib/x86_64-linux-gnu/libmpich.so
/usr/lib/x86_64-linux-gnu/libopa.so
/usr/lib/mpich/lib
/usr/lib/mpich/include
/usr/share/doc/libmpich-dev/changelog.Debian.gz
/usr/share/man/man1/mpif90.mpich.1.gz
輸入 mpiexec --version 測試安裝是否成功。
- 注意若系統有裝過其它MPI系統,如Intel MPI時,要注意呯叫的mpiexec版本。
- 16.04的安裝路徑為 /usr/bin/mpiexec 。
- Intel MPI安裝路徑為 /opt/intel/compilers_and_libraries_2017.0.098/linux/mpi/intel64/bin/mpiexec
- 可用 which mpicc mpiexec 來檢定檔案路徑。
編譯檔案的指令與一般gcc類似,如 mpicc -o cpi cpi.c
- 預設使用gcc,如果有裝其它的compiler如intel cc時,可指定編譯器 mpicc -cc=icc -o cpi cpi.c .
- 也可以在環境變數中永久指定使用的編譯器 export MPICH_CC=icc .
可用 mpiexec -n 2 hostname 測試結果。
而 mpichversion 可用於確認編譯MPI時所使用的參數。
- --with-device=,選擇溝通裝置,有ch3:nemesis(預設)、ch3:sock可選
執行mpich3套件中的範例測試: mpiexec -n 9 ./mpich3/build/examples/cpi
- 也可用 mpiexec -f machinefile -n 9 ./mpich3/build/examples/cpi ,其中machinefile為安裝有MPICH且免ssh登入主機的IP。
- machinefile內容如下:
192.168.1.21 192.168.1.22:1 192.168.1.23:2 192.168.1.24:4
- 有四台機器,IP位址分別是192.168.1.21、22、23、24。
Process manager
- MPICH使用PMI介面將MPI程式碼與process manager隔開,目前有三種process manager:
- hydra: default process manager
- gforker: It is useful both for debugging and for running on shared memory multiprocessors.
在LAN中執行MPI
ssh設定
- 確認每一台機器已經安裝了ssh服務: sudo apt-get install ssh
- 啟動ssh服務: sudo service ssh start
- 確認防火牆已開啟ssh port: iptables -A INPUT -p TCP -i $EXTIF --dport 22 -j ACCEPT
啟用ssh免密碼登入
輸入ssh-keygen (-t rsa) 產生rsa-key,會在$HOME/.ssh/目錄下產生 id_rsa 與 id_rsa.pub兩個密鑰檔案,第一個為私鑰,第二個為公鑰,詢問passphrase時均不輸入任意東西。
將本機產生的id_rsa.pub檔案內容,存在遠端主機同名使用者的 $HOME/.ssh/authorized_keys2 檔案中。
- .ssh資料夾中的 id_rsa, id_rsa.pub, authorized_keys權限應設為500(只有使用者可讀寫)。
sshfs
- 一般的教學使用NFS,而我們使用sshfs簡化設定。
- 首先安裝sshfs sudo apt-get install sshfs
- 安裝完成後,使用者即可用ssh來掛載資料夾,假設共同資料夾位於192.168.1.1中,目錄為share_folder,則輸入以下命令可掛載: sshfs [email protected]:/remote/share_folder /local/share_folder (建議遠端與本地端使用相同資料夾名稱)。
平行執行程式
首先在master主機的/etc/hosts檔案下編寫可使用的節點:
192.168.1.1 master 192.168.1.2 client 192.168.1.3 client2 192.168.1.4 client3
- 注意master必須知道所有子節點的IP,而slave只須知道自已與master的IP即可。
MPI執行命令格式: mpiexec -n
./a.out 將MPI編譯過的程式(假設為mpi_hello)放入master主機的share_folder資料夾中。
- 命令 mpirun -np 5 -hosts client,master ./mpi_hello,會去host檔中找對應的主機名稱。
- 注意程式只能在本機執行、或是本機加上遠端主機執行,而不可只用遠端主機執行。
- 即此命令合法 mpirun -np 10 --hosts master ./mpi_hello
- 但是此命令不合法 mpirun -np 10 --hosts client,client2 ./mpi_hello
MPICH with PBS
Hydra process manager原生支援PBS系統。
MPICH在PBS中有兩種啟動程式的方式。
- 使用Hydra's mpiexec
- 使用OSC (Ohio supercomputer center) mpiexec
- 通常執行程式時,不須特別指定resource manager(如PBS), MPI會自動偵測使用。
- e.g. mpiexec ./app , Hydra會自動與PBS處理執行程式。