CPU缓存性能。存储未命中与加载未命中。

3

我正在使用perf作为基本事件计数器。我正在处理一个程序,它遭受数据缓存存储失效的问题。这个比例高达80%。

我知道缓存的工作原理。它会在各种失效情况下从内存中加载数据,并在适当时从缓存中移除数据。但我不明白的是:存储失效和加载失效有什么区别?它们与加载和存储操作有何不同?什么是存储失效?

2个回答

6
一个load-miss是指当处理器需要从主存储器中获取数据,但在缓存中没有找到数据时。因此,每当处理器需要一些主存储器的数据时,它会查询缓存,如果数据已经加载,则会获得load-hit,否则会获得load-miss。
一个store-miss是指当处理器想要将新计算出的数据写回到主存储器时。当它想要将数据写回到主存储器时,它必须确保缓存和主存储器的内容同步。这可以通过两种不同的策略来实现,您可以在这里找到。
因此,无论选择哪种策略,您首先需要检查数据是否已经在缓存中,以便将其存储到缓存中(因为这更快),如果您正在查找的数据块已经从高速缓存中删除,则与该缓存相关的store-miss将发生。
您可以在此处检查应用程序,以了解不同情况下所发生的情况。

太好了!谢谢。我基本上没能理解存储意味着写入,加载意味着从内存中读取。 - ayan ahmedov
我认为这是错误的,我不熟悉perf如何定义这些事件,但“store”和“load”通常用于指代您在代码中执行的实际操作。 - Leeor

2

我并不完全熟悉性能定义这些事件的方式,但根据通用定义,我认为load/store miss只是一种将整体缺失率拆分的方法,以便您可以确定哪些访问更容易缺失。请注意,加载通常是进行推测性执行的(至少在现代x86 cpu中),而存储则要晚得多,沿着管线,在提交点之后才会执行,因此即使代码片段中同时存在对同一区域的加载和存储操作,其缺失率也可能不同。

在基于MESI的缓存协议中,加载会命中缓存或者从内存或下一个缓存层获取该行数据,如果该行数据没有被其他人所拥有,则加载会以排他方式进程处理;否则它将以共享状态处理。在此过程中,它会将数据写回到缓存中。 存储会以相同的方式获取该行数据,但使用RFO(读取-以获取所有权)请求,获得排他性和修改该行数据的权限。该行数据仍然会被缓存,但一旦新数据被本地写入它(通常在L1缓存中),它就会变成已修改状态。然而,命中/缺失的处理过程看起来是相同的。

Saman在他的回答中提到的是读写之间的区别。加载和存储(以及其他形式的访问,如代码读取)都构成“读”部分,而回写(或有意的写入通过特殊命令或内存类型实现的写入缓存)则构成“写”部分。


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