【发布时间】:2014-03-21 23:36:29
【问题描述】:
假设我有一个 2MB 的缓存和一个 3MB 的工作数据集。所以当缓存冷时,它会经历 3MB 的强制未命中。然而,在它升温之后,只会有冲突和容量缺失。所以,现在的未命中率为 33.33%。有人可以告诉我这是否正确吗?如果不是,我如何计算强制未命中的未命中率。
谢谢。
【问题讨论】:
标签: caching memory computer-architecture
假设我有一个 2MB 的缓存和一个 3MB 的工作数据集。所以当缓存冷时,它会经历 3MB 的强制未命中。然而,在它升温之后,只会有冲突和容量缺失。所以,现在的未命中率为 33.33%。有人可以告诉我这是否正确吗?如果不是,我如何计算强制未命中的未命中率。
谢谢。
【问题讨论】:
标签: caching memory computer-architecture
正如 Jason 解释的那样,您 33% 的假设是错误的(或者说缺乏更多信息),完全有可能通过按顺序遍历 3M 来获得 100% 的未命中率,因此在重用之前总是会破坏您的数据。
但要回答一般性问题 - 在 warm 缓存上测量未命中率通常更有趣,因为它代表您的处理器可能在大多数时间处于稳定状态(即- 不是在上下文切换、断电唤醒、刷新等之后的任何时间。)。大多数缓存/CPU 模拟器为此提供了预热阶段,常见的基准测试通常也在几次预热迭代后测量性能。
当然,在其他情况下,测量冷行为可能会很有趣,例如如果您对上述阶段完全感兴趣。或者,如果您正在回答考试问题...
【讨论】:
未命中率定义为每条指令的未命中数。
假设您的工作集的第一条数据位于地址 0x00,并且高速缓存每行可以保存 4 个字。所以当你去访问 0x4 处的数据时,你会错过,但是数据会被提取到地址 0x00、0x04、0x8、0x0C 的缓存中。现在,如果您的下一次访问是对 0x4 的访问,那么它将很成功,因为它已经在缓存中。因此,如果您以 4 字节间隔顺序访问数据,则每 4 次都会命中一次,因此您的未命中率为 25%。
现在缓存可以容纳这 4 个字线中的多个(取决于缓存的设计 - 关联性、行数、字/字节访问),因此这些将再次决定您的容量和冲突未命中。
希望能让您深入了解缓存的工作原理!
【讨论】:
总体未命中率仍然取决于程序对数据的实际处理以及计算机如何将工作集保存在缓存中。因此,除了容量之外,访问模式、关联性、替换算法仍然很重要。 可能缓存预热后的内存引用中有 1/3 未命中,但这不仅仅取决于数据和/或指令缓存容量。
【讨论】: