I'm using f2py
to offload performance critical sections of my python code to fortran. I have two fortran compilers, gfortran
and ifort
. Since the code I run will be on intel processors, ifort
is usually faster. But for the most critical part of my code, I observe the opposite, with gfortran
being faster by 40%! After inspecting the actual command line ifort
is being called with, I noticed that f2py
appends -fp-model strict
to the command line no matter what I specify in the FFLAGS
environment variable. I suspect that this is the cause of the ifort
slowness.
Is there a way to make f2py
stop enforcing this floating point model? I've tried both adding -fp-model fast
to FFLAGS
and f2py
's --f90flags
argument, but while they appear on the final command line, they do so before the strict flag, and are therefore overridden. While I appreciate support for NaNs etc., it is not worth a 40% slowdown.
Here is my f2py
command line:
FFLAGS="-openmp -Ofast -fPIC" f2py --fcompiler=intelem -c -m pmat_core_32 pmat_core_32.f90 -liomp5
and here are the flags that are actually passed to ifort
, according to the f2py
output:
-FI -openmp -Ofast -fPIC -xhost -openmp -fp-model strict
The flags -xhost -openmp -fp-model strict
come from
def get_flags_opt(self):
return ['-xhost -openmp -fp-model strict']
in the file site-packages/numpy/distutils/fcompiler/intel.py
for the classes that invoke ifort.
You have two options to modify the behavior of these flags:
f2py
with the --noopt
flag to suppress these flagsf2py
with the --opt='blah'
to override these flagsYou can get the flags you desire with:
FFLAGS="-fPIC" f2py --fcompiler=intelem --opt='-xhost -0fast -openmp' -c -m pmat_core_32 pmat_core_32.f90 -liomp5