使用 Openmp 的 F2py 在 Python 中出现导入错误
F2py with Openmp gives import error in Python
我能够在使用 Openmp 的 Fortran 中编译下面的最小工作示例,运行 给出了预期的结果(打印 1)。
subroutine test
use omp_lib
write(*,*) omp_get_num_threads()
end subroutine
但是在 python 中使用 f2py 会出现错误:
ImportError: DLL load failed: A dynamic link library (DLL) initialization routine failed.
我已经使用 dependency walker 来测试问题是否出在链接到 openmp dll 上,但是以下 .dll 在 fortran 可执行文件和从 f2py 编译的 .pyd 中链接:
c:\tdm-gcc-64\bin\LIBGOMP_64-1.DLL
因此我很困惑为什么 python 无法加载 .dll,因为它似乎是从 f2py 正确链接的。我用来生成 .pyd 的 f2py 命令是
python -m numpy.f2py -c -m %output% %input%.f90 --fcompiler=gnu95 --compiler=mingw32 --f90flags="-fopenmp " -lgomp
非常感谢任何帮助,谢谢。
编辑:我已经用另一台具有相同安装设置的 windows PC 对此进行了测试,并收到相同的错误消息。我错过了什么吗?
编辑 2:显然这个程序在 f2py 中实际上不起作用,所以是不好的例子。我很抱歉。我实际上正在使用子例程,只要不存在 openmp 命令,它们就能够正确地使用 f2py。
编辑 3:由于 Pierre de Buyl 的反馈,我已将示例代码替换为子例程而不是程序,尽管这对我的问题没有影响。
这对我有用:
tesf.f95
subroutine nthreads
!$ use omp_lib
integer :: nt
nt = 0
!$ nt = omp_get_max_threads()
write(*,*) 'Nthreads'
write(*,*) nt
end subroutine
编译:
f2py -c test.f95 -m test --f90flags='-fopenmp' -lgomp -lpthread --compiler=mingw32 --fcompiler=gfortran
如果我运行:
python -c "import test; test.nthreads()"
结果是:
Nthreads
8
问题似乎出在使用 tdm-gcc-64 作为编译器时,因此我改为使用按预期工作的 mingw64 安装。
我能够在使用 Openmp 的 Fortran 中编译下面的最小工作示例,运行 给出了预期的结果(打印 1)。
subroutine test
use omp_lib
write(*,*) omp_get_num_threads()
end subroutine
但是在 python 中使用 f2py 会出现错误:
ImportError: DLL load failed: A dynamic link library (DLL) initialization routine failed.
我已经使用 dependency walker 来测试问题是否出在链接到 openmp dll 上,但是以下 .dll 在 fortran 可执行文件和从 f2py 编译的 .pyd 中链接:
c:\tdm-gcc-64\bin\LIBGOMP_64-1.DLL
因此我很困惑为什么 python 无法加载 .dll,因为它似乎是从 f2py 正确链接的。我用来生成 .pyd 的 f2py 命令是
python -m numpy.f2py -c -m %output% %input%.f90 --fcompiler=gnu95 --compiler=mingw32 --f90flags="-fopenmp " -lgomp
非常感谢任何帮助,谢谢。
编辑:我已经用另一台具有相同安装设置的 windows PC 对此进行了测试,并收到相同的错误消息。我错过了什么吗?
编辑 2:显然这个程序在 f2py 中实际上不起作用,所以是不好的例子。我很抱歉。我实际上正在使用子例程,只要不存在 openmp 命令,它们就能够正确地使用 f2py。
编辑 3:由于 Pierre de Buyl 的反馈,我已将示例代码替换为子例程而不是程序,尽管这对我的问题没有影响。
这对我有用:
tesf.f95
subroutine nthreads
!$ use omp_lib
integer :: nt
nt = 0
!$ nt = omp_get_max_threads()
write(*,*) 'Nthreads'
write(*,*) nt
end subroutine
编译:
f2py -c test.f95 -m test --f90flags='-fopenmp' -lgomp -lpthread --compiler=mingw32 --fcompiler=gfortran
如果我运行:
python -c "import test; test.nthreads()"
结果是:
Nthreads
8
问题似乎出在使用 tdm-gcc-64 作为编译器时,因此我改为使用按预期工作的 mingw64 安装。