【发布时间】:2013-08-23 17:03:39
【问题描述】:
我使用 perf 作为基本事件计数器。我正在开发一个遭受数据缓存存储未命中的程序。其中高达80%的比例。
我知道原则上缓存是如何工作的。它会在各种未命中情况下从内存中加载,并在需要时从缓存中删除数据。我不明白的是,存储加载未命中之间有什么区别。加载和存储有何不同。你怎么能储存小姐?
【问题讨论】:
标签: performance caching cpu-cache perf
我使用 perf 作为基本事件计数器。我正在开发一个遭受数据缓存存储未命中的程序。其中高达80%的比例。
我知道原则上缓存是如何工作的。它会在各种未命中情况下从内存中加载,并在需要时从缓存中删除数据。我不明白的是,存储加载未命中之间有什么区别。加载和存储有何不同。你怎么能储存小姐?
【问题讨论】:
标签: performance caching cpu-cache perf
加载未命中(如您所知)指的是处理器需要从主内存中获取数据,但缓存中不存在数据。因此,每当处理器想要从主内存中获取一些数据时,它就会要求缓存,如果数据已经加载,您将获得加载命中,否则您将获得加载未命中。
store-miss 与处理器何时要将新计算的数据写回主存有关。当它想将数据写回主存时,必须确保缓存的内容和主存储器彼此同步。您可以在此处找到两种不同的策略,这可能会发生这种情况:Writing Policies。
所以无论你选择什么策略,你首先需要检查数据是否已经在缓存中,以便你可以先将它存储到缓存中(因为它更快),以及你正在寻找的数据块是否已经被驱逐从缓存中,您会得到与该缓存相关的存储未命中。
您可以查看the applet here,以更好地了解不同情况下会发生什么。
【讨论】:
我并不完全熟悉 perf 如何定义这些事件,但鉴于通用定义,我相信加载/存储未命中只是一种分解整体未命中率计数的方法,以便您可以判断哪些访问更频繁地丢失.请注意,加载通常是推测性地执行的(至少在现代 x86 cpus 中),而存储是在提交点之后沿着管道执行的,因此即使是在同一区域同时加载和存储的一段代码也可能有不同的未命中费率。
在基于 MESI 的缓存协议中,负载会命中缓存,或者会丢失并从内存或下一个缓存级别中获取行,如果它不属于任何其他人,则要么独占,要么处于共享状态。它会在过程中将数据写入缓存。 商店将以相同的方式获取一行,但使用 RFO(读取所有权)请求,该请求授予其独占所有权和修改该行的权利。该行仍然会被缓存,但是一旦将新数据写入本地(通常在您的 L1 缓存中),它就会被修改。不过,命中/未命中过程看起来是一样的。
Saman 在他的回答中提到的是读写之间的细分。加载和存储(以及其他形式的访问,如代码读取)都构成“读取”部分,而回写(或使用特殊命令或内存类型(如不可缓存)的有意写入)构成“写入部分”。
【讨论】: