我有一个Fortran 90代码,其中某些部分实现了OpenMP。现在,要使用带有OpenMP支持的f2py来编译Fortran代码,我必须传递f90编译器标志。现在,只有在我提供OpenMP相关标志的情况下,该代码才应使用OpenMP支持进行编译,除非必须将其编译为普通的串行代码。这对于gfortran可以正常工作,但对于ifort则不能。让我们解释这一点,
如果我跑步, (gfortran串行模式)
f2py -c adt.f90 -m adt_module
*Gives output (last few lines)*
Fortran f77 compiler: /usr/bin/gfortran -Wall -g -ffixed-form -fno-second-underscore -fPIC -O3 -funroll-loops
Fortran f90 compiler: /usr/bin/gfortran -Wall -g -fno-second-underscore -fPIC -O3 -funroll-loops
Fortran fix compiler: /usr/bin/gfortran -Wall -g -ffixed-form -fno-second-underscore -Wall -g -fno-second-underscore -fPIC -O3 -funroll-loops
(gfortran并行模式)
f2py -c adt.f90 -m adt_module --f90flags='-fopenmp' -lgomp
*output*
Fortran f77 compiler: /usr/bin/gfortran -Wall -g -ffixed-form -fno-second-underscore -fPIC -O3 -funroll-loops
Fortran f90 compiler: /usr/bin/gfortran -fopenmp -fPIC -O3 -funroll-loops
Fortran fix compiler: /usr/bin/gfortran -Wall -g -ffixed-form -fno-second-underscore -fopenmp -fPIC -O3 -funroll-loops
您可以清楚地看到,在串行模式下编译期间没有-fopenmp标志,这是预期的,因为我没有传递必需的标志
现在开始使用ifort
(ifort并行模式)
f2py -c adt.f90 -m adt_module --fcompiler=intelem --f90flags='-qopenmp' -liomp5
*Output*
Fortran f77 compiler: /opt/intel/compilers_and_libraries_2017.4.196/linux/bin/intel64/ifort -FI -fPIC -fp-model strict -O1 -qopenmp
Fortran f90 compiler: /opt/intel/compilers_and_libraries_2017.4.196/linux/bin/intel64/ifort -FR -qopenmp -fPIC -fp-model strict -O1 -qopenmp
Fortran fix compiler: /opt/intel/compilers_and_libraries_2017.4.196/linux/bin/intel64/ifort -FI -qopenmp -fPIC -fp-model strict -O1 -qopenmp
(ifort串行模式)
f2py -c adt.f90 -m adt_module --fcompiler=intelem
*Output*
Fortran f77 compiler: /opt/intel/compilers_and_libraries_2017.4.196/linux/bin/intel64/ifort -FI -fPIC -fp-model strict -O1 -qopenmp
Fortran f90 compiler: /opt/intel/compilers_and_libraries_2017.4.196/linux/bin/intel64/ifort -FR -fPIC -fp-model strict -O1 -qopenmp
Fortran fix compiler: /opt/intel/compilers_and_libraries_2017.4.196/linux/bin/intel64/ifort -FI -fPIC -fp-model strict -O1 -qopenmp
现在,这是问题所在,请参见此处,使用-qopenmp标志针对串行模式进行编译,但我尚未在命令行中通过它。为什么用ifort而不用gfortran编译时会发生这种情况?而如何解决这个问题?