cpu缓存性能。商店未命中与负载未命中

时间:2013-08-23 17:03:40

标签: performance caching cpu-cache perf

我使用perf作为基本事件计数器。我正在研究一个遭受数据缓存存储丢失的程序。其中高达%80的比例。

我知道缓存在原理上是如何工作的。它在各种未命中情况下从内存加载,在需要时从缓存中删除数据。我不明白的是,存储 - 负载未命中之间有什么区别。它的加载和存储方式有何不同。你怎么能存储错过?

2 个答案:

答案 0 :(得分:3)

load-miss(如您所知)指的是处理器何时需要从主内存中获取数据,但缓存中不存在数据。因此,每当处理器需要来自主存储器的某些数据时,它就会询问缓存,如果数据已经加载,则会受到负载损坏,否则会出现负载未命中。

存储未命中与处理器何时想要将新计算的数据写回主存储器有关。当它想要将数据写回主存储器时,它会确保缓存的内容和主存储器彼此同步。您可以在此处找到两种不同的策略:Writing Policies

因此,无论您选择哪种策略,首先需要检查数据是否已经存在于缓存中,以便您可以先将其存储到缓存中(因为它更快),如果您要查找的数据块已被逐出从缓存中,您将获得与该缓存相关的存储未命中。

您可以查看the applet here,以便更好地了解不同情况下会发生什么。

答案 1 :(得分:1)

我并不完全熟悉perf如何定义这些事件,但考虑到常见的定义,我认为加载/存储未命中只是一种打破整体未命中率计数的方法,这样您就可以知道哪些访问错过了更经常的。请注意,负载通常是以推测方式执行的(至少在现代x86 cpus中),而存储在管道之后沿着管道执行得更晚,因此即使是同一区域的加载和存储的一段代码也可能有不同的错误率。

在基于MESI的缓存协议中,加载会触发缓存,或者错过并从内存或下一个缓存级别获取该行,如果它不是其他任何人拥有的话,则是排他性的,或者如果它不属于共享状态则是它是。它会在整个过程中将数据写入缓存。 商店将以相同的方式获取一行,但使用RFO(读取所有权)请求,该请求授予其独占所有权和修改该行的权利。该行仍然会被缓存,但是一旦新数据在本地写入(通常在您的L1缓存中),它就会被修改。命中/未命中过程看起来是一样的。

Saman在他的回答中提到的是读写之间的细分。加载和存储(以及其他形式的访问,如代码读取)都形成了"读取"部分和回写(或使用特殊命令的故意写入或memache类型,如不可缓存)形成"写入部分。