2

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

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

4

2 回答 2

5

加载未命中(如您所知)指的是处理器需要从主内存中获取数据,但缓存中不存在数据。因此,每当处理器想要从主内存中获取一些数据时,它就会要求缓存,如果数据已经加载,您将获得加载命中,否则您将获得加载未命中。

store-miss 与处理器何时要将新计算的数据写回主存有关。当它想将数据写回主存时,必须确保缓存和主存的内容彼此同步。您可以在此处找到两种不同的策略,这可能会发生这种情况:编写策略

所以无论你选择什么策略,你首先需要检查数据是否已经在缓存中,以便你可以先将它存储到缓存中(因为它更快),并且你正在寻找的数据块是否已经被从缓存中逐出,您会得到与该缓存相关的存储未命中。

您可以在此处查看小程序,以更好地了解不同场景中发生的情况。

于 2013-08-23T18:16:48.590 回答
2

我并不完全熟悉 perf 如何定义这些事件,但鉴于通用定义,我相信加载/存储未命中只是一种分解整体未命中率计数的方法,以便您可以判断哪些访问更频繁地丢失。请注意,加载通常是推测性地执行的(至少在现代 x86 cpu 中),而存储是在提交点之后沿着管道执行的,因此即使一段代码同时加载和存储到同一区域也可能有不同的未命中率。

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

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

于 2013-09-07T10:23:23.720 回答