引言
对于便携式嵌入式设备,降低其整体功耗具有越来越重要的实际意义。而在设计的嵌入式设备中,Cache的功耗占整体功耗的40%左右[12],因此,研究如何降低Cache功耗的各种技术成为嵌入式设备设计者关注的重点。针对嵌入式系统运行的特征,很多应用系统都曾经提出过多种可重构Cache结构[25],例如通过调节Cache的容量[3]、相联度[2]、块大小[4]、替换策略、缓存块数[5]等技术方式,适应不同的嵌入式程序对Cache资源的需求,达到提高性能和降低功耗的目的。
由于不同嵌入式程序对指令Cache和数据Cache的需求是不平衡的,从而导致某种Cache的容量不足而另一种Cache却空闲。嵌入式系统通常采用制定容量的指令Cache和数据Cache,本文引入动态重构的概念,实现了一种可重新划分指令Cache和数据Cache大小的高速缓存模块,可动态配置指令Cache和数据Cache的大小。对于较小的应用程序,如果指令Cache和数据Cache过大,虽然命中率很高,但是也造成了功耗的增加;而对于较大的应用程序,如果指令Cache和数据Cache过小,则会造成命中率的明显降低,在很大程度上影响处理器的性能。动态可重构Cache可以在程序运行的过程中随着Cache命中率的变化随时重构,既保证较高的命中率,又保证较低的功耗。
1 滑动Cache方案
本文引入了一种新的Cache组织结构(称做滑动Cache),是对动态可重构Cache的一种扩展方式,应用于嵌入式处理器中Icache和Dcache分离的片上一级Cache,主要包含指令Cache块(Icache)、数据Cache块(Dcache)和滑动Cache块(Scache)3个部分,使Scache能够在Icache和Dcache之间滑动。滑动Cache结构的特别之处在于它可以综合考虑程序对Icache和Dcache的实时需要,进而通过仲裁机制动态决定Scache是用来扩充Icache的容量,还是用来扩充Dcache的容量,或者是休眠。这种方法不但降低了Cache的动态功耗和静态泄漏功耗,而且处理器的性能也有所提高,它不需要任何软件编译的支持,也不需要改动除Cache之外的其他硬件。
1.1 滑动Cache基本思想
处理器及其Cache系统的设计在运行各种不同的应用程序时,其性能表现还是有很大差异的,某些程序需要的指令比较少但是却要处理大量的数据,比如压缩解压缩算法。相反,还有一些程序需要执行的指令非常多,但数据量较少,例如一些编译程序。因此在运行各种程序时都使用同一容量和结构的Cache,会造成某种Cache缺失率非常高,但同时另外一种Cache却有部分闲置。如果设计一种Cache结构能随着不同程序的需求,将一种Cache的闲置部分提供给另外一个需要增大容量的Cache使用,而不是简单地关闭这些部分,那么处理器性能将会大大提高。滑动Cache组织结构图如图1 所示。
图1 滑动Cache组织结构图
Scache有3种状态:当Icache缺失率较高时Scache作为Icache使用;当Dcache缺失率较高时Scache作为Dcache使用;如果Icache和Dcache缺失率都不高,Scache就休眠。当Scache与原有的Icache和Dcache结合使用时,只扩大组数,不改变相联度。Scache的容量要小于等于Icache和Dcache中容量较大的一个,即Cslide≤max(Cinst,Cdata)。例如Icache容量为32 KB,Dcache容量为64 KB,则Scache容量可选范围小于等于64 KB。假设Scache选定为64 KB,当Scache被指定用做Icache时, Scache中只有32 KB与原Icache结合使用,其余超出原Icache容量的32 KB处于休眠状态。由于不同容量的Cache需要的Tag长度不同,Scache的容量可能会在Icache和Dcache两个不同容量之间变动,导致滑动Cache的Tag长度也不固定。为了保证Scache既可充当Icache使用,又可充当Dcache使用,Scache的Tag长度应该等于指令和数据Tag中较长的,即Lslide tag=max(Linst tag,Ldata tag)。
1.2 滑动Cache仲裁机制
滑动Cache仲裁机制是核心部分,通过它来判断Cache容量何时需要滑动、何时休眠,以及按照什么原则进行滑动。利用缺失率作为监视Cache性能的基本尺度,通过设计和使用一套参数来监视、反映和调整系统的动态行为和需求。这套参数如下所示:
① 敏感间隔计数器(Sense Intervals Num,SIN):为了监视Cache性能,就必须把一个应用程序的整个运行周期分成一些固定的长度,称为敏感间隔(例如100万条指令为一个间隔[6])。运算逻辑单元每执行一条指令,敏感间隔计数器就会自动加1。并且强制规定,只有一个敏感间隔结束以后,才可以启动仲裁机制调整一级Cache的容量。
② Icache缺失计数器(Icache Miss Num,IMN):用来统计一个敏感间隔内Icache的缺失次数,每当Icache发生缺失时计数器自动加1,并且在每个敏感间隔开始时仲裁机制将其清0。
③ Dcache缺失计数器(Dcache Miss Num,DMN):用来统计一个敏感间隔内Dcache的缺失次数,每当Dcache发生缺失时计数器自动加1,并且每个敏感间隔开始时仲裁机制将其清0。
④ Icache缺失边界寄存器(Icache Miss Bound,IMB):用来存储预先设定的Icache缺失边界。
⑤ Dcache缺失边界寄存器(Dcache Miss Bound,DMB):用来存储预先设定的Dcache缺失边界。
⑥ Scache状态标志寄存器(Slide State,SS):用来存储当前Scache的状态,当敏感间隔结束时,仲裁机制会根据IMB、DMB、IMN和DMN的值判断发生哪种情况,进而将Scache设置成相应的状态。Scache的状态有以下5种:
状态1:如果IMN>IMB且DMN<DMB,SS被标志成1,下一个敏感间隔Scache作为Icache使用。
状态2:如果IMN<IMB且DMN>DMB,SS被标志成2,下一个敏感间隔Scache作为Dcache使用。
状态3:如果IMN>IMB且DMN>DMB,并且Icache超过边界的比例大于Dcache,则SS被标志成1,下一个敏感间隔把Scache作为Icache使用。
状态4:如果IMN>IMB且DMN>DMB,并且Dcache超过边界的比例大于Icache,则SS被标志成2,下一个敏感间隔把Scache作为Dcache使用。
状态5:如果IMN<IMB且DMN<DMB,SS被标志成0,下一个敏感间隔内Scache休眠。
1.3 滑动Cache工作过程
滑动Cache的工作流程如图2所示。
图2 滑动Cache的工作流程图
(1) 设置各个状态寄存器(SS,IMB,DMB)
首先,清空各个计数器(SIN,IMN,DMN),在程序运行初期将SS置为0(即休眠状态),因为在程序刚开始时初始化Cache会导致缺失率非常大,这期间根据缺失率来设置SS是不正确的。通过实验发现大部分程序运行几个敏感间隔后,缺失率趋近于稳定。本文在过了第3个敏感间隔后,每个敏感间隔结束时都启用仲裁机制。
(2) 设置仲裁策略
启动仲裁机制,如图1所示,如果IMB、DMB、IMN和DMN的值满足状态1或状态3,仲裁机制将SS设置为1,Scache作为Icache使用。由于Scache比原Icache容量要大,因此只需要截取与原Icache容量相同的部分作为Icache使用,其余部分休眠。为了正确读取Icache和Scache,就要保证能够正确寻址,因此增加一位地址位用来寻址。本方案将来自CPU地址中的Tag字段的最低位作为增加的地址位寻址,用来判断是对原Icache读取,还是对Scache读取。如果地址中Tag字段的最低位是1,表明来自CPU的地址是对Scache的操作,Scache片选信号选中,Icache片选信号关闭。与之相应,送到总线上的输出数据也应该是从Scache读出的数据。这时IMN统计的数据应该是Icache和Scache的缺失数目之和。
敏感间隔结束后,如果IMB、DMB、IMN和DMN的值满足状态2或状态4,仲裁机制将SS设置为2,Scache作为Dcache使用。如果这时增加的地址位是0,则表明来自CPU的地址是对Dcache的操作,Dcache与总线交互数据,Scache片选信号关闭。当状态5发生时SS被设置为0,整个Scache休眠,Icache和Dcache正常工作。
2 模拟测试及结果
为了对上述设计进行性能评测,在兼容MIPS指令集的嵌入式CPU模拟器上进行测试和数据采集。该模拟器精确到了周期,为提取Cache模型的详细运行数据提供了极大的方便。模拟测试分别实现了3种传统Cache结构模型和可配置Cache结构模型在模拟器上运行两个测试应用程序的性能比较,为了简单起见,主要是对CPI进行比较[7]。
测试过程如下:A、B、C均为传统结构的Cache模型,模型A的Cache大小是4 KB,采用直接映象的组织方式,二级Cache大小为28 KB;模型B的一级Cache大小为8 KB,采用直接映象的组织方式,二级Cache大小为24 KB;模型C的一级Cache大小为8 KB,采用两路组相联映象的组织方式,二级Cache为24 KB;模型D为滑动Cache配置结构的Cache模型,测试数据比较见图3。
图3 测试数据比较图
从模拟器测试的结果看,在采用滑动Cache配置结构的Cache模型上运行的两个应用程序的CPI值为最小,相较典型的A、B 和C三个传统Cache模型,其性能改进是明显的。
结语
本文提出了一种新的滑动Cache结构,采用动态仲裁机制,能够均衡考虑指令和数据Cache的性能,将Scache设置成需要的配置。从目前在模拟器上的运行结果来看,与传统的Cache模型相比,采用滑动Cache结构不但降低了一级Cache的动态和静态泄漏功耗,而且具有结构灵活、兼顾高性能和低功耗的特点,提高了整个处理器的性能。