我用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/