2016-04-15 111 views
0

我看到這個線程,和我有同樣的問題,但是這一次是不是真的回答:GCC standard optimizations behaviorGCC手工採摘優化

我想弄清楚到底是什麼標誌在性能造成一個令人難以置信的提升,在O1。我首先使用g++ -O1 -Q --help=optimizers找出了哪些標誌被設置,然後得到每個啓用的標誌,並用它們用g ++編譯。但是輸出結果是不同的(二進制本身具有不同的大小)。

我該如何精選g ++的優化或者這是不可能的?

+0

爲什麼你要挑選它們,而不是讓優化器完成它的工作,如果它給你提供了令人難以置信的性能提升? –

+2

並非所有包含在-O *中的優化都可用作獨立交換機。 – SergeyA

+0

@MattJordan我想知道導致性能改善的原因。我強烈懷疑這是緩存使用效果更好的結果,但我無法輕鬆擴展問題,因此找到原因的唯一方法是找到影響運行時間最多的優化,並查看它是否是導致程序具有更好的局部性。如果確實如此,則有一點清楚,即改善是帶寬限制的結果。否則,這是另一回事,但知道哪個優化會對它有所幫助。 –

回答

3

並非所有優化都有單獨的標誌,因此它們的組合不會產生與使用-O1或任何其他常規優化啓用選項(-Os,-O2等)相同的代碼。另外我想象一下,當您使用-O0(默認值)時,會忽略很多特定的優化選項,因爲它們需要在優化尚未啓用時跳過的傳遞。

要嘗試縮小性能提高範圍,您可以嘗試使用-O1,然後選擇性地禁用優化。例如:

g++ -O1 -fno-peephole -fno-tree-cselim -fno-var-tracking ... 

雖然這樣你仍然可能沒有更好的運氣。這可能是多種優化結合在一起產生了性能提升。這也可能是優化沒有被任何特定標誌覆蓋的結果。

我還懷疑更好的緩存局部性會導致您的「令人難以置信的性能提升」。如果是這樣,那很可能是巧合,特別是在-O1。通常會導致性能提高,因爲GCC可以消除一段代碼,因爲它實際上沒有任何淨效應,總是會導致計算出相同的值或調用未定義的行爲。