2014-10-26 37 views
1

我们的编译器课程特性练习要求我们比较使用-O和-O3 gcc选项构建的代码。我的机器生成的代码与课程中的代码不一样。是否有方法来确定课程中使用的优化选项,以便在我的机器上获得相同的代码并进行更有意义的观察?特定体系结构的默认GCC优化选项

我发现如何让我的机器上的优化选项:

$ gcc -O3 -Q --help=optimizer 

但是,有没有办法来推断这些教授的机器上,除了通过尝试所有这些,一个改变他们一个(。 ident“GCC:(Debian 4.3.2-1.1)4.3.2”)?

感谢您的关注。

编辑: 我注意到在我的机器上生成的代码缺乏在我的教授生成的序幕和尾声。有没有强制开启序幕的选项(谷歌似乎没有带来太多)?

+0

几个发行版*补丁* GCC的FSF源代码。所以Debian GCC可能与CentOS不同,即使版本号相同!或者你可以编译FSF源代码。 – 2014-10-26 15:45:37

+0

Hehe尝试所有选项,直到获得相同的代码可能会更快:D – pouzzler 2014-10-26 15:49:41

+0

-Ox中包含的某些优化不能单独选择(不存在此类开关)。详情请见:https://gcc.gnu。组织/ onlinedocs/GCC-4.9.1/GCC /优化,Options.html#优化选项 – dbrank0 2014-10-26 16:53:22

回答

1

下面是您需要了解的关于编译器优化的知识:它们是架构相关的。另外,它们主要是从编译器的一个版本到另一个版本不同(gcc-4.9在默认情况下做的更多东西比gcc-4.4)。 通过建筑,我的意思是CPU微架构(英特尔Nehalem处理器,Sandy Bridge的,Ivy Bridge的,Haswell的,KNC ... AMD山猫,Bulldozzer,捷豹, ...)。编译器通常将输入代码(ÇC++ADA,...)成CPU无关中介表示(GIMPLEGCC)将在其上进行了大量的优化。之后,编译器将生成更接近程序集的较低级别表示。在后者中,体系结构特定的优化将被展开。这种优化包括选择具有最低延迟的指令,根据循环大小,指令高速缓存大小等确定循环展开因子。 由于您生成的代码与您在课堂上获得的代码不同,因此我认为底层体系结构必须不同。在这种情况下,即使使用相同的编译器标志,您也无法获得相同的汇编代码(即使没有优化,您也会得到不同的汇编代码)。 为此,您应该专注于比较优化和非优化代码,而不是试图坚持课堂上给出的内容。我甚至认为这是一个很好的逆向工程练习,可以将您优化的代码与您提供的代码进行比较。 您可以在here中找到我之前关于编译器优化的文章之一。 两个关于这个问题的伟大的书龙书编译原理,技术和工具)阿霍,塞提和Ulman,也工程编译基思·库珀和琳达Torczon。