會有MPI與OpenMP的差異起因於:
- 以前的主機只有單CPU,為了要讓程式可以透過網路在不同的主機上面平行處理,因此發展出了 MPI
- 後來CPU從單核心變成的多核心,為了讓程式可以在單機多核心上面平行處理,因此發展出了 OpenMP
- 現代的機器已經是多CPU多核心,所以出現了 Hybrid OpenMP+MPI,先透過MPI將大工作分成小工作平行給不同的CPU,再透過OpenMP將這些小工作分成執行緒平分給不同的核心去執行
不管是上述的哪一種,都是讓平行化程式的解法
I. MPI與OpenMP差別
- MPI(Message Passing Interface)
- 讓程式可以跨計算節點(nodes)平行跑
- 記憶體使用:Distributed memory架構
CPU的核心使用不同的記憶體,透過網路溝通
- 平行出來的部分叫做rank,每個rank上跑的程序叫做MPI-thread
- 操作多台電腦的平行程式,使用MPI
- OpenMP(Open Multi-Processing)
- 讓程式可以在單節點上,使用多核心(cores)平行跑
- 記憶體使用:Shared Memory Processor(SMP)架構
CPU的核心使用同節點上的記憶體
- 平行出來的部分叫做thread,跑的程序叫做omp-thread
- 操作單台電腦上多核心的平行程式,使用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_
沒有留言:
張貼留言