从技术上讲,使用 -O3 编译 gcc 会增加我的缓存未命中率

标签 c gcc caching

我用cachegrind 进行了一些分析并注意到了一些事情。当我使用 -O3 进行编译时,我的数据获取较少,但相同数量的缓存未命中导致较高的未命中率。这很棒,但对我来说这似乎是一件有趣而奇怪的事情,我想知道幕后发生了什么。我打开的唯一其他相关编译器选项是 -march=native 。为了比较,

没有O3

==16951== D   refs:        923,170,681  (817,941,424 rd   + 105,229,257 wr)
==16951== D1  misses:        9,477,102  (  8,115,150 rd   +   1,361,952 wr)
==16951== LLd misses:          647,219  (    262,227 rd   +     384,992 wr)
==16951== D1  miss rate:           1.0% (        1.0%     +         1.3%  )
==16951== LLd miss rate:           0.1% (        0.0%     +         0.4%  )

与O3

==16978== D   refs:      218,804,125  (205,979,405 rd   + 12,824,720 wr)
==16978== D1  misses:      9,372,533  (  8,016,083 rd   +  1,356,450 wr)
==16978== LLd misses:        647,195  (    262,191 rd   +    385,004 wr)
==16978== D1  miss rate:         4.3% (        3.9%     +       10.6%  )
==16978== LLd miss rate:         0.3% (        0.1%     +        3.0%  )

最佳答案

这很可能是由于矢量化造成的:

-O3

Optimize yet more. -O3 turns on all optimizations specified by -O2
and also turns on ... -ftree-vectorize and -fipa-cp-clone options. 

(来自 GCC 联机帮助页)。

关于从技术上讲,使用 -O3 编译 gcc 会增加我的缓存未命中率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59024433/

相关文章:

C : create string in char array from concatenation

gcc - 从 gcc4.7.x 中删除 crt0.o 背后的基本原理是什么?

c - 分配给位域时的 GCC 转换警告

entity-framework - 在 Azure AppFabric 中缓存 Entity Framework 结果

flash - 如何在不清除缓存的情况下强制 Web 浏览器重新加载新部署的 Flash 文件?

c - 指向数组的变量的地址与该变量本身的值之间的差异

c - 我做错了什么或者这是 Go 的 C 编译器中的错误吗?

ios - 如何使用解析缓存策略

c++ - 关于条件运算符的面试问题

node.js - 通过 nvm 安装 node.js v0.8.1 失败