我想知道是否有一个可以与GCC一起使用的选项,以获得有关编译器实际选择和执行的优化的详细报告。使用-opt-report的英特尔C编译器可以实现这一点。我不想查看汇编文件并找出优化。我特意寻找编译器选择的循环展开和循环平铺因子。
答案 0 :(得分:13)
虽然它不是汇总信息意义上的报告,但您可以尝试使-fdump-ipa-all
选项使gcc
生成转储文件,这至少使您无需分析汇编程序代码。
关于循环优化,-fdump-rtl-loop2
选项可能很有用。
有关所有这些的详细信息,请参阅手册的Options for Debugging Your Program or GCC部分。
答案 1 :(得分:0)
GCC的报告并不像intel那样直接,但是我们可以选择。这是GCC用于优化的详细选项。
-fopt-info -fopt-info-options -fopt-info-options =文件名 控制来自各种优化过程的优化转储。如果使用“-选项”形式,则选项是“-”分隔的选项关键字列表,用于选择转储详细信息和优化。
选项可以分为三组:
选项描述应该发出哪种类型的消息, 描述转储详细程度的选项,以及 描述应包括哪些优化的选项。 每个组的选项可以自由混合,因为它们不重叠。但是,如果发生任何冲突,则后面的选项会覆盖命令行上的前面的选项。
以下选项控制应发出哪些类型的消息:
“已优化” 成功应用优化后打印信息。决定通过哪些信息是最重要的。例如,矢量化程序通过打印成功进行矢量化的循环的源位置。
“错过” 打印有关错过的优化的信息。个人通过控制哪些信息要包含在输出中。
“注意” 打印有关优化的详细信息,例如某些转换,有关决策的更详细的消息等。
‘全部’ 打印详细的优化信息。其中包括“优化”,“缺失”和“注释”。
以下选项控制转储的详细程度:
“内部人员” 默认情况下,仅发出“高级”消息。此选项可启用其他更详细的消息,这些消息可能仅对GCC开发人员感兴趣。
以下一个或多个选项关键字可用于描述一组优化:
“ ipa” 启用所有过程间优化中的转储。
“循环” 从所有循环优化中启用转储。
“内联” 启用所有内联优化中的转储。
‘omp’ 从所有OMP(卸载和多处理)优化中启用转储。
‘vec’ 启用所有矢量化优化中的转储。
‘optall’ 启用所有优化中的转储。这是上面列出的优化组的超集。
如果省略选项,则默认为“ optimized-optall”,这意味着从所有过程中转储有关成功优化的消息,而忽略被视为“内部”消息。
如果提供了文件名,则来自所有适用优化的转储将串联到文件名中。否则,转储将输出到stderr。尽管可以接受多个-fopt-info选项,但是其中只有一个可以包含文件名。如果提供了其他文件名,则将忽略除第一个此类文件名之外的所有文件名。
请注意,如果有多个翻译单元,输出文件名将被覆盖。如果需要多个翻译单元的组合输出,则应改用stderr。
在以下示例中,优化信息将输出到stderr:
gcc -O3 -fopt-info 这个例子:
gcc -O3 -fopt-info-missed = missed.all 从所有通道中将错过的优化报告输出到missed.all中,而这个:
gcc -O2 -ftree-vectorize -fopt-info-vec-missed 在stderr上打印关于矢量化传递错过的优化机会的信息。请注意,-fopt-info-vec-missed等效于-fopt-info-missed-vec。在-fopt-info之后列出的优化组名称和消息类型的顺序无关紧要。
另一个例子,
gcc -O3 -fopt-info-inline-optimized-missed = inline.txt 将所有内联通道中丢失的优化以及优化位置的信息输出到inline.txt中。
最后,考虑:
gcc -fopt-info-vec-missed = vec.miss -fopt-info-loop-optimized = loop.opt 这里,两个输出文件名vec.miss和loop.opt冲突,因为只允许一个输出文件。在这种情况下,只有第一个选项生效,随后的选项将被忽略。因此,只会生成vec.miss,其中包含来自矢量化器的有关错过机会的转储。