我需要使用一些由同事使用Microsoft Visual Studio开发的Fortran代码(它是this groundwater flow model的修改版本)。但是,我没有ifort许可证,并且通常更喜欢使用开源替代品,所以我试图转换到gfortran。在StackOverflow上进行了大量的Google搜索和时间后,我成功创建了一个makefile,编译了代码,并使用gfortran运行了一个模拟。然而,在基准测试时我发现用gfortran编译的代码运行速度比我从Visual Studio编译的同事代码慢〜2.5倍(~30秒相比,~13秒)。此外,gfortran生成的.exe文件的大小约为Visual Studio的一半。
据我所知,由于切换编译器,速度可能存在一些差异;然而,我观察到的差异似乎极端,让我相信某些编译器设置在两者之间有所不同。 我意识到问题,'如何优化我的Fortran代码?'是模糊的,并在其他地方得到了详细的回答。相反,我的问题是:使用Microsoft Visual Studio(+ ifort)和gfortran复制或近似编译的最有效方法是什么?
我的第一直觉是让我的同事从Microsoft Visual Studio导出一个makefile(如here所描述的那样),然后我可以通过在可能的情况下使用等效设置来修改gfortran。但是,似乎不再可以从Visual Studio中导出makefile。其次,我找了一个相当于MakeItSo的Fortran,但没有运气。我还让我的同事在Visual Studio中向我发送了Fortran配置属性的屏幕截图;然而,似乎有Visual Studio设置我无法在gfortran中找到明确的类似物(例如,"赞成大小或速度?"开关)在这里看到:
FWIW,我在Cygwin上运行gfortran:
$ gfortran --version
GNU Fortran (GCC) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.
在@VladimirF的评论部分提供帮助后,我更新了我的makefile并确认标志已成功传递给gfortran:
$ make SUTRA
gfortran -O3 -march=native -ffixed-line-length-72 -m64 -c -o slake_mods.o slake_mods.F
gfortran -O3 -march=native -ffixed-line-length-72 -m64 -c -o fmods_3_0.o fmods_3_0.F
gfortran -O3 -march=native -ffixed-line-length-72 -m64 -c -o slake.o slake.F
gfortran -O3 -march=native -ffixed-line-length-72 -m64 -c -o slake_blas.o slake_blas.F
gfortran -O3 -march=native -ffixed-line-length-72 -m64 -c -o slake_linpack.o slake_linpack.F
gfortran -O3 -march=native -ffixed-line-length-72 -m64 -c -o slake_slatec.o slake_slatec.F
gfortran -O3 -march=native -ffixed-line-length-72 -m64 -c -o ssubs_3_0.o ssubs_3_0.F
gfortran -O3 -march=native -ffixed-line-length-72 -m64 -c -o usubs_3_0_non-Jeff.o usubs_3_0_non-Jeff.F
gfortran -O3 -march=native -ffixed-line-length-72 -m64 -c -o sutra_3_0.o sutra_3_0.F
gfortran slake_mods.o fmods_3_0.o slake.o slake_blas.o slake_linpack.o slake_slatec.o ssubs_3_0.o usubs_3_0_non-Jeff.o sutra_3_0.o -m64 \
-O3 -march=native -ffixed-line-length-72 -m64 -o SUTRA
我的同事在IA-32上使用英特尔Visual Fortran编译器XE 12.0.2.154和Microsoft Visual Studio 2008。