将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 bits
。 2^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个字段:tag,index 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位。我们如何确定标签并不是真正关心的问题,因为块大小和缓存大小(因此这里给出了缓存中的集合数)。
如果我发错了,我很抱歉。如果我需要更改任何内容,请告诉我。
我已经收到我的计算机体系结构作业,但我错过了这道题。我教授的解释对我来说没有意义,我不同意他告诉我的,所以我在这里问问你们的看法。
这里是问题:
计算机使用 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 bits
。 2^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个字段:tag,index 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位。我们如何确定标签并不是真正关心的问题,因为块大小和缓存大小(因此这里给出了缓存中的集合数)。