C/C++ Open MPI 用法與範例

本篇 ShengYu 介紹 C/C++ Open MPI 的用法與範例。Open MPI 是一個訊息傳遞介面函式庫 (Message Passing Interface) 的專案,Open MPI 結合了其他幾個項目的技術和資源。它被許多 TOP500 超級計算機使用。Open MPI 是做多行程 (Multiprocessing) 的平行,每個行程的記憶體不是共享的,此時就需要不同行程間的訊息傳遞 (message passing),另一個類似名稱的叫 OpenMP,OpenMP 是做多執行緒 (Multithreading) 的平行,且每個執行緒是共享記憶體 (shared memory)。

C/C++ 要使用 MPI 的話需要引入的標頭檔 <mpi.h>

這邊介紹 C/C++ MPI 的基本用法,

cpp-mpi.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// mpiCC cpp-mpi.cpp -o a.out && mpirun a.out
#include <iostream>
#include <mpi.h>

using namespace std;

int main() {
printf("main ++\n");

int size;
int rank;
MPI_Init(NULL, NULL);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
printf("size=%d, rank=%d\n", size, rank);
MPI_Finalize();

printf("main --\n");
return 0;
}

在 Linux 環境的下直接用 gcc / g++ 編譯會遇到 mpi.h: No such file or directory 的錯誤訊息,

1
2
$ g++ cpp-mpi.cpp -o a.out
cpp-mpi.cpp:3:17: fatal error: mpi.h: No such file or directory

解決方式為使用 mpicc 來替換 gcc,mpiCC 來替換 g++,

如果是 c 語言的話就使用 mpicc 來編譯,如下範例,

1
$ mpicc cpp-mpi.cpp -o a.out

如果是 c++ 語言的話就使用 mpiCC / mpicxx / mpic++ 來編譯,如下範例,

1
$ mpiCC cpp-mpi.cpp -o a.out

可以用 mpiCC -showmpiCC -showme 來顯示一些資訊

1
2
$ mpiCC -show
g++ -I/usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent -I/usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent/include -I/usr/lib/openmpi/include -I/usr/lib/openmpi/include/openmpi -pthread -Wl,-rpath -Wl,/usr/lib/openmpi/lib -Wl,--enable-new-dtags -L/usr/lib/openmpi/lib -lmpi_cxx -lmpi

執行的話就使用 mpirun,預設使用全部的數量,

1
$ mpirun a.out

我的電腦 CPU 配備為 4 核心,執行結果如下,

1
2
3
4
5
6
7
8
9
10
11
12
main ++
main ++
main ++
main ++
size=4, rank=3
size=4, rank=0
size=4, rank=1
size=4, rank=2
main --
main --
main --
main --

如果要指定 processes 處理器數量的話,則使用 -np 參數,

1
mpirun -np 2 a.out

我的電腦執行結果如下,

1
2
3
4
5
6
main ++
main ++
size=2, rank=1
size=2, rank=0
main --
main --

以上就是 C/C++ Open MPI 用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ 新手入門教學懶人包
C/C++ fopen 用法與範例
C/C++ fread 用法與範例
C/C++ fgets 用法與範例
C/C++ fputs 用法與範例
C/C++ fclose 用法與範例