Cache的基本原理

Cache的基本原理

Cache是高性能的处理器必不可少的,cache的实现在逻辑上的关键是在于将一个地址A,映射成为到一个cache内的地址单元。根据映射方式,可以分成三类:

  1. 直接映射
  2. 全相连映射
  3. 组相连映射

下面尝试对这三种解构做一个简洁且清楚的阐述。要达到这一目的,我认为只需要回答好两个问题即可:

  1. 如何知道一个地址是否在cache中?
  2. 以及在cache中的哪一条cache line中?

下面以0x12345678这个32位地址为例,回答这两个问题。

1. 直接映射

将0~4G的地址空间分成若干部分,每一部分共用一个cache存储单元。

如下图这种具体映射,高16位为Tag,中间8位为index,低8位为cache line中的offset. 也就是说 2 15 = 32 K B 2^{15}=32KB 215=32KB共用一个cache存储单元,也就是说图中cache内的0xAA可能来自32K个不同的地址。

先回答第二个问题:index即表示哪条cache line. 任何一个给定的地址,只要取其中间8bit即可找到对应的cache line。
再回答第一个问题:比较这条cache line的Tag与目标地址的tag是否相同即可,相同则命中,否则则未命中。

如图中,要查询的目标地址是0x12345678,地址的Tag是0x1234,index为0x56即86; 而cache line 86的Tag为0x1234,二者一致,说明这个0xAA是地址0x12345678对应的内容,也就是cache命中。

在这里插入图片描述

这种映射方式下,一条cache line有 2 8 = 256 B 2^{8}=256B 28=256B,一共有 2 8 = 256 2^{8}=256 28=256个cache line,整个cache有64KB.

这种方式的优缺点比较明显:

  1. 优点:映射关系是确定的,一个地址能够使用哪条cache line是唯一确定的,不需要比较每条cache line 中的tag来判断是否命中。
  2. 缺点:容易产生cache冲突。例如0x1234_5678和0x1235_5678两个地址,都是映射到第86条cache line上。产生冲突也就意味着需要不停地更新cache,这样将使得效率大幅下降。一个读命中可能只需要1~2个cycle,而一旦cache miss则需要几十个cycle。如果来回更新,效率下降可想而知。

2.全相连映射

全相连表示,地址和cache line直接没有任何映射关系,一个地址可能被映射到任何一条cache line中。

在这里插入图片描述
如图中的映射,高24位为Tag,低8为cache line中的offset. 也就是说图中cache内的0xAA可能来自 2 24 2^{24} 224=16M个不同的地址。

要知道0x12345678这个地址是否在cache中,以及在cache中的哪一条cache line,则需要比较所有cache line的Tag是否与目标地址0x12345678的Tag (0x123456) 相同。

回答第一个问题:需要比较所有的cache line的Tag与地址的Tag是否一致;
回答第二个问题:一致的那个cache line则为命中的cache line.

如图中,要查询的目标地址是0x12345678,地址的Tag是0x123456;遍历cache中一共256个cache line,发现cache line 99的Tag为0x123456,与目标地址Tag相同,说明这个0xAA是地址0x12345678对应的内容,也就是cache命中。

这种方式的优缺点比较明显:

  1. 优点:每条cache line都能够得到充分的应用,不容易产生cache 的冲突。
  2. 缺点:地址使用哪条cache line是完全不确定的,需要比较每条cache line 中的tag来判断是否命中。

3. 多路(成)组相连

前面两种方式,优点和缺点是互补的。也就是直接映射不需要遍历所有的cache line的Tag,但是cache利用非常不充分,容易产生cache 冲突;而全相连虽然能够充分利用每条cache line,但是要需要遍历所有的cache line的Tag才能够判断是否命中。多路组相连是二者的一个折中:允许少量遍历cache line的Tag,从而减少cache冲突。

将0~4G的地址空间分成若干部分,每一部分共用一个cache存储单元。

如下图这种具体映射,高16位为Tag,中间8位为index,低8位为cache line中的offset. 也就是说 2 15 = 32 K B 2^{15}=32KB 215=32KB共用一个cache存储单元,也就是说图中cache内的0xAA可能来自32K个不同的地址。

回答第二个问题:从地址中拿到index,由于现在多了way这个维度,可能来自不同的way.例如这里有3个way,这3个way对应的这个Index共有3条cache line成为一组。
回答第一个问题:比较这一组cache line的所有Tag,如果有Tag与目标地址的Tag相同,则命中。

如图中,要查询的目标地址是0x12345678,地址的Tag是0x1234,index为0x56即86; 而way0 cache line 86的Tag为0x1234,二者一致,说明这个0xAA是地址0x12345678对应的内容,也就是cache命中。
在这里插入图片描述

本文没有考虑valid这种细节,笔者认为,这并不影响对cache 原理的认识和掌握,因此忽略。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值