缓存路与缓存组之间的区别

21
我正在尝试学习有关缓存的一些知识。假设我有一个4路32KB高速缓存和1GB内存。每个高速缓存行的大小为32字节。因此,我了解到RAM将被分成256个4096KB页面,每个页面映射到一个高速缓存集,其中包含4个高速缓存行。

我有多少个高速缓存路?我甚至不确定什么是高速缓存路。可以有人解释一下吗?我已经做了一些搜索,最好的例子是:

http://download.intel.com/design/intarch/papers/cache6.pdf

但我仍然感到困惑。

谢谢。

3个回答

26
您所提到的缓存被称为组相联缓存。整个缓存被分成几组,每组包含4个缓存行(因此是4路缓存)。因此,关系如下所示:

缓存大小 = 缓存中集合的数量 * 每个集合中的缓存行数 * 缓存行大小

您的缓存大小为32KB,是4路缓存,缓存行大小为32B。因此,集合的数量为 (32KB / (4 * 32B)) = 256
如果我们将主存视为由缓存行组成,则每个大小为一个缓存行的内存区域称为块。因此,主存的每个块都将映射到一个缓存行(但不总是映射到特定的缓存行,因为它是组相联缓存)。
在组相联缓存中,每个内存块都将映射到缓存中的一个固定集合。但它可以存储在该集合的任何一个缓存行中。在您的示例中,每个内存块可以存储在一个集合的4个缓存行中的任何一个中。
内存块到缓存行的映射
主内存中的块数 = (1GB / 32B) = 2^25
每个页面中的块数 = (4KB / 32B) = 128
系统中每个字节地址可以分为3个部分:
  1. 最右边的位表示缓存行或块内的字节偏移量
  2. 中间位表示此字节(或缓存行)将映射到哪个缓存集
  3. 最左边的位表示标记值
表示1GB内存所需的位数= 30(1GB = (2^30)B)
表示缓存行偏移量所需的位数= 5(32B = (2^5)B)
表示256个缓存集所需的位数= 8(2^8 = 256)

那么我们就有 (30 - 5 - 8) = 17 位用于标签。由于不同的内存块可以映射到同一缓存行中,因此这个标签值有助于区分它们。

当处理器生成一个地址时,使用30位地址中间的8位来选择缓存集,这个集合中将有4个缓存行。因此,所有四个已驻留缓存行的标记都会与生成的地址的标记进行匹配。

示例

如果一个30位地址为00000000000000000-00000100-00010(以'-'分隔以便阅读),则:

  1. 缓存内偏移量为2
  2. 集合编号为4
  3. 标记为0

谢谢。你能进一步解释这是什么意思吗? "每页块数=(4KB / 32B)= 128"我理解每个内存地址只能分配给一个集合中的四个高速缓存行,对吗?每个集合负责4096KB的内存吗? - user1876942

2
在帕特森和亨尼西的《计算机组成与设计:硬件/软件接口》一书中,讲到了缓存。例如,在这个版本中的第408页展示了以下图片(我添加了蓝色、红色和绿色线条): enter image description here 显然,作者在描述组相联高速缓存时只使用“块”(而不是“行”)一词。在直接映射缓存中,“索引”部分的地址寻址行。而在组相联缓存中,则寻址集合。
这种可视化方法应该能很好地配合@Soumen在被采纳的答案中的解释。
然而,该书主要描述精简指令集架构(RISC)。我个人知道MIPS和RISC-V版本。因此,如果你面前有x86,请将这张图片视为概念可视化,而不是实际实现。

1
如果我们将内存分成缓存行大小的块(即32B内存块),则每个块称为一个块。现在,当您尝试访问某个内存地址时,包含该地址的整个内存块(大小为32B)将被放置到缓存行中。
现在,每个集合都不负责4096KB或一个特定的内存页。来自不同内存页面的多个内存块可以映射到同一缓存集合中。

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