我正在尝试学习有关缓存的一些内容。可以说我有一个4路32KB缓存和1GB内存。每个缓存行为32个字节。所以,据我所知,RAM将分为256个4096KB页面,每个页面映射到一个缓存集,其中包含4个缓存行。
我有多少缓存方式?我甚至不确定缓存方式是什么。有人可以解释一下吗?我做了一些搜索,最好的例子是
http://download.intel.com/design/intarch/papers/cache6.pdf
但我仍感到困惑。
感谢。
答案 0 :(得分:13)
您指的缓存称为set associative cache。整个缓存分为几组,每组包含4个缓存行(因此为4路缓存)。所以这种关系就像这样:
缓存大小=缓存中的集合数*每个集合中的缓存行数*缓存行大小
您的缓存大小为32KB,为4路,缓存行大小为32B。所以套数是 (32KB /(4 * 32B))= 256
如果我们将主存储器视为由高速缓存行组成,则一个高速缓存行大小的每个存储器区域称为块。因此,每个主内存块都将映射到一个缓存行(但并不总是映射到特定的缓存行,因为它是设置关联缓存)。
在组关联缓存中,每个内存块将映射到缓存中的固定集。但它可以存储在集合的任何缓存行中。在您的示例中,每个内存块可以存储在集合的4个缓存行中的任何一个中。
缓存行映射的内存块
主存储器中的块数=(1GB / 32B)= 2 ^ 25
每页中的块数=(4KB / 32B)= 128
系统中的每个字节地址可分为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 :(得分:1)
Patterson和Hennessy在他们的“计算机组织和设计,软硬件接口”中谈到了缓存。例如,在this版本中,第408页显示以下图像(我添加了蓝色,红色和绿色线条):
显然,当作者描述集关联缓存时,他们仅使用术语“块”(而不是“行”)。在直接映射的缓存中,地址的“索引”部分寻址该行。在集合关联中,它为集合建立索引。
此可视化效果应与@Soumen在接受的答案中的解释相吻合。
但是,这本书主要描述了精简指令集体系结构(RISC)。我个人知道MIPS和RISC-V版本。因此,如果您前面有x86,则可以花一点时间来拍摄这张照片,更多的是作为概念可视化而不是实际的实现。
答案 2 :(得分:0)
如果我们将存储器划分为高速缓存行大小的块(即32B块存储器),则每个块被称为块。现在,当您尝试访问某些内存地址时,包含该地址的整个内存块(大小为32B)将被放置到缓存行。
每个集合都不对4096KB或一个特定的内存页面负责。来自不同内存页面的多个内存块可以映射到同一个缓存集。