OpenMPI 學習筆記(二)執行環境


 
一、第一個例子:
page26image5878032  // intro/minimal. #include <mpi.h>  #include <stdio.h>
int main(int argc, char** argv) {

    MPI_Init(&argc, &argv);
    printf("Sup.\n");
    MPI_Finalize();

    return 0; 
}

⚠️注意:所有使用MPI的,均需引用 <mpi.h> ,使用 MPI_Init 初始化, 通過 MPI_Finalize 關閉.


 

二、編譯,執行

$ mpicc -o source source.c     //mpicc實際上只是一個對gcc的調用 (見:mpicc -showme)
 
           $ mpirun -n 2 source 
           
⚠️注意:
-n選項指定要並行運行的進程數量。如果省略-n選項,則啟動的進程數取決於機器。
source是文件名,注意要寫兩次,第二次帶.c
 

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 -host􏰁file hosts source

即: 在host0上執行2次,在host1上執行一次,剩下一次回到host0執行。

man mpirun 可查看更多信息

 

三、和OpenMP比較

OpenMP的

  1. 只有一個程序實例被執行:只有一個進程。
  2. 該進程分成多個並行運行的線程。
  3. 並行部分由預處理器指令函數(#pragma)分隔

MPI

  1. 程序的多個實例同時執行:創建多個進程。
  2. 每個進程運行整個程序,並且進程並行運行。
  3. 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.

進程輸出的順序不固定,因為進程之間是獨立的。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM