【问题标题】:When does ifort use optimization flags?ifort 何时使用优化标志?
【发布时间】:2018-03-09 21:24:32
【问题描述】:

简介

我了解英特尔的 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

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

第二步

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

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

我的问题

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

【问题讨论】:

  • 好问题。不过,对于大多数编译器,而不是专门针对英特尔,有一个通用的答案会很好。
  • 我也这么认为。如果一个答案对其他语言和编译器是通用的,我肯定会优先考虑其他答案。 (你认为这个问题应该概括吗?我没有这样做是因为我不确定 ifort 特定与一般性的区别。)
  • 我不确定它是否更好地概括。也许只为英特尔回答要容易得多。我会保持原样,但如果可能的话,我会用一个聪明的评论要求概括。

标签: optimization makefile compilation fortran intel-fortran


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 2011-06-27
    • 2023-03-29
    相关资源
    最近更新 更多