带有所有相关优化标志的g ++ O1不等于O0 [英] g++ O1 is not equal to O0 with all related optimization flags

查看:85
本文介绍了带有所有相关优化标志的g ++ O1不等于O0的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I know the title is a bit confusing. Let me clarify my problem with a little background:

当我使用 -O1 标志编译它时,程序的行为会很奇怪vs -O0 标志的执行时间。我知道 -O1 标志会进行许多优化,例如 fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments (根据手册页,超过40个)。为了弄清楚哪个优化导致了此行为,我计划一次删除一个标志,然后进行编译和测试以查看是否有所更改。

My program behaves strangely when I compile it with -O1 flag vs -O0 flag in terms of execution time. I know -O1 flag does many optimizations such as fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments (More than 40 according to the man page). To figure out which optimization(s) cause this behavior, I plan to remove flags one at a time then compile and test to see if something changes.

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

Before doing this experiment, I want to make sure that the program compiled with -O1 and the program compiled with -O0 plus all flags which -O1 enables (Lets call -O0+) behave similarly. Actually, I expect both method should produce the same binary file since the same optimization flags are enabled.

使用 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 + 给出的结果非常相似。 (按结果,我是指执行时间)

However, It turned out -O1 and -O0+ give quite different result. Despite of all optimizations differences, -O0 and -O0+ give very similar results. (By results, I mean execution time)

我已经使用 -Q --help = optimizers 检查了两个编译

I have checked both compilation with -Q --help=optimizers and the output confirmed that both enables the same flags.

接下来我要比较的是汇编代码。在此之前,我想在这里问是否有人知道为什么会这样。我没有包含源代码,因为问题似乎与源代码无关。但是,如果需要,我可以附加它。

The next for me is to compare assembly codes. Before doing that, I want to ask it here if anyone has an idea why this happens. I didn't include the source code as it seems the problem is not related to source code. But, I can attach it if needed.

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

推荐答案

仅由 -O1 应用的优化标志打开优化器时应用。您需要指定 -On n> 0 ,以便优化标记实际执行任何操作。

The optimizations flags applied by -O1 only apply when the optimizer is turned on. You need to specify -On with n > 0 in order for the optimization flags to actually do anything.

换句话说, -O0 不会打开优化器,因此优化标志不会执行任何操作。

To put it another way, -O0 doesn't turn on the optimizer, so the optimization flags don't do anything.

您可以通过使用 -fno 形式的标志来关闭优化标志。例如,

You can turn off optimzations flags by using the -fno form of the flag. For instance the

-fcompare-elim 

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

flag is turned on by -O1 and you can turn it back off using

-fno-compare-elim 






TC 指出的另一件事是并非所有优化都具有标记,因此无法关闭这些特定的优化。


Another thing to note, as pointed out by T.C., is that not all optimizations have a flag so there isn't any way to turn those particular optimizations off.

这篇关于带有所有相关优化标志的g ++ O1不等于O0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆