【平行計算】MPI教學(1):5分鐘了解甚麼是MPI

MPI的全名是Message Passing Interface,這是一種用於平行計算(Parallel Computing)時經常會使用到的Library。這是一種被廣泛在超級電腦或分散系統中使用的資料溝通方式。許多較大型的程式專案由於運算速度的需求或是記憶體空間的需求,經常會使用MPI來作為每個Computing nodes的溝通介面。在使用傳統電腦來進行量子計算的模擬時,也經常使用到此方式來作大規模的量子電腦模擬。

MPI標頭檔 (Header File)

在使用MPI編寫並行計算程序時,我們需要包含一些MPI的標頭檔,以便使用MPI提供的API函數。以下是一些常用的MPI標頭檔:

  1. mpi.h:這是MPI的主要標頭檔,包含了所有MPI的API函數的聲明。在編寫MPI程序時,我們需要包含這個標頭檔。
  2. mpif.h:這是MPI Fortran語言接口的標頭檔,包含了Fortran語言對MPI的支持。
  3. mpicxx.h:這是MPI C++語言接口的標頭檔,包含了C++語言對MPI的支持。
  4. mpi_cxx_iostream.h:這是MPI C++語言接口中的一個標頭檔,包含了對流式輸出的支持。

這些標頭檔通常都可以在MPI的安裝目錄中找到。在編寫MPI程序時,我們需要根據使用的編程語言和MPI的版本來包含相應的標頭檔。

除了上述標頭檔之外,還有一些與MPI相關的標準庫,如OpenMPI和MPICH等。這些標準庫提供了對MPI的實現和支持,可以在不同的平台上運行。在使用這些標準庫時,我們需要按照相應的文檔進行安裝和配置,以便在編寫MPI程序時使用這些Library。

總之,MPI的函式都包含在mpi.h這個檔案中,因此開頭需要使用這個Header file。

#include <mpi.h>

MPI Functions

MPI所提供的Function中最主要有以下幾個:

這篇文章將簡單介紹各個Function的功能,在對於每個Function有了基礎概念後,可以更容易了解詳細的使用方法。詳細的使用方法可以參考mpich.org的文件。

MPI_Init()是在使用MPI時,必須先呼叫的初始程序。在此之後,程式內就可以使用MPI所提供的各個Function。MPI_Init()主要是去產生一個MPI Communicator作為之後各個Thread之間的溝通橋樑。

MPI_Comm_rank()是讓各自Thread知道自己在這個MPI Communicator中的編號是幾號。通常稱作Rank。

MPI_Comm_size()可以得到在這個MPI Group中總共的數量。也就是總共有多少個Ranks在這一個MPI Communicator中。

MPI_Send()MPI_Recv()可以讓不同Rank間傳遞資料到其他Rank。在送出端使用MPI_Send()而在接收端使用MPI_Recv()負責接收。

MPI_Finalize()是在使用MPI之後,通常於程式最後結束此MPI Communicator。

MPI編譯

MPI的編譯可以使用MPI相關的Compiler例如mpicxx or mpic++等等。但其實這些mpi開頭的compiler也都只是一個wrapper而已。還是可以直接使用原本gnu gcc toolchain。這些wrapper只是都已經把相對應的header file以及library都link好了,方便使用。如果因為一些特殊狀況而無法直接使用mpicxx or mpic++來進行編譯,還是可以先使用以下指令看看所在系統上對於MPI相關的Library設定以及路徑內容來直接使用gnu gcc toolchain來編譯。

mpicxx -show

例如我一樣可以使用g++來編譯一個MPI程式,只需要在編譯指令中使用-L和-I加入相對應的Library與Include路徑即可。使用mpicxx -show就可以看到在系統上相對應MPI Library的路徑了。

MPI執行

使用mpirun來執行一個MPI程式。一般而言會帶一個參數-n來指定要使用多少個Rank來運行。如果沒有使用-n則系統會自動根據可以使用的Thread數目來產生相對應的Rank數。以下範例為使用4個Ranks來執行程式。

mpirun -n 4 ./a.out

MPI實務上的專案

如果對於實作上使用MPI有興趣,可以參考Intel-QS這個Open Source Project。這是一個使用MPI來進行量子計算模擬的程式。可用於跑在超級電腦或是分散式計算中。

X. Ryan
X. Ryan

Hello!我是一個在矽谷工作,有軟體工程背景的量子計算科學家。這裡分享的內容主要是把平常研究開發時所用的小工具以及看過的東西記錄下來,同時也分享一些日常生活瑣事。

文章: 49