我能够在Fortran中编译下面的最小工作示例,它使用Openmp并运行以给出预期结果(打印1)。
subroutine test
use omp_lib
write(*,*) omp_get_num_threads()
end subroutine
但是在python中使用f2py时会出现错误:
ImportError:DLL加载失败:动态链接库(DLL)初始化例程失败。
我已经使用依赖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的反馈,我已将示例代码替换为子程序而非程序,尽管这对我的问题没有任何影响。
答案 0 :(得分:0)
这对我有用:
<强> 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
答案 1 :(得分:0)
似乎问题在于使用tdm-gcc-64作为编译器,所以我改为使用mingw64安装,它按预期工作。