ifort何时使用优化标志?

时间:2018-03-09 21:24:32

标签: optimization makefile compilation fortran intel-fortran

简介

据我所知,英特尔的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时常常做的那样....

第1步

分别是compileassemble一堆文件,将源代码转换为目标文件:

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

(我猜测在这一步没有完成内联,因为文件是独立编译的......)

第2步

然后我将link对象文件放在一起并创建可执行文件:

  • ifort -O2 -finline-functions -ipo myProgram.o function.o subroutine.o -o MyProgram

我的问题

如果我执行单独编译文件,应将哪些优化标志传递给编译器哪个阶段?在哪一步内联和IPO执行?

1 个答案:

答案 0 :(得分:10)

使用-ipo进行编译时,编译器会生成中间代码,但根本不进行优化或内联。您有.o文件,但它们不包含任何机器指令。然后,当您再次调用ifort来创建可执行文件时,编译器会将所有中间代码吸收并进行优化,就好像您已经在一个大源文件中编译了所有内容一样。然后,它可以查看引用了哪些例程以及可以在哪里进行更多优化和内联。

您应该为每次编译传递相同的优化选项 - 它们与中间代码一起记录。

我很确定具有类似功能的其他编译器以同样的方式执行它。 (我以前是英特尔编译器开发/支持工程师。)