2015-10-14 80 views
7

我想为输入C程序定义一组优化序列,以研究我的应用序列对代码性能的影响。GCC优化标志的顺序

例如:

gcc -fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments ... test.c -o out.o 

这些选项的顺序会影响所产生的代码的有效性?

同样,两次应用优化选项确实会产生影响吗?

有没有更好的方法来测试数以千计的优化序列?就像-02(包括约20选项),我想定义自己的标志

回答

5
  • 难道这些选项的顺序会影响生成的代码的有效性?

    • ,这些选项作为命令行参数传递到编译器的顺序不影响所产生的代码的有效性。
  • 有没有更好的方法来测试成千上万的优化序列?

    • 因为我们没有w.r.t的优化参数传递给编译器的优化序列,我们没有办法测试。但是,如您所知,我们拥有您可以尝试的优化级别。
  • 更高的优化级别对程序执行更多的全局转换,并应用更昂贵的分析算法以生成更快,更紧凑的代码。编译时间的价格和执行时间的改进都取决于特定的应用程序和硬件环境。您应该尝试为您的应用程序找到最佳级别。 请参考Optimization Levels for GCC

  • 我想定义自己的标志

  • 目前,GCC支持很多标志,你可以在Optimize Options参考。如果你想定义一个标志,那么编译器需要了解它,你可能需要修改gcc的编译器代码,以便它可以理解一个新的标志。请参阅github上的代码,opts.c,opts.c处理优化标志和级别。

  • 同样,两次应用优化选项的确会产生影响吗?

    • 不,两次应用相同的优化选项不会产生影响。例如:执行gcc -fauto-inc-dec -fauto-inc-dec test.c与执行gcc -fauto-inc-dec test.c具有相同的影响。

方关于额外的优化留言中加入经过 - 你可以写一个gcc的优化插件,使更多的过程,请参阅这篇文章:An introduction to creating GCC plugins文章有助于创建插件做额外的优化。通过,转换代码或分析信息。)

+0

你说没有。然而,在科学论文中,我发现了这样一个说法:“在优化编译器时,按照固定顺序对 程序的每种方法应用 相同的优化阶段集合是标准做法。然而,一些研究人员已经表明,最好的优化 的优化顺序在一个程序中有所不同,也就是说,它是特定于功能的。因此,我们需要一种技术来为程序的各个部分选择最佳优化排序,而不是应用相同的固定优化集为整个计划的 “。 https://www.eecis.udel.edu/~cavazos/oopsla-2012.pdf – staticx

+5

@staticx:是的,你说的正确的是,优化顺序通过很重要。但是,给定命令行参数的顺序不会影响gcc中的优化传递顺序。 – janneb

+0

@janneb我不太熟悉gcc和优化阶段排序问题。好的,假设我有一个给定的C程序和一系列优化序列。我如何制作影响代码转换的通行证? – staticx