将 ifort 与 f2py 一起使用时禁用 fp-model strict

Disabling fp-model strict when using ifort with f2py

我正在使用 f2py 将我的 python 代码的性能关键部分卸载到 Fortran。我有两个 Fortran 编译器,gfortranifort。由于我 运行 的代码将在英特尔处理器上运行,因此 ifort 通常更快。但是对于我代码中最关键的部分,我观察到相反的情况,gfortran 快了 40%!在检查调用 ifort 的实际命令行后,我注意到无论我在 FFLAGS 环境变量中指定什么,f2py 都会将 -fp-model strict 附加到命令行。我怀疑这是 ifort 缓慢的原因。

有没有办法让 f2py 停止执行此浮点模型?我已经尝试将 -fp-model fast 添加到 FFLAGSf2py--f90flags 参数,但是当它们出现在最终命令行中时,它们是在严格标志之前这样做的,因此被覆盖。虽然我很欣赏对 NaN 等的支持,但不值得减速 40%。

这是我的 f2py 命令行:

FFLAGS="-openmp -Ofast -fPIC" f2py --fcompiler=intelem -c -m pmat_core_32 pmat_core_32.f90 -liomp5

根据 f2py 输出,这里是实际传递给 ifort 的标志:

-FI -openmp -Ofast -fPIC -xhost -openmp -fp-model strict

标志-xhost -openmp -fp-model strict来自

def get_flags_opt(self):
    return ['-xhost -openmp -fp-model strict']

在文件 site-packages/numpy/distutils/fcompiler/intel.py 中用于调用 ifort 的 类。

您有两种选择来修改这些标志的行为:

  • 使用 --noopt 标志调用 f2py 以抑制这些标志
  • 使用 --opt='blah' 调用 f2py 以覆盖这些标志

您可以通过以下方式获得您想要的旗帜:

FFLAGS="-fPIC" f2py --fcompiler=intelem --opt='-xhost -0fast -openmp' -c -m pmat_core_32 pmat_core_32.f90 -liomp5