实现缓存内存系统中计算平均内存访问时间

11
In order to find avg memory access time we have the formula :

Tavg = h*Tc +(1-h)*M

where  h     = hit rate
       (1-h) = miss rate
       Tc    = time to access information from cache
       M     = miss penalty  (time to access main memory)

最近我一直在解决关于这个概念的问题。有时我发现存在着这种令人不安的不一致性:

Case 1: M = Tm + Tc
Case 2: M = Tm
意思是,解决方案表明,在某个问题X中,'M'的值的计算方式如上面的“Case 1”所示,而在另一个问题Y中,同样的计算方式如上面的“Case 2”所示。我尽力分析这些问题,找出使计算不同的因素是什么。但没有任何帮助。我遇到了X和Y完全相同的情况,只是值不同,但是对于X,计算是按照Case 1进行的,对于Y,计算是按照Case 2进行的。
还有其他我不知道的原因会导致计算不同吗?预先感谢您的帮助。
3个回答

7
区别在于如何计算缺失的延迟时间。如果问题说明时间是一个缺失“惩罚”,那么它应该意味着这个时间加上了一个高速缓存命中的时间;因此,总的缺失延迟时间是高速缓存命中延迟时间加上惩罚时间。(显然,你的公式和变量没有采用这种方法,将M——实际上是缺失时的总访问时间——标记为缺失惩罚。)
遗憾的是,如果一个问题说“内存访问延迟”或“L2访问延迟”,甚至更不清楚是指“总”的访问延迟(即包括L1命中所需的时间)还是L1缺失所需的额外时间。前者具有一些概念上的优势(例如,它可以隐藏诸如L2访问开始之前数据返回会发生命中的细节——比如通过使用早期缺失检测或缺失预测甚至是并行标签查找L1和L2)。后者可能会使解释L2大小或关联性的延迟效应更简单(例如,如果将大小翻倍增加L2专用访问延迟50%,则通过将大小加倍将L2专用延迟从8个周期增加到12个周期,四倍增加到18个周期可能更容易理解,而不是看到总延迟从10个周期(其中Tc=2)增加到14个周期和20个周期。)
(此外,使用缺失惩罚数字允许轻微简化访问时间公式——Tavg=Tc+(1-h)Tm——因为Tc总是花费的。)
类似的问题也出现在执行延迟中。使用标量流水线时,需要一个周期来执行的指令通常被认为具有零延迟,因为在执行后续依赖指令时没有延迟。然而,在考虑超标量实现时,这种使用延迟的方式可能会引起混淆。

2

平均内存访问时间 = % 指令 * (命中时间 + 指令缺失率 * 缺失惩罚) + % 数据 * (命中时间 + 数据缺失率 * 缺失惩罚)


该公式是关于计算平均内存访问时间的,其中包含指令和数据两种类型的访问。其中,缺失惩罚是指在缓存未命中时需要从主存中读取数据的时间。

我假设这是针对一级缓存的。如果有两级缓存,L1和L2,那么会有什么变化? - nikk
为什么公式中没有命中率? - enitihas

2

评论中提出了一个相关的问题:

评论:为什么公式中没有命中率?-enitihas于5月13日下午6:09

没有在公式中包含命中率的原因是每次访问,无论是否命中一级缓存,都必须访问一级缓存,并且具有命中时间,即一级缓存的访问延迟。

因此,无论访问是否命中,都需要将命中时间(一级缓存的访问延迟)包含在公式中以计算平均访问时间。


真正的原因是错失惩罚相对于L1命中,这就是为什么它被称为“惩罚”,而不是L1错失/L2命中的总时间。您正确地指出,大多数L1缓存设计会与标记并行获取数据,因此在确定命中/错失后,数据无需准备额外时间。但这对于公式的工作并非必要。即使在疯狂的系统中,请求与检查L1并行发送到L2(因此L1命中根本不会降低命中其余层次结构的请求数量/带宽),该公式仍然有效。 - Peter Cordes
经仔细阅读问题后,似乎问题的主要内容是关于"失误惩罚"是否指"一个请求错失所需的总时间"、"超过L1命中所需的时间"或者是"缓存其余部分开始检查的时间"(正如Paul Clayton优秀回答所指出的那样,这不同于L1命中时间,因为错失侦测可能比从命中中取回数据稍微快一些)。 - Peter Cordes

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