一个缓存未命中的代价是多少?

4

我正在分析一些代码,并使用cachegrind来获取执行中缓存未命中(L2和L3)的数量。

我的问题是,如何根据缓存未命中确定等待缓存准备所花费的时间?

我想能够说出类似于“我的代码获得了90%的CPU利用率”的话。

是否可能根据cachegrind输出来实现这一点?


1
根据cachegrind文档,“在现代计算机上,L1缺失通常需要大约10个周期,LL缺失可能需要高达200个周期,而错误预测的分支成本在10到30个周期左右。” - Matteo Italia
你可以从系统规格中挖掘数字(如果你找到了的话),或者使用像lmbench这样的工具来测量它。然后,你可以将它们插入cachegrind(或者是我们用来可视化数据的kcachegrind的一个功能?)。 - AProgrammer
@MatteoItalia:假设我有1,000个L2缺失,那就意味着有200,000个未使用的周期。对于一个2.0 GHz的芯片来说,这意味着等待0.001秒? - Martin Kristiansen
@AProgrammer:我刚刚在阅读valgrind --tool=cachegrind的输出。 - Martin Kristiansen
@Martin:CPU的行为过于复杂,不能简单地量化。如果缓存未命中的数据最终不需要使用,那么它可能对性能没有任何影响。 - user82238
3个回答

2
Cachegrind简单地模拟CPU上的执行,模拟缓存和分支预测器的行为。要知道在缓存上阻塞需要更多的信息。具体来说,您需要知道何时可以进行执行推测以及可以同时调度多少条指令(以及如何协调内存访问)。Cachegrind无法做到这一点,而任何能够做到这一点的工具都会严重依赖处理器(而缓存未命中则不太依赖于处理器)。
如果您可以访问现代Intel CPU,我建议您免费获取VTune(非商业用途),并查看其报告。它可以告诉处理器收集关于缓存未命中的数据,并将其报告给您,这样您就可以看到实际发生了什么,而不仅仅是模拟。它将为每行代码提供每个时钟周期的指令数,使用此数据,您可以看到哪些行在缓存上阻塞(以及阻塞多长时间),它还可以提供cachegrind的所有其他信息。
您可以在此处获取它: http://software.intel.com/en-us/articles/non-commercial-software-download/

看起来在Ubuntu机器上使用vtune是不可能的 :-( 错误: 无法启动分析,因为ptrace系统调用应用程序的范围受到限制。要启用分析,请将/proc/sys/kernel/yama/ptrace_scope设置为0。请参阅文档以获取有关永久启用它的说明。 - Martin Kristiansen
sudo echo 1 > /proc/sys/kernel/yama/ptrace 应该可以解决这个问题。 - jleahy
抱歉,我是指零。啊,没有根访问权限会很困难。 - jleahy

1
唯一确定的方法是使用CPU性能监控计数器来测量您特定的CPU - 即使如此,结果也非常具体,并且基于此进行的任何优化可能在具有不同缓存大小、总线架构或内存配置的CPU上表现非常糟糕。

1

如果变量在缓存中,可以在几个时钟周期内获取。

如果不在缓存中,则需要超过一百个时钟周期才能从RAM中获取。


我知道在不同的缓存级别上存在不同的速度问题,有趣的问题是,通过消除缓存未命中,预计会有多少加速?你提出了100倍的加速建议,听起来很乐观。 - Martin Kristiansen
是的,这听起来有点乐观,但我想如果1GHz的时钟速度每秒执行10亿个时钟周期,你可以看到如果有多个缓存未命中,这些周期很快就会被消耗掉。至于实际算法来计算加速比,我从未见过它被提及,因为这完全取决于硬件等因素。但是有一些应用程序可以为您完成此操作,例如上面提到的Cachegrind。 - gavlaaaaaaaa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接