相关疑难解决方法(0)

gcc优化标志-O3使代码比-O2慢

我发现这个主题为什么处理排序数组比未排序数组更快?.并尝试运行此代码.而且我发现了奇怪的行为.如果我使用-O3优化标志编译此代码,则需要2.98605 sec运行.如果我用-O2它编译1.98093 sec.我尝试在同一环境中的同一台机器上运行此代码几次(5或6),我关闭所有其他软件(chrome,skype等).

gcc --version
gcc (Ubuntu 4.9.2-0ubuntu1~14.04) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Run Code Online (Sandbox Code Playgroud)

那么请你能解释一下为什么会这样吗?我阅读gcc手册,我看到-O3包括-O2.谢谢你的帮助.

PS添加代码

#include <algorithm>
#include <ctime>
#include <iostream>

int main()
{
    // Generate data
    const unsigned arraySize = 32768;
    int data[arraySize];

    for (unsigned …
Run Code Online (Sandbox Code Playgroud)

c++ optimization gcc

18
推荐指数
1
解决办法
5180
查看次数

为什么 rv32gc 针对 RISC-V 优化带有分支的无分支代码?

让我们尝试定义一个返回两个值 x 和 y 中的最大值的函数。这些公式有效的充分条件是,对于有符号整数,\xe2\x80\x932^30 <= x, y <= 2^30 \xe2\x80\x93 1,对于无符号整数,0 <= x, y <= 2^31 \xe2\x80\x93 1即,只需要处理有效减少一位的缩小整数范围)。最通用(且最简单)的实现是:

\n
int max(int x, int y) {\n    return (x > y) ? x : y\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在 Pentium Pro 之前,这将是 x86 中生成的程序集:

\n
max:  # GCC -O3 -march=pentium -m32\n  mov eax, DWORD PTR [esp+8]\n  cmp eax, DWORD PTR [esp+4]\n  jge .L4\n  mov eax, DWORD PTR [esp+4]\n.L4:\n  ret\n
Run Code Online (Sandbox Code Playgroud)\n

但从 Pentium Pro 开始,CMOVcc r32,r/m引入了一条新指令,它根据某些指定的状态标志执行条件移动: …

gcc clang compiler-optimization branch-prediction riscv

6
推荐指数
1
解决办法
460
查看次数