【发布时间】: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
我把compile和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
(我猜这一步没有内联,因为文件是独立编译的......)
第二步
然后我将link 目标文件放在一起并创建可执行文件:
ifort -O2 -finline-functions -ipo myProgram.o function.o subroutine.o -o MyProgram
我的问题
如果我单独编译文件,这些优化标志中的哪些应该在哪个阶段传递给编译器?在哪个步骤中执行内联和 IPO?
【问题讨论】:
-
好问题。不过,对于大多数编译器,而不是专门针对英特尔,有一个通用的答案会很好。
-
我也这么认为。如果一个答案对其他语言和编译器是通用的,我肯定会优先考虑其他答案。 (你认为这个问题应该概括吗?我没有这样做是因为我不确定 ifort 特定与一般性的区别。)
-
我不确定它是否更好地概括。也许只为英特尔回答要容易得多。我会保持原样,但如果可能的话,我会用一个聪明的评论要求概括。
标签: optimization makefile compilation fortran intel-fortran