我连续执行了6次1000x1000矩阵乘法代码以及 perf stat -e cache-misses 命令,得到了以下结果
Observation Cache-Misses Time elapsed(sec)
1 48822173 7.697147087
2 48663517 7.710045908
3 48667119 7.701690126
4 48867057 7.766267284
5 48610651 7.701600681
6 49203583 7.719180737
正如我们在这里看到的,观察1的缓存未命中大于观察2,3中的缓存未命中。但观察1的经过时间小于观察2,3和3。另一方面,观察4在所有这些观察中具有最高的经过时间,但观察4的高速缓存未命中小于观察3和观察6.根据教科书,增加高速缓存未命中延长了程序的执行时间。那么我们如何解释这种行为呢?谢谢
以下是我的系统详情:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 2
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 42
Stepping: 7
CPU MHz: 2300.000
BogoMIPS: 4589.89
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 3072K
NUMA node0 CPU(s): 0-3
答案 0 :(得分:2)
有几种工具可以找到缓存未命中的根本原因。但是很多失误并不总是意味着更长的执行时间。它还取决于缓存未命中级别。
此外,建议执行一次或两次观察运行而不收集热缓存的统计信息(即填充数据):后续运行将受益于第一个使用必要数据预热缓存的运行。
像dprof
这样的工具可以帮助您找到因缓存未命中而导致的原因和性能问题。试试吧。