2018年9月25日 星期二

比較MPI與OpenMP的差異

會有MPI與OpenMP的差異起因於:
  • 以前的主機只有單CPU,為了要讓程式可以透過網路在不同的主機上面平行處理,因此發展出了 MPI
  • 後來CPU從單核心變成的多核心,為了讓程式可以在單機多核心上面平行處理,因此發展出了 OpenMP
  • 現代的機器已經是多CPU多核心,所以出現了 Hybrid OpenMP+MPI,先透過MPI將大工作分成小工作平行給不同的CPU,再透過OpenMP將這些小工作分成執行緒平分給不同的核心去執行
不管是上述的哪一種,都是讓平行化程式的解法


I. MPI與OpenMP差別

  • MPI(Message Passing Interface)
    1. 讓程式可以跨計算節點(nodes)平行跑
    2. 記憶體使用:Distributed memory架構
      CPU的核心使用不同的記憶體,透過網路溝通
    3. 平行出來的部分叫做rank,每個rank上跑的程序叫做MPI-thread
    4. 操作多台電腦的平行程式,使用MPI
  • OpenMP(Open Multi-Processing)
    1. 讓程式可以在單節點上,使用多核心(cores)平行跑
    2. 記憶體使用:Shared Memory Processor(SMP)架構
      CPU的核心使用同節點上的記憶體
    3. 平行出來的部分叫做thread,跑的程序叫做omp-thread
    4. 操作單台電腦上多核心的平行程式,使用OpenMP

II. 編譯方式的差別(以C程式用GCC編譯為例子)

  • MPI:先去設定MPI的環境變數,再用mpicc編譯平行程式mpi.exe
    • source mpi.bashrc
    • mpicc mpi_src.c -o mpi.exe 
  • OpenMP:在gcc編譯的後面加上OpenMP的參數
    • gcc omp_src.c -o omp.exe -fopenmp

III. 執行方式的差別(上面編譯的C程式)

  • MPI:下面的例子是開3個平行,先設定MPI環境變數,用mpirun下去跑
    • source mpi.bashrc
    • mpirun -np 3 -f nodeFile mpi.exe
  • OpenMP:下面的例子是開6個平行下去跑,設定thread number
    • export OMP_NUM_THREADS=6
    • ./omp.exe
注意,使用mpirun執行時因為要跨節點跑,所以會有一個nodeFile。另外根據網路架構的不同,還有其他的參數可以使用,像是"--mca pml cm --mca mtl psm2"。這方面參考MPI手冊

參考資料

_EOF_

沒有留言:

張貼留言