openmpi筆記

本文持續更新…

最近用到openmpi,所以順便學習一下,做個筆記。
參考資料有:

  1. openmpi youtube視頻教程
  2. openmpi提供的視頻介紹–這個比較長,比較細(英文)

1 OpenMPI使用–Fortran

這裏主要講fortran的例子,python的例子可以使用mpi4py

1.1 單個子程序

這裏假定已經安裝好OpenMPI,舉例說明其應用
寫一個名爲hello.f90的程序,代碼爲:

program main  #fortran 程序開始
      use mpi  #使用mpi
      integer :: ierr   #聲明變量爲整型
      call MPI_INIT(ierr)
      write(*,*) 'Hello world'
      call MPI_FINALIZE(ierr)
end program main

所有要執行的程序放在 call MPI_INIT() 和 call MPI_FINALIZE()之間,這樣才能調用mpi執行。
編譯:

mpif90 hello.f90 -o hello #-o表示重命名爲hello,否則是a.out

關於fortran的編譯可以使用:

g77 hello.f90 
or
gfortran hello.f90

但是由於我們使用了mpi,所有要用mpif90編譯。
運行程序:

mpirun -np 4 hello

在這裏插入圖片描述

  • -np x表示使用x個進程(process)來運行程序

1.2 多個子程序multiple subroutines

現在將程序修改爲

program main
      use mpi
      integer :: ierr,myrank,mysize
      call MPI_INIT(ierr)
      !First subroutine
      call MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr)
      !Second subroutine
      call MPI_COMM_SIZE(MPI_COMM_WORLD,mysize,ierr)
      write(*,*) 'myrank:',myrank,'mysize:',mysize
      call MPI_FINALIZE(ierr)
end program main

上面MPI_COMM是mpi中的函數,這裏rank和size會分別告訴你哪個進程正在工作,以及使用了多少個進程
編譯:

mpif90 hello.f90 -o hello

四個進程運行
在這裏插入圖片描述
結果顯示進程調用排序是3,0,2,1(從0開始到n-1),共4個進程

1.3 Timer計時

timer可以計算每個進程的時間,調用的模塊是MPI_WTIME()

program main
      use mpi
      integer :: ierr,myrank,mysize
      real :: t1,t2
      call MPI_INIT(ierr)
      !First subroutine
      call MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr)
      !second
      call MPI_COMM_SIZE(MPI_COMM_WORLD,mysize,ierr)
      t1=MPI_WTIME()
      write(*,*) 'myrank:',myrank,'mysize:',mysize
      T2=MPI_WTIME()
      write(*,*) t2-t1
      call MPI_FINALIZE(ierr)
end program main

編譯並運行

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章