【发布时间】:2021-11-13 06:57:54
【问题描述】:
我正在学习基本的缓存概念和不同类型的缓存未命中。我了解未命中的强制类型,但我很难理解未命中的冲突和容量类型!我仍然需要了解缓存的替换算法。我已经阅读了本网站上有关此主题的其他问题,但关于这些其他问题的信息在容量和冲突未命中方面一直存在冲突或含糊不清。我希望在这个问题上我的问题能得到解答。
例如,假设我们有一个包含 4 个集合的 2 路关联缓存。先说第一组可以存储两个缓存行/块(因为它是二路关联缓存)。我现在将列出从处理器调用的读取顺序。为简单起见,所有这些正在读取的地址都将落入第一组。
-read address one (no cache line in set one for this address. This would be a compulsory cache miss. Data is copied from memory to the first cache line in this set).
-read address two (no cache line in set one for this address. This would also be a compulsory cache miss. Data is copied from memory to the second cache line in this set).
第一组缓存现在已“预热”,这意味着该组已满容量,其中包含有效的缓存行。现在让我们尝试访问一个也属于第一组的地址。
-read address three (no cache line in set one for this address. Out of space in set one for anymore cache lines to be written.)
我们遇到了一个问题,即试图从内存中获取一条新的缓存线到第一组,但第一组完全被两条缓存线占用。在这种情况下,您必须使用缓存替换策略。这个问题在直接映射缓存中非常普遍。缓解这个问题的方法是增加每个集合的关联性(意味着增加可以存储在一个集合中的缓存行的数量)。
我的问题是,这种情况是强制性的还是冲突的失误?或者冲突未命中会影响所有系列?有什么区别?在我上面写的示例中,它们每个人将如何工作?如前所述,网站上的其他问题对我来说真的没有意义,所以我希望我能尽快解决这个问题。
【问题讨论】:
-
你为什么要标记这个 [x86] [arm]?您是否对其中一个 ISA 的特定微架构感兴趣,比如 Zen 3、Ice Lake 或 Cortex-A57,它们的硬件预取器可能会执行额外的提取,这可能会导致驱逐更多数据以为预取腾出空间(即冲突)?还是他们的多级每核和共享缓存?从问题的文字来看,我猜不是,所以我删除了这两个标签以为 [cpu-cache] 腾出空间,但如果有相关内容,请编辑。
-
compulsive - 正确的术语是 compulsory,即强制/必需,无法避免。希望您的 CPU 不会沉迷于缓存未命中。 :P
-
@Vatine:为什么你认为 [computer-science] 标签不适用于这个问题?它显然是关于简单(甚至过度简化)硬件作为研究缓存的一种方式,而不是真实世界的工程。以及一个没有内存级并行性的简单执行模型。它是关于计算机科学中用于描述缓存行为的术语,而不是关于编程。 OTOH,我们确实已经有 [computer-architecture] 和 [cpu-cache] 标签,所以人们不需要 need [cs] 来找到它,但它是否会弄乱 [cs]以某种方式标记?
-
@PeterCordes 我真的没有看到任何与我认为是“计算机科学”相关的问题(这实际上与硬件无关,基本上是应用数学的一个分支) .
-
@Vatine:请注意,[computer-science-theory] 有一个单独的标签。我猜你认为这是一个错误,并且任何一个标签都应该只用于 Big-O 复杂性、阿姆达尔定律等问题,而不是用于计算机体系结构的理论部分?
标签: caching cpu-architecture cpu-cache