- 訊息傳遞介面(英語:Message Passing Interface,縮寫MPI)是一個平行計算的應用程式接口(API),常在超級電腦、電腦叢集等 非共享記憶體 環境程序設計。(from wikipedia)
- OpenMPI 與 OpenMP 平行的層級不同 :
- OpenMP是做多執行緒的平行(Multithreading),每個執行緒可以看到相同的記憶體,他們是共享記憶體 (shared memory)
- OpenMPI 則是做多行程的平行 (Multiprocessing),每個行程的記憶體不是共享的,因此這時候就需要不同行程間的訊息傳遞 (message passing)。
- 白話來說,多執行緒的平行只能讓你在一台電腦上使用1顆CPU的多核心來進行平行,MPI的平行可以讓你做到跨節點、跨CPU的平行,現在的超級電腦可以說都是由數以千計臺小電腦組成,因此跨節點的平行在超級電腦、叢集式計算、分散式計算就顯得很重要
- 編譯 : MPI 有自己的編譯器,這邊我使用 mpic++ (以下有範例程式)
- 執行程式 : 執行時,也需要呼叫 mpirun 來執行
- 在 OpenMPI 中,每個執行緒都有自己的代號,這邊的名稱叫做 rank,相當於在OpenMP中每個執行緒的 ID
圖片來源: SKIRT project
完整程式碼
- github 完整程式碼連結 : https://github.com/grandma-tutorial/OpenMPI-tutorial
OpenMPI 語法介紹
- MPI_Init()
- MPI_Comm_rank
- MPI_Comm_size
- MPI_Finalize
OpenMP 範例程式 : Hello, world
- 要使用 OpenMP ,需先 #include<mpi.h>
// ** 檔名 example_basic.cpp **
// 都會阿嬤 OpenMPI 教學
// 都會阿嬤 https://weikaiwei.com
#include <stdio.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
// Initialize the MPI environment
MPI_Init(NULL, NULL);
// Get the number of processes
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
// Get the rank of the process
int process_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &process_rank);
//Hello, world
printf("Hello, world from rank %d/%d\n", process_rank, world_size);
// Finalize the MPI environment
MPI_Finalize();
}
# === 執行 execute===
$ ./mpirun -np 2 ./example_basic.out
# === 輸出 output===
Hello, world from rank 1/2
Hello, world from rank 0/2
延伸閱讀
- https://skirt.ugent.be/skirt9/_parallel_messaging.html
- https://mpitutorial.com/