簡體   English   中英

g++ O1 不等於帶有所有相關優化標志的 O0

[英]g++ O1 is not equal to O0 with all related optimization flags

我知道標題有點混亂。 讓我用一點背景來澄清我的問題:

就執行時間而言,當我使用-O1標志與-O0標志編譯它時,我的程序表現得很奇怪。 我知道-O1標志做了很多優化,如fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments (超過40根據手冊頁)。 為了找出導致這種行為的優化,我計划一次刪除一個標志,然后編譯和測試以查看是否有變化。

在做這個實驗之前,我想確保用-O1編譯的程序和用-O0編譯的程序加上-O1啟用的所有標志(讓我們調用-O0+ )表現相似。 實際上,我希望這兩種方法都應該生成相同的二進制文件,因為啟用了相同的優化標志。

O1合輯

CC = g++

CFLAGS = -std=c++11 -Wall -fopenmp
SOURCE = a_count_f.cpp
EXEC = run
INC = inc

all: $(EXEC)
.PHONY: all

$(EXEC): $(SOURCE)
    $(CC) $(CFLAGS) -O1 -o $(EXEC) -I$(INC) $^

O0+編譯

CC = g++

CFLAGS = -std=c++11 -Wall -fopenmp
SOURCE = a_count_f.cpp
EXEC = run
INC = inc

OPT_FLAGS = -fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments -fcompare-elim -fcprop-registers -fdce -fdefer-pop -ftree-builtin-call-dce -fdse -fforward-propagate -fguess-branch-probability -fif-conversion2 -fif-conversion -finline-functions-called-once -fipa-pure-const -fipa-profile -fipa-reference -fmerge-constants -fmove-loop-invariants -fomit-frame-pointer -freorder-blocks -fshrink-wrap -fshrink-wrap-separate -fsplit-wide-types -fssa-backprop -fssa-phiopt -ftree-bit-ccp -ftree-ccp -ftree-ch -ftree-coalesce-vars -ftree-copy-prop -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-pta -ftree-ter -funit-at-a-time

all: $(EXEC)
.PHONY: all

$(EXEC): $(SOURCE)
    $(CC) $(CFLAGS) -O0 $(OPT_FLAGS) -o $(EXEC) -I$(INC) $^

然而,結果-O1-O0+給出了完全不同的結果。 盡管存在所有優化差異,但-O0-O0+給出的結果非常相似。 (通過結果,我的意思是執行時間)

我已經使用-Q --help=optimizers檢查了兩個編譯,並且輸出確認兩者都啟用了相同的標志。

接下來對我來說是比較匯編代碼。 在這樣做之前,我想在這里問一下是否有人知道為什么會發生這種情況。 我沒有包含源代碼,因為問題似乎與源代碼無關。 但是,如果需要,我可以附上它。

g++ 版本: g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0

-O1應用的優化標志僅在優化器打開時適用。 您需要將-On指定為n > 0 ,以便優化標志實際執行任何操作。

換句話說, -O0不會打開優化器,因此優化標志不執行任何操作。


您可以使用標志的-fno形式關閉優化標志。 例如

-fcompare-elim 

標志由-O1打開,您可以使用將其關閉

-fno-compare-elim 

正如TC所指出的,另一件要注意的事情是, 並非所有優化都有一個標志,因此沒有任何方法可以關閉這些特定優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM