2014-10-26 78 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。