ifort 何时使用优化标志?

When does ifort use optimization flags?

简介

我了解英特尔的 Fortran 编译器 ifort 执行一定量的函数内联和 interprocedural optimization (IPO),以及其他标准优化。这可以按照以下示例完成:

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

编译器选项说明:

假设我将编译过程分成两步,就像使用 Makefile 时经常做的那样....

第 1 步

我把compile and assemble一堆文件分开,把源代码变成目标文件:

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 将目标文件放在一起并创建可执行文件:

我的问题

如果我单独编译文件,这些优化标志中的哪些应该在哪个阶段传递给编译器?在哪个步骤是否进行了内联和IPO?

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

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

我很确定具有类似功能的其他编译器也以大致相同的方式执行此操作。 (我是前英特尔编译器 dev/support 工程师。)