据我所知,英特尔的Fortran编译器ifort
执行了一些函数内联和interprocedural optimization (IPO)以及其他标准优化。这可以在以下示例中完成:
ifort -O2 -finline-functions -ipo myProgram.f function.f subroutine.f -o MyProgram
编译器选项说明:
-O2
标志告诉编译器执行重要的优化(对于Fortran,包括函数内联)。 -finline-functions
标志告诉编译器允许函数内联。
(这是默认行为;为了显而易见,我在这里包含了标志。)-ipo
标志告诉编译器执行IPO。 假设我将编译过程分解为两个步骤,就像使用Makefile时常常做的那样....
ifort -O2 -ipo -c function.f -o function.o
ifort -O2 -ipo -c subroutine.f -o subroutine.o
ifort -O2 -ipo -c myProgram.f -o myProgram.o
(我猜测在这一步没有完成内联,因为文件是独立编译的......)
然后我将link对象文件放在一起并创建可执行文件:
ifort -O2 -finline-functions -ipo myProgram.o function.o subroutine.o -o MyProgram
如果我执行单独编译文件,应将哪些优化标志传递给编译器哪个阶段?在哪一步内联和IPO执行?
答案 0 :(得分:10)
使用-ipo进行编译时,编译器会生成中间代码,但根本不进行优化或内联。您有.o文件,但它们不包含任何机器指令。然后,当您再次调用ifort来创建可执行文件时,编译器会将所有中间代码吸收并进行优化,就好像您已经在一个大源文件中编译了所有内容一样。然后,它可以查看引用了哪些例程以及可以在哪里进行更多优化和内联。
您应该为每次编译传递相同的优化选项 - 它们与中间代码一起记录。
我很确定具有类似功能的其他编译器以同样的方式执行它。 (我以前是英特尔编译器开发/支持工程师。)