相关疑难解决方法(0)

如何防止gcc优化C中的一些语句?

为了使页面变脏(打开页表项中的脏位),我触摸页面的第一个字节,如下所示:

pageptr[0] = pageptr[0];
Run Code Online (Sandbox Code Playgroud)

但在实践中,gcc将忽略死店淘汰的陈述.为了防止gcc优化它,我重新编写语句如下:

volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;
Run Code Online (Sandbox Code Playgroud)

似乎这个伎俩有效,但有点难看.我想知道是否有任何指令或语法具有相同的效果?而且我不想使用-O0旗帜,因为它也会带来很大的性能损失.

c gcc

95
推荐指数
3
解决办法
12万
查看次数

std::min 与使用 #pragma GCC 优化(“O3”)的三元 gcc 自动矢量化

我知道“为什么我的编译器要这样做”不是最好的问题类型,但这个问题对我来说真的很奇怪,我很困惑。

我原以为这std::min()与手写的三元相同(可能还有一些编译时模板的东西),并且在正常使用时似乎可以编译为相同的操作。但是,当尝试使“最小和总和”循环自动向量化时,它们似乎不一样,如果有人能帮我找出原因,我会很高兴。这是一个产生问题的小示例代码:

#pragma GCC target ("avx2")
#pragma GCC optimize ("O3")

#include <cstdio>
#include <cstdlib>
#include <algorithm>

#define N (1<<20)
char a[N], b[N];

int main() {
    for (int i=0; i<N; ++i) {
        a[i] = rand()%100;
        b[i] = rand()%100;
    }

    int ans = 0;
    #pragma GCC ivdep
    for (int i=0; i<N; ++i) {
        //ans += std::min(a[i], b[i]);
        ans += a[i]>b[i] ? a[i] : b[i];
    }
    printf("%d\n", ans);
}
Run Code Online (Sandbox Code Playgroud)

我gcc 9.3.0用编译命令编译它g++ -o test test.cpp -ftree-vectorize -fopt-info-vec-missed -fopt-info-vec-optimized -funsafe-math-optimizations …

c++ optimization gcc compiler-optimization auto-vectorization

9
推荐指数
1
解决办法
222
查看次数

使用#pragma GCC优化进行C代码优化

我正在尝试使用GCC编译指示优化来设置我的C代码中的全局优化.GCC版本在Ubuntu上是4.4.3.基本思想是使用功能特定的优化级别.

#pragma GCC optimize ("O3")
Run Code Online (Sandbox Code Playgroud)

我的C代码中的main函数之前出现了编译错误

但是当我构建它时,我得到编译错误如下 -

passrecovery.c: In function âmainâ:
passrecovery.c:493: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.4/README.Bugs> for instructions.
make: *** [all] Error 1
Run Code Online (Sandbox Code Playgroud)

我检查了错误中提到的README.Bugs文件,但没有找到关于此的线索.

是否#pragma optimize支持4.4.3 GCC?

如果是,那么我在使用此pragma优化代码时所做的错误是什么.

用于优化速度代码的任何其他替代GCC指令?

编辑:我甚至尝试#pragma GCC push_options,然后#pragma GCC optimize ("O3")在文件末尾#pragma GCC pop_options; 同样的错误.

c optimization gcc

3
推荐指数
1
解决办法
1万
查看次数

如何强制 g++ 内联 STL 函数

测试代码:

#include <array>

int test(const std::array<int, 10> &arr) {
    return arr[9];
}
Run Code Online (Sandbox Code Playgroud)

我要实现arr[0]像C风格数组一样高效,这意味着内联STL数组[]运算符函数。

我检查了生成汇编代码:

$ g++ --std=c++17  -c test.cpp && objdump -d -C test.o

test.o:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 <test(std::array<int, 10ul> const&)>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   48 83 ec 10             sub    $0x10,%rsp
   8:   48 89 7d f8             mov    %rdi,0xfffffffffffffff8(%rbp)
   c:   48 8b 45 f8             mov    0xfffffffffffffff8(%rbp),%rax
  10:   be 09 00 00 00          mov    $0x9,%esi
  15:   48 89 …
Run Code Online (Sandbox Code Playgroud)

c++ gcc stl compiler-optimization

0
推荐指数
1
解决办法
224
查看次数