
int main(int argc, char** argv) { MPI_Init(&argc, &argv); printf("Sup.\n"); MPI_Finalize(); return 0; }
⚠️注意:所有使用MPI的,均需引用 <mpi.h> ,使用 MPI_Init 初始化, 通過 MPI_Finalize 關閉.
二、編譯,執行
$ mpirun -n 2 source
⚠️注意:
mpirun -host host0,host1 source //允許指定執行所用的機器:這句的意思是:在host0,host1上各執行一次source。
我們可以結合-n和-host。如果給定的進程數是大於機器數量,我們回到第一台機器,如下:
mpirun -n 3 -host host0,host1 source
這句是指:在host0上執行一次,在host1上執行一次,然后回到host0再執行一次。
我們也可以使用−hostfile選項指定執行設置:
$ cat hosts
host0 slots=2 //希望host0執行2次
host1 slots=4 //希望host1執行4次
操作如下:
mpirun -n 7 -hostfile hosts source
即: 在host0上執行2次,在host1上執行一次,剩下一次回到host0執行。
man mpirun 可查看更多信息
三、和OpenMP比較
OpenMP的
- 只有一個程序實例被執行:只有一個進程。
- 該進程分成多個並行運行的線程。
- 並行部分由預處理器指令函數(#pragma)分隔
MPI
- 程序的多個實例同時執行:創建多個進程。
- 每個進程運行整個程序,並且進程並行運行。
- MPI_Init和MPI_Finalize不對應於並行化部分的開始和結尾。
四、默認通訊器
mpirun啟動的進程必須能夠相互通信。所有進程都由默認通信器鏈接 MPI_COMM_WORLD
MPI_COMM_WORLD 由 MPI_Init 創建並由 MPI_Finalize 銷毀。每個進程都有一個在MPI_COMM_WORLD中進行標識的等級。歸功於這些唯一的進程號(等級:rank)我們可以共享任務。進程之間的所有通信都通過一個通信器。
// intro/default_comm.c #include <mpi.h> #include <stdio.h> int main(int argc, char** argv) { MPI_Init(&argc, &argv); int world_size; //總進程數
MPI_Comm_size(MPI_COMM_WORLD, &world_size); int wrank; //進程等級號
MPI_Comm_rank(MPI_COMM_WORLD, &wrank);
if (wrank!=1) //進程不為1的執行該操作 printf("Rang %d sur %d.\n", wrank, world_size); MPI_Finalize(); return 0; }
在控制台測試:
$ mpirun -n 4 source
Rang 2 sur 4.
Rang 0 sur 4.
Rang 3 sur 4.
進程輸出的順序不固定,因為進程之間是獨立的。