我希望使用openmp来加速我通过f2py运行的Fortran代码。但是,在成功编译之后,我无法在Python中导入模块。
对于像这样的Fortran95模块:
module test
implicit none
contains
subroutine readygo()
real(kind = 8), dimension(10000) :: q
!$OMP WORKSHARE
q = 7
!$OMP END WORKSHARE
end subroutine
end module
使用以下命令编译和导入:
f2py -m SOmod --fcompiler=gnu95 --f90flags='-march=native -O3 -fopenmp' -c SOtest.f95
python2 -c "import SOmod"
我收到错误。错误是导入 - 编译直接使用f2py或gfortran工作正常(仅获得有关'使用已弃用的NumPy API'的警告)。
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: ./SOmod.so: undefined symbol: GOMP_barrier
我为不同的OMP指令获得了不同的GOMP_ *错误。没有指令(但使用-openmp标志)它可以工作。
非常感谢任何帮助。
答案 0 :(得分:5)
我能够在Mac OS X(10.9.5)上重现错误,并使用自制程序安装gfortran
,我可以通过在命令中添加-lgomp
来修复它:
f2py -m SOmod --fcompiler=gnu95 --f90flags='-march=native -O3 -fopenmp' -lgomp -c SOtest.f95
由@Mark 添加:请注意-lgomp
是f2py的参数,而不是gfortran。虽然它仅使用-gomp
进行编译,但-gomp
和-fopenmp
都需要并行,如here所述。 GOMP是GNU openMP实现。