【发布时间】:2017-04-11 22:38:30
【问题描述】:
我目前正在尝试优化我的软件以更好地使用 CPU 缓存。 SO上有一些帖子表明有时很难猜测 CPU 缓存在做什么以及为什么在某些情况下会出现一些性能下降。例如:
- Why does the speed of memcpy() drop dramatically every 4KB?
- Why is my program slow when looping over exactly 8192 elements?
- Why is transposing a matrix of 512x512 much slower than transposing a matrix of 513x513?
因此,为了了解缓存未命中发生的位置,我可以运行 perf 来获取缓存未命中的计数以及它们发生的位置以及 valgrind --tool=cachegrind 来模拟缓存(至少一个 L1 和一个最后一级缓存)。
很高兴知道在哪里缓存未命中发生,但我想知道为什么会发生(例如缓存丢弃等)。有没有办法显式暂停程序并查看缓存中的内容(可能在附加的valgrind 和vgdb 中运行程序)?
【问题讨论】:
-
计算机科学中只有两个难点:缓存失效和命名。
-
@themagicalyang:“计算机科学中只有两件困难的事情:缓存失效、命名事物和一个错误”。请不要破坏众所周知的谚语。
-
您不想看到“为什么”它们会在个别时间发生,而是“为什么”它们会经常发生。
标签: c++ c performance caching cpu-cache