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

f2py with OMP: can't import module, undefined symbol GOMP_*

我希望使用 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 编译工作正常(只收到关于 'Using deprecated NumPy API' 的警告)。

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: ./SOmod.so: undefined symbol: GOMP_barrier

对于不同的 OMP 指令,我得到不同的 GOMP_* 错误。没有指令(但有 -openmp 标志)它可以工作。

如有任何帮助,我们将不胜感激。

我能够在 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 实现。