如何使用numpy + gfortran

时间:2018-10-03 11:30:15

标签: numpy openmp gfortran f2py

我使用numpy在Windows上使用MSVC和gfortran创建由fortran 90代码组成的模块。这个想法是用python setup.py bdist_wheel创建一个轮子。

我使用以下python代码创建模块。一切都可以编译,运行良好,直到我使用了像openmp(-lgomp)这样的gfortran库。我设法用-fopenmp创建对象,但是无法链接。

当我针对gomp进行链接时,我不知道在何处提供此输入。编译标志-fopenmp进入extra_f90_compile_args,但是。我尝试了几种参数,但均未成功(extra_link_argslibrary_dirslibrariesruntime_library_dirsextra_objectsf2py_options)。

我通过编辑为gfortran生成链接命令的函数找到了解决方案。 如果我编辑以下文件numpy\distutils\fcompiler\gnu.py,则可以添加-lgomp,它可以工作,但是由于我修改了numpy,因此文件很脏。

如何给这个额外的gfortran链接库(-lgomp)?

import platform
import setuptools
import numpy
from numpy.distutils.core import setup
from numpy.distutils.misc_util import Configuration


def configuration_openmp(parent_package='', top_path=None):
    config = Configuration('mymodule', parent_package, top_path)
    config.add_extension('mymodule',
                         sources=['mymodule/mymodule.f90'],
                         include_dirs=[numpy.get_include()],
                         extra_f90_compile_args=['-g0', '-O3', '-fopenmp'],
                         )
    config.make_config_py()
    return config
metadata = dict(configuration=configuration_openmp)

setup(**metadata)

这是fortran代码

module mod
    subroutine test_openmp()
        use omp_lib
        write(6,*) omp_get_num_procs()
        write(6,*) omp_get_num_threads()
    end subroutine
end module mod

这是链接错误

C:\MinGW\bin\gfortran.exe -Wall -g -Wall -g -shared build\temp.win-amd64-3.7\Release\mymodule\mymodule.o build\temp.win-amd64-3.7\Release\build\src.win-amd64-3.7\mymodule\seama
s_integrate-f2pywrappers2.o -LC:\MinGW\lib\gcc\x86_64-w64-mingw32\4.9.2 -L"C:\Program Files\Python37\libs" -L"C:\Program Files\Python37\PCbuild\amd64" -o build\temp.win-amd64-3.7\Release\.libs\libseam
as_i.CCCCCCCCCCCCCCCCCCCCCCCCCCCCC.gfortran-win_amd64.dll -Wl,--allow-multiple-definition -Wl,--output-def,build\temp.win-amd64-3.7\Release\libmymodule_i.CCCCCCCCCCCCCCCCCCCCCCCCCCCCC.gfortran-win
_amd64.def -Wl,--export-all-symbols -Wl,--enable-auto-import -static -mlong-double-64
build\temp.win-amd64-3.7\Release\mymodule\mymodule.o:mymodule.f90:(.text+0xa1): undefined reference to `omp_get_num_procs_'
build\temp.win-amd64-3.7\Release\mymodule\mymodule.o:mymodule.f90:(.text+0xe8): undefined reference to `omp_get_num_threads_'
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/../../../../x86_64-w64-mingw32/bin/ld.exe: build\temp.win-amd64-3.7\Release\mymodule\mymodule.o: bad reloc address 0x0 in section `.pda
ta'

也许解决方案是直接使用f2py

f2py -m demo --fcompiler=gfortran --f90flags='-O3 -fopenmp' -lgomp -c test.f90

0 个答案:

没有答案