本文持續更新…
最近用到openmpi,所以順便學習一下,做個筆記。
參考資料有:
- openmpi youtube視頻教程
- 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
編譯並運行