MPI的全名是Message Passing Interface,這是一種用於平行計算(Parallel Computing)時經常會使用到的Library。這是一種被廣泛在超級電腦或分散系統中使用的資料溝通方式。許多較大型的程式專案由於運算速度的需求或是記憶體空間的需求,經常會使用MPI來作為每個Computing nodes的溝通介面。在使用傳統電腦來進行量子計算的模擬時,也經常使用到此方式來作大規模的量子電腦模擬。
MPI標頭檔 (Header File)
在使用MPI編寫並行計算程序時,我們需要包含一些MPI的標頭檔,以便使用MPI提供的API函數。以下是一些常用的MPI標頭檔:
- mpi.h:這是MPI的主要標頭檔,包含了所有MPI的API函數的聲明。在編寫MPI程序時,我們需要包含這個標頭檔。
- mpif.h:這是MPI Fortran語言接口的標頭檔,包含了Fortran語言對MPI的支持。
- mpicxx.h:這是MPI C++語言接口的標頭檔,包含了C++語言對MPI的支持。
- 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來進行量子計算模擬的程式。可用於跑在超級電腦或是分散式計算中。
- [延伸閱讀]【平行計算】MPI教學(2):MPI通訊協議的原理與實踐
- [延伸閱讀]【軟體開發】5分鐘學會使用Boost.Python,讓你的C++函式輕鬆與Python互動
- [延伸閱讀]【軟體工程】使用Google Test提升軟體品質
- [延伸閱讀] 本文英文版 Parallel | Comprehensive MPI Tutorial (1): Mastering the Basics of MPI in 5 Minutes