【平行運算】OpenMPI教學(一) 基礎語法

  • 訊息傳遞介面(英語:Message Passing Interface,縮寫MPI)是一個平行計算的應用程式接口(API),常在超級電腦、電腦叢集等 非共享記憶體 環境程序設計。(from wikipedia)
  • OpenMPIOpenMP 平行的層級不同 :
    • OpenMP是做多執行緒的平行(Multithreading),每個執行緒可以看到相同的記憶體,他們是共享記憶體 (shared memory)
    • OpenMPI 則是做多行程的平行 (Multiprocessing),每個行程的記憶體不是共享的,因此這時候就需要不同行程間的訊息傳遞 (message passing)。
  • 白話來說,多執行緒的平行只能讓你在一台電腦上使用1顆CPU的多核心來進行平行,MPI的平行可以讓你做到跨節點、跨CPU的平行,現在的超級電腦可以說都是由數以千計臺小電腦組成,因此跨節點的平行在超級電腦、叢集式計算、分散式計算就顯得很重要
  • 編譯 : MPI 有自己的編譯器,這邊我使用 mpic++ (以下有範例程式)
  • 執行程式 : 執行時,也需要呼叫 mpirun 來執行
  • 在 OpenMPI 中,每個執行緒都有自己的代號,這邊的名稱叫做 rank,相當於在OpenMP中每個執行緒的 ID

圖片來源: SKIRT project

完整程式碼

OpenMPI 語法介紹

  • MPI_Init()
  • MPI_Comm_rank
  • MPI_Comm_size
  • MPI_Finalize

OpenMP 範例程式 : Hello, world

  1. 要使用 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

延伸閱讀

  1. https://skirt.ugent.be/skirt9/_parallel_messaging.html
  2. https://mpitutorial.com/

留言討論區