为了使页面变脏(打开页表项中的脏位),我触摸页面的第一个字节,如下所示:
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旗帜,因为它也会带来很大的性能损失.
我知道“为什么我的编译器要这样做”不是最好的问题类型,但这个问题对我来说真的很奇怪,我很困惑。
我原以为这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
我正在尝试使用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; 同样的错误.
测试代码:
#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)