Victim Cache

    AMD的Athlon/Duron系列CPU的L2缓存有一个奇怪的特性,就是在L1中有的数据将不在L2中存储。AMD把这种特性叫做Exclusive(互斥?有没有更好的翻译),把普通的L2缓存叫做Inclusive(包容?)。有很多文档把AMD的这种L2缓存也叫做Victim Cache,应该说也是很贴切的。不过,最初的Victim Cache并不是这个样子,也不是为了这个目的而提出的,并且没有得到广泛的应用。AMD的L2是对其概念的一个推广和扩展,应该说是非常有创意的。

    首先看一下最初的Victime Cache。在缓存出现之初,电子技术还不太发达,如果要做相关路数比较高的缓存,则其速度就必须降下来(事实上当时两路相关的缓存速度也比直接相关低)。但是,当时的缓存又很小(技术不发达嘛),如果做直接映射缓存,其命中率就不高,导致缓存效率较低。自然,在这种情况下,肯定有人去研究如何制造即有直接映射缓存的高速度、又有集相关缓存的高命中率的缓存。这听起来很玄:天下哪有这么好的事情?不过有一些世外高人,硬是搞出了几个概念,据说可以同时获得两方面的好处。这其中的一个概念,就是Victim Cache。

    要明白这个概念,首先要知道这些高人当时是如何想的。其实也不难:既然要得到直接映射的速度,所以缓存的主体就必须是直接映射。在这个前题下,只要显著提高其命中率(当然要少量增加硬件了,毕竟不可能有免费的午餐)就达到要求了。既然要提高命中率,首先就要分析直接映射缓存中不命中的情况集中发生在什么地方,或者换一种说法:不在缓存中的数据,哪些访问概率最高?。经过一系列分析发现:在直接映射缓存中,刚刚被“挤出去”的数据是最常被访问的,也就是说这些数据的访问概率很高,而且不在缓存中(废话!!)。既然如此,我们就加一个小的缓存(确实非常小,一般4~32块),专门存放这些刚刚被挤出来的数据,当再次访问的时候,可以直接从这些地方调,比从内存读快多了。由于这个小的缓存存储的是被主缓存淘汰下来的“受害者”,所以被叫做Victim Cache,确实很形象。

    传统意义上的Victim Cache有几个特点:(1)小,只有不多的几个块;(2)全相关(就这么几块,还集相关干吗?)。这些特点应该说是比较适合于实际应用的,而且理论和实验数据都比较好。但是传统的Victim Cache并没有得到广泛的应用,应该说也是其缺点决定的,可谓成也萧何,败也萧何。虽然个中原因很复杂,不过我认为大致是这样的:在缓存出现之初,一般的容量只有4~8KB,所以命中率相对比较低,集相关的速度也很慢。当时的研究人员根据这些情况进行了研究,于是做出了传统的Victim Cache。但是,由于电子技术的发展实在是非常快(摩尔率,指数增长),在这些概念提出的时候,已经可以集成较大的缓存了(16~64KB,而且是数据、指令分离的双缓存结构),某些产品上已经出现了大的L2缓存,相关路数不太大(2~8)的缓存速度已经非常快了。有人把Victim Cache放在在这种背景下进行了测试,得出了一些结论:(1)主缓存(一般是指L1)越大,需要接越大的Victim Cache才能获得和集相关缓存可比拟的性能;(2)大的Victim Cache本身很慢(因为是全相关),在有L2的系统上不太容易获得性能提高。Victim Cache可谓生不逢时。

    但是这并不是故事的结尾。电子技术的高速发展(??//haha 成也萧何,败也萧何),在近1~2年,CPU集成的L1缓存的量越来越大,CPU也几乎全部集成了L2缓存。传统的缓存结构在这里就产生了一个问题:在L2中存有L1中所有的数据。这在L1很小的情况下是没什么了不起的,但是对Athlon这样的CPU就有问题了。Athlon有2个64KB的L1缓存,合计128KB。如果全部在L2中有一个备份,则其256KB的L2缓存有一半是永远不会被访问的,或者说其L2的利用率不超过50%。虽然电子技术发达,也经不起如此的浪费。所以,AMD的工程师就要想方设法把L2中这些浪费的空间利用起来。但是如何保证L1中的数据不在L2中留备份?其实也很简单,前面说的在L1中刚刚被挤出来的“受害者”肯定是不在L1中的,而且,有很多高人还说这些“受害者”被访问的概率很高。所以,整个L2成了L1的Victim Cache。但是,全相关是不可能的,当然也是没有必要的。这样,L2的“视”容量,就相当于L2的物理容量加上L1的容量。所以,AMD宣传其Athlon的缓存是384KB,也不无道理。而Duron的L2物理容量仅有64KB,竟然比L1的容量(64KB+64KB)都小,还能发挥不小的作用,都得益于这个“受害者”的概念。应该说AMD的工程师确实是非常有创意的。

    在这里还不得不提另外一个概念,就是伪相关。伪相关也是当时提出来试图同时获得直接映射的高速和集相关的高命中率,当然也没有得到广泛的应用。所谓伪相关,就是“假相关”的意思。缓存还是按集相关的方式组织,但CPU访问内存时不是所有相关的路都同时查询,而是首先查第一路,如果第一路中没有找到数据,才在其他路中找。因为第一路有特殊待遇,所以和真正的相关有区别,而第一次访问时只访问一路,又是直接映射的特点,被叫做伪相关也是很形象的。可以看出,上面AMD的L2的想法和伪相关其实也是很象的。AMD的L2基本上是这些思想的集成。

    我不知道AMD是否是第一个这样设计缓存的公司,也许有其它CPU已经采用了这个技术(不知道号称有L3的PowerPC如何,没听到IBM的宣传),但是AMD肯定不会是最后一个使用该技术的公司。以后有L3的CPU应该更适合采用整个技术。毕竟L2很大了,在L3中对应的容量能够利用起来是非常不错的。当然Intel的L2是没必要采用的了,其8~16KB的L1容量,不值得这些附加硬件。


Leading Cloud Surveillance, Recording and Storage service; IP camera live viewing

Leading Enterprise Cloud IT Service; cloud file server, FTP Hosting, Online Storage, Backup and Sharing

Powered by FirstCloudIT.com, a division of DriveHQ, the leading Cloud IT and Cloud Surveillance Service provider since 2003.