您如何找到单级缓存的未命中惩罚?

Posted

技术标签:

【中文标题】您如何找到单级缓存的未命中惩罚?【英文标题】:how do you find the miss penalty of a single level cache? 【发布时间】:2019-12-09 22:35:15 【问题描述】:

我正在尝试查找单级缓存的平均内存访问时间 (AMAT)。为此,必须计算未命中惩罚,因为 AMAT 公式需要它。

对多级缓存执行此操作需要使用下一级缓存惩罚。但是对于单个级别,显然没有其他缓存级别。

那么这个是怎么计算的呢?

公式: AMAT = HIT-TIME + MISS-RATE * MISS-PENALTY

【问题讨论】:

【参考方案1】:

您有正确的公式来计算 AMAT,但是您可能误解了公式的组成部分。让我们看看如何使用这个等式,首先使用单级缓存,然后使用多级缓存。

假设您有一个单级缓存。命中时间表示从缓存中搜索和检索数据所需的时间。未命中率表示未驻留在缓存中的请求数据的百分比,即您必须去主内存检索的数据百分比。未命中惩罚是在缓存中未命中后检索数据所需的时间。因为我们正在处理单级缓存,所以内存层次结构中唯一需要考虑的其他级别是主内存以用于未命中惩罚。

Here’s a good example for single-level cache:
L1 cache has an access time of 5ns and a miss rate of 50%
Main memory has an access time of 500ns

AMAT = 5ns + 0.5 * 500ns = 255ns

您总是先检查缓存,因此总是会产生 5 ns 的命中时间开销。因为我们的未命中率是 0.5,所以我们有一半的时间在 L1 缓存中找到我们要查找的内容,而剩下的一半时间必须转到主存。您可以使用加权平均值通过以下方式计算未命中惩罚: (0.5 * 0ns) + (0.5 * 500ns) = (0.5 * 500ns) = 250ns

现在,假设您有一个多级缓存,即 L1 和 L2 缓存。命中时间现在表示在 L1 缓存中检索数据的时间量。未命中率表示我们在 L1 缓存中丢失的频率。计算多级缓存中的未命中惩罚并不像以前那么简单,因为我们需要考虑从 L2 缓存中读取数据所需的时间以及我们在 L2 缓存中未命中的频率。

Here’s a good example: 
L1 cache has an access time of 5 ns and miss rate of 50%
L2 cache has an access time of  50 ns and miss rate of 20%
Main memory has an access time of 500 ns

AMAT = 5ns + 0.5 * (50ns  + 0.2 * 500ns) = 80 ns

同样,您总是首先检查 L1 缓存,因此您总是会产生 5 ns 的命中时间开销。因为我们的未命中率是 0.5,所以我们有一半时间在 L1 缓存中找到我们要查找的内容,而剩下的一半时间必须沿着内存层次结构(L2 缓存、主内存)向下查找。如果我们在 L1 缓存中没有找到数据,我们总是在 L2 缓存中查找。因此,每次我们在 L1 缓存中丢失时都会产生 50 ns 的命中时间开销。如果数据也不在 L2 缓存中(这是 20% 的时间),我们必须转到内存访问时间为 500 ns 的主内存。

【讨论】:

以上是关于您如何找到单级缓存的未命中惩罚?的主要内容,如果未能解决你的问题,请参考以下文章

您如何测试 Spring @Transactional 而不只是命中休眠级别 1 缓存或进行手动会话刷新?

“干净数据缓存未命中”和“脏数据缓存未命中”之间的区别

如何提升缓存命中率

如何提升缓存命中率

如何提高缓存命中率

如何提高缓存命中率(Redis)