首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >g++ O1不等于带有所有相关优化标志的O0

g++ O1不等于带有所有相关优化标志的O0
EN

Stack Overflow用户
提问于 2018-11-06 16:23:22
回答 1查看 1.1K关注 0票数 5

我知道标题有点混乱。让我用一些背景来澄清我的问题:

在执行时间方面,当我用-O1标志和-O0标志编译它时,我的程序表现得很奇怪。我知道-O1标志做了许多优化,比如fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments (根据手册页超过40 )。为了找出是哪种优化导致了这种行为,我计划一次删除一个标志,然后编译并测试,看看是否有什么变化。

在做这个实验之前,我想确保用-O1编译的程序和用-O0编译的程序加上-O1启用的所有标志(让我们调用-O0+)都有类似的行为。实际上,由于启用了相同的优化标志,我希望这两种方法都应该生成相同的二进制文件。

O1编译

代码语言:javascript
复制
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+编译

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-06 16:26:00

-O1应用的优化标志仅在打开优化器时应用。您需要使用-On指定n > 0,这样优化标志才能实际执行任何操作。

换句话说,-O0不会打开优化器,所以优化标志不会做任何事情。

可以使用标志的-fno窗体关闭优化标志。例如,

代码语言:javascript
复制
-fcompare-elim 

标志由-O1打开,您可以使用

代码语言:javascript
复制
-fno-compare-elim 

另一件需要注意的事情是,正如T.C.所指出的,并非所有的优化都有一个标志。因此没有任何方法来关闭这些特定的优化。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53175916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档