![](/img/trans.png)
[英]is g++ buggy ? and clang++ too ? g++ compiled code with -O0 and -O1 options behaves differently the same is true for clang++ with -O0 and -O2
[英]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.