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處理執行程式。

參考文獻

results matching ""

    No results matching ""