将512KB主存映射到1KB缓存作业题

Mapping 512KB main memory into 1KB cache homework question

如果我发错了,我很抱歉。如果我需要更改任何内容,请告诉我。

我已经收到我的计算机体系结构作业,但我错过了这道题。我教授的解释对我来说没有意义,我不同意他告诉我的,所以我在这里问问你们的看法。

这里是问题:

计算机使用 16 位内存地址。主内存为 512KB,缓存为 1KB,每个块 32B。给定以下每个映射函数,计算内存地址每个字段的位数。

以下是我如何解决问题的直接映射部分:

高速缓存:1KB (2^10),16 位内存地址 (1 word = 2B) -> 1024B/2B = 512 words,每块 16 个字 (32B) -> 512/16 = 32 cache memory blocks

主内存:512 KB (2^19),16 位内存地址 (1 word = 2B) -> 524288B/2B = 256K words,每块 16 个字 (32B) -> 256K/16 = 16384 or 16K 个主内存块。

我对单词标签的理解是这样的:32B 每个块允许每个块 16 16-bit 个内存地址。这(我相信)支持:每个块中的 1 word = 16 bits = 2 B -> 32B/2B = 16 words。这等同于 2^4 = 4 bits 用于确定块中的哪个字,留下 12 bits 用于内存地址中的标记和块位。

现在,为了将 16K 个主内存块直接映射到 32 个缓存内存块,必须有 512 个主内存块映射到每个缓存内存块。所以每 1/32 个块 512/16K 个块。

这是我感到困惑的地方。这是否需要 9 标记位,如 2^9 = 512(主内存块可能映射到一个高速缓存内存块)?

对于指向缓存中特定块的块位,这需要 5 bits2^5 = 32,高速缓存中的块。

这需要内存地址中有18 bits

这是我的教授对这个问题的回答:

2^5 = 32 -> 5字位

(1KB)/(32B) = 32 个块 -> 5 个块位

16 – 5 – 5 = 6 标记位

我没有意识到我可以简单地减去所需的块和字位来获得标记位。但这对我来说仍然没有意义。 2^6 = 64 blocks 每个缓存块。 64*32 给出 2048。我无法解决这个问题。有人可以帮忙吗?

好的,我学到的术语略有不同,但对于这个解释来说,原则应该是相同的。

所以缓存会有多个集合(有点像一个单元格)。并且每个集合将有 1 个缓存行(包含 1 个数据块)或多个缓存行(每个缓存行包含 1 个数据块)(直接映射或 n-关联映射)。

在将主存块映射到缓存中,主存地址(16位)分为3个字段:tagindex bits 偏移位 。一个内存单元是1个字节,一个块由几个单元组成

偏移位用于访问内存块的各个字节。将其视为块基地址顶部的偏移量以获取您想要的字节(我假设您的内存应该是 byte-addressable 而不是 word-addressable 因为它不会感觉访问 2B 字,因为这将是不灵活的)这里你的 prof/textbook 称它为字位。因此,如果一个块有 32 字节,则访问映射块中的各个单元需要 log2(块大小)= 5 位

索引位(在直接映射缓存中也称为块位,因为集合的数量与缓存中的块数相同)用于identify哪个set/cache line/ cache block表示主内存块映射到cache。缓存中有1KB/32B = 32个缓存块。 由于使用了直接映射,每个set只包含1个cache block,所以这个cache中会有32个set。因此,要访问缓存中的正确集合,需要 5 位,因此 index bits = 5 bits

Tag 是一个名称,用于确定缓存中的数据块是否是我们从主内存中查找的正确数据块。由于主存的地址是16位,我们已经知道索引和偏移字段,很容易推断出标签需要16 - 5 - 5 6位。我们如何确定标签并不是真正关心的问题,因为块大小和缓存大小(因此这里给出了缓存中的集合数)。