带有OMP的f2py:无法导入模块,未定义的符号GOMP_ *

时间:2015-02-01 00:33:45

标签: python numpy fortran openmp f2py

我希望使用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标志)它可以工作。

非常感谢任何帮助。

1 个答案:

答案 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实现。