使用場(chǎng)景
- 數(shù)值運(yùn)算与柑,特別是多維矩陣運(yùn)算;
- 并行運(yùn)算芦缰,使用
openmp
優(yōu)勢(shì)
- 簡(jiǎn)單企巢,
Fortran
語法簡(jiǎn)單 - 易學(xué),
Fortran
矩陣操作與numpy
十分類似让蕾, Fortran 與 Numpy 語法對(duì)照 - 速度浪规,這個(gè)不用多說了
簡(jiǎn)單例子
# flib.f90
subroutine foo(a, b, c, d, n)
implicit none
integer :: n
real, intent(in) :: a(n,n), b(n,n)
real, intent(out) :: c(n, n), d(n, n)
c = matmul(a,b)
d = matmul(a,b)*2.0d0
end subroutine foo
將上面的代碼保存為flib.f90
, 確保Anaconda
, numpy
已經(jīng)安裝,輸入下面的命令:
f2py -c -m flib flib.f90
上面的命令再linux
下會(huì)生成flib.so
探孝,可以直接導(dǎo)入python
:
使用OpenMP
# flib.f90
subroutine acorr(v, c, nstep)
!$ use omp_lib
! (Normalized) 1d-vacf: c_vv(t) = C_vv(t) / C_vv(0)
integer, parameter :: dp = selected_real_kind(15, 307) ! 64-bit reals
integer, intent(in) :: nstep, nc
real(dp), intent(in) :: v(0:nstep-1)
real(dp), intent(out) :: c(0:nstep-1)
integer :: dt
!$OMP parallel do
do dt = 0,nstep-1
c(dt) = sum(v(0:nstep-dt-1) * v(dt:)) / (nstep-dt)
end do
!$OMP end parallel do
end subroutine acorr
- 使用
ifort
與openmp
編譯:
f2py -c -m flib flib.f90 --opt='-O3' --fcompiler=intelem --f90flags="-openmp -D__OPENMP" --f77flags="-openmp -D__OPENMP" -liomp5
- 使用
gfortran
與openmp
編譯
f2py -c -m flib flib.f90 --opt='-O3' --fcompiler=gnu95 --f90flags="-fopenmp -D__OPENMP" --f77flags="-fopenmp -D__OPENMP" -lgomp
注意: 上面命令中參數(shù)--fcompiler
可以使用下面命令查看笋婿,不同系統(tǒng)可用的編譯器不同:
f2py -c --help-fcompiler
比如我的系統(tǒng)支持的編譯器選項(xiàng)為:
FAQ
傳遞參數(shù)給
Fortran subroutine
時(shí)可以使用assumed shape array
嗎?
不可以顿颅。可以使用
Allocatable arrays
嗎缸濒?
可以。參考:Allocatable arraysf2py
運(yùn)行出錯(cuò)了元镀,信息太亂看不到錯(cuò)誤信息
在運(yùn)行f2py
前可以使用下面命令绍填,沒有錯(cuò)誤信息后再使用f2py
ifort -c flib.f90
#or
gfortran -c flib.f90
Python
中numpy
默認(rèn)是按行存儲(chǔ)的, 而Fortran
數(shù)組是按列存儲(chǔ)的,需要考慮數(shù)組存儲(chǔ)的順序嗎栖疑?
一般不用讨永。除非數(shù)組非常大,接近物理內(nèi)存遇革,否則f2py
會(huì)自動(dòng)判斷是否需要復(fù)制數(shù)組卿闹,具體請(qǐng)參考:Array argumentsf2py
調(diào)用Fortran
性能怎么樣?
在Linux
系統(tǒng)中萝快,編譯的時(shí)候加上選項(xiàng)-DF2PY_REPORT_ATEXIT
锻霎,結(jié)束的時(shí)候會(huì)輸出如下圖的性能報(bào)告,計(jì)算量較小時(shí)揪漩,f2py interface
所需的時(shí)間相對(duì)較長(zhǎng)旋恼, 但計(jì)算量很大時(shí),這個(gè)時(shí)間就不值一提了奄容。
f2py -c -m flib flib.f90 -DF2PY_REPORT_ATEXIT