一个简单的问题,以确保我理解“块”背后的概念和它与缓存的用法。
如果我有一个小的缓存,每个缓存包含4个4个字的块。假设它也是直接映射的。如果我试图访问内存地址2处的一个字,包含字0-3的块是会被放入缓存的第一个块位置,还是会放入字2-5?
我想我的问题是“块”是如何存在于内存中的。当访问一个值并触发缓存未命中时,CPU是从内存中的访问值开始加载一个数据块(4个字),还是计算该字在内存中的哪个块并取而代之。
如果这个问题很难理解,我可以为我试图解释的内容提供图表。
发布于 2014-03-25 06:36:45
通常,缓存被组织成“缓存线”(或者,正如您所说的,块)。高速缓存的内容需要被关联地寻址,即,通过使用所请求地址的某一部分来访问(如果你愿意,也就是“查找表关键字”)。如果缓存使用1个字的块大小,则整个地址--它的所有N位--将是“键”。每个单词都可以按照刚才描述的粒度进行访问。
然而,这种关联关键字匹配过程是非常硬件密集型的,并且是设计复杂性(使用的门)和速度(如果您想使用更少的门,则在权衡速度上受到影响)的瓶颈。当然,在某些情况下,您不能通过牺牲速度(访问所需元素的延迟)来最小化门的使用,因为缓存的整个目的就是快速!
因此,权衡的方式略有不同。缓存被组织成块(缓存“行”或“行”)。每个块通常从对应于高速缓存线大小的2^N对齐边界开始。例如,对于128字节的高速缓存线,高速缓存线关键字地址将始终在底部七位中具有0 (2^7 = 128)。这有效地从我们前面提到的地址匹配复杂性中消除了7位。另一方面,每当由于“高速缓存未命中”而“需要”该高速缓存线的任何部分时,高速缓存都会将整个高速缓存线读入高速缓冲存储器--地址“关键字”未在关联存储器中找到。
现在,看起来,如果你需要在128字节的缓存线中使用126字节,你将会浪费你的拇指很长一段时间,等待那个缓存块被读入。为了适应这种情况,可以从“关键高速缓存地址”开始进行高速缓存填充,关键高速缓存地址是处理器完成当前提取周期所需的字。这允许CPU在高速缓存控制单元继续前进的同时非常迅速地前进--通常通过以模N方式将数据逐字读入高速缓存存储器(其中N是高速缓存线的大小)。
旧的MPC5200 PowerPC数据手册对这种关键字缓存填充顺序进行了很好的描述。我确信它在其他地方也被使用过。
哈..。JoGusto。
https://stackoverflow.com/questions/22621822
复制相似问题