Published on

从奔2说起

Authors
  • avatar
    Name
    wellsleep (Liu Zheng)
    Twitter

tags: cpu, hardware, eggache

也是从这张图我才确认,后来从闲鱼淘的奔二是个拼装货。 铭牌:350/512/100/2.0V S1 19040247-0162 Philippines i (m)(c) '97 SL356


上图中间黑色 SOP 封装芯片为 tag sram,为二级缓存提供 tag 存储 tag sram 的激光刻字:S82459AD 8851PZ44 SL2WF INTEL (m)(c) '95

由于丢失了原装外壳,闲鱼的这颗奔二无法确定内部频率,只是看 Cache 的布局,应该还是 Deschutes 架构的奔二,和曾经的启蒙奔二同属一系。 Pentium II 和 Pentium III 信息对照:

型号架构制程Cache时钟推出时间封装
Pentium IIKlamath350L1+半速 L2233-300 (66MHz FSB)1997H1Slot 1
Deschutes250L1+半速 L2266-333 (66MHz FSB)1998H1Slot 1
Deschutes250L1+半速 L2350-450 (100MHz FSB)1998H1Slot 1
Pentium IIIKatmai250L1+半速 L2450-600 (100MHz FSB)1999H1Slot 1
Katmai250L1+半速 L2533, 600 (133MHz FSB)1999H1Slot 1
Coppermine180L1+全速 L2550-1100 (100MHz FSB)1999H2Slot 1/Socket 370
Coppermine180L1+全速 L2533-1133 (133MHz FSB)1999H2Slot 1/Socket 370
Coppermine T180L1+全速 L2800-1133 (133MHz FSB)2000H2Socket 370
Tualatin130L1+全速 L21000-1400 (133MHz FSB)2001H2Socket 370
其中,从 Slot 1 更换到 Socket 370 的过程中,还存在一段时间过渡期,使得 socket-slot 转接板大行其道。更替的原因,据 wiki 说是由于 1GHz 以上的插卡电路频率已达极限。
至于 Tualatin,中文称之为「图拉丁」,更是成为一代神话,至今「图吧垃圾佬」仍是一个为 DIYer 们喜闻乐见的称呼。有道是:

三千预算进「卡吧」,加钱加到九万八。 三千预算进「图吧」,小学对面开网吧。


正式来学习一下 Pentium II 的硬件设计。

我们一共有8行cache line,cache line大小是8 Bytes。所以我们可以利用地址低3 bits(如上图地址蓝色部分)用来寻址8 bytes中某一字节,我们称这部分bit组合为offset。同理,8行cache line,为了覆盖所有行。我们需要3 bits(如上图地址黄色部分)查找某一行,这部分地址部分称之为index。现在我们知道,如果两个不同的地址,其地址的bit3-bit5如果完全一样的话,那么这两个地址经过硬件散列之后都会找到同一个cache line。所以,当我们找到cache line之后,只代表我们访问的地址对应的数据可能存在这个cache line中,但是也有可能是其他地址对应的数据。所以,我们又引入tag array区域,tag array和data array一一对应。每一个cache line都对应唯一一个tag,tag中保存的是整个地址位宽去除index和offset使用的bit剩余部分(如上图地址绿色部分)。tag、index和offset三者组合就可以唯一确定一个地址了。因此,当我们根据地址中index位找到cache line后,取出当前cache line对应的tag,然后和地址中的tag进行比较,如果相等,这说明cache命中。如果不相等,说明当前cache line存储的是其他地址的数据,这就是cache缺失。在上述图中,我们看到tag的值是0x19,和地址中的tag部分相等,因此在本次访问会命中。由于tag的引入,因此解答了我们之前的一个疑问“为什么硬件cache line不做成一个字节?”。这样会导致硬件成本的上升,因为原本8个字节对应一个tag,现在需要8个tag,占用了很多内存。

我们可以从图中看到tag旁边还有一个valid bit,这个bit用来表示cache line中数据是否有效(例如:1代表有效;0代表无效)。当系统刚启动时,cache中的数据都应该是无效的,因为还没有缓存任何数据。cache控制器可以根据valid bit确认当前cache line数据是否有效。所以,上述比较tag确认cache line是否命中之前还会检查valid bit是否有效。只有在有效的情况下,比较tag才有意义。如果无效,直接判定cache缺失。

在蜗窝科技的这段解释中,需要明确的一点是,图中右侧 8 bytes 的 cache line,每一个字节都真真切切存储着主存中的镜像数据。所以当 CPU 要求 0x0654 的数据时,该数据 就是 右侧 cache line 中编号 4 的字节的值。通过将主存中的数据镜像到存取速度更快的缓存中,使得 CPU 等待数据的时间缩短,提高整体计算效率。

最近的 CPU 设计自然是不会再将缓存裸露到核心封装之外,一般人也就无缘真正认识缓存和缓存 tag 的物理存在。到目前为止,新型的高速 CPU 都往往有三级缓存,包括一级的指令、数据缓存,二级本核主存混合缓存,三级核间共享混合缓存。 据知乎供图,一二三级缓存和主存的速度大致对比为 1TB/s : 300GB/s:150GB/s:20GB/s,延迟(纳秒)大致对比为 1:3:12:60。


好了,回炉奔二学习研究完毕。是把它挂起来当饰品看呢,还是把它原价闲鱼专卖,这是一个问题。