在WSC数值更新过程中,不但考虑了各Set上的访问命中频繁程度,还考虑了访存序列的LRU栈距离特性,根据数据块被命中时所处的LRU栈位置不同,在计数器值增加时分别赋予不同的权值[10].对于N路组相联Cache而言,若命中当前Set的MRU块,则该Set对应的加权饱和计数器增加1,依次类推,命中LRU块时,该Set对应的WSC自加N.此外,由于CSPF允许牺牲块通过溢出操作保存在远程同级Cache Set中,如果命中远程溢出块,说明其数据重用性较高,因此在更新WSC时赋予更大的权值,数值为Cache组相联度的两倍.
2.2 访存需求差异感知的Set分类与容量划分决策WSC值差异情况可以反映同一聚合Set中隶属于不同处理器核的各个同级Set间的细粒度访存压力之间的横向差异.CSFP采用和FSB[11]类似的方法,引入压力阈值调整参数a来区分聚合Set中各个同级Set间的访存压力差异特性.
引入压力阈值调整参数后,根据同一聚合Set内各个同级Cache Set上的压力最高值和最低值,通过计算可以获得相应的高压阈值和低压阈值,从而将同一聚合Set中各个同级Set分为高压、中压和低压三类[10-11],即High-Utility, Median-Utility和Low-Utility.大于高压阈值的结点被分类为高压结点,小于低压阈值的结点被分类为低压结点,其他结点则属于中等压力结点.CSFP中的压力阈值计算、Set分类和划分决策依据如图2所示.
每隔一定指令间隔,CSFP会触发压力检测与Set分类操作.首先检查各聚合Set中压力计数器的最小值min和最大值max,计算高压和低压阈值,进行Set分类并更新相应的压力状态位,然后根据新的Set角色来确定每个Set上的重划分决策.为保证WSC能够动态感知程序在不同运行阶段的访存特性,每次划分操作结束以后,需通过移位操作将WSC计数值消减为原来的一半,在此基础上重新开始计数.
为从细粒度层次控制每个Set中的私有空间和虚拟共享空间的比例,CSFP为每个Set设置了一个Private-Quota计数器来动态控制本地处理器核在各个Set应该独占的私有Cache Way的配额.
对于High-Utility类型的Set而言,说明本地处理器核的数据重用率较高,访存序列LRU栈距离较长,因此在High-Utility类型的Cache Set中划分为私有Way的数量进行增加,降低容量失效发生的机率,同时避免其他处理器的溢出操作对High-Utility类型的Set造成过多影响.对于Low-Utility类型的Set而言,由于当前Cache Set为本地处理器核提供的命中较少,数据重用性相对较差,减少其中私有Way的数量不会引起显著的容量失效,可以提供更多的Way来接收其他同级Set逐出的牺牲块,因此在重划分时减少Low-Utility类型的Set中的私有Way的数量,增加其中共享Way的数量来为多核提供虚拟共享空间.对于Median-Utility类型的Set而言,则继续保持当前Set中的私有Way的数量不变.
为避免容量划分抖动对存储系统造成负面影响,CSFP在私有配额更新过程中保证每个Set中至少一半容量划分为本地私有空间,同时保证每个Set中至少一路作为共享空间.2.3 划分引导的替换-溢出协作机制
进行容量重划分的目的是为了指导数据替换时的牺牲块选择与溢出决策.当发生本地失效时或者需要接收其他远程结点的同级Set传来的溢出块时,CSFP需要在本地目标Set腾出一个Cache Slot来保存从内存或其他结点传来的数据块.此时,需要完成两个工作:1)选择哪个数据块作为逐出块(即牺牲块选择);2)如何处理该逐出块(即溢出决策).牺牲块选择和溢出决策过程分别如图3和图4所示.
CSFP在牺牲块选择过程中考虑了数据块和本地处理器核的亲和性,还考虑了片上数据副本的唯一性.从处理器核与本地Cache Bank中的数据亲和性来看,每个Set中的数据块可以分为本地数据块(即Native块)和被溢出的数据块(即Spilled块)两类:Native块是指由于本地处理器核访问过而在本地Cache Bank中保存的数据副本,通过将Spilled位设置为0来标识;Spilled块是指由于远程处理器核通过溢出操作放置在本地Cache中的数据块,通过将Spilled位设置为1来标识.类似地,若某个块的Singlet位为1,则说明该块属于片上唯一块;反之,若Singlet位为0,则说明该块在片上末级Cache中有多个副本.数据块Singlet位的置位和复位是通过侦听该块对应的目录位向量来实现的.
在牺牲块选择时,无论本地目标Set属于High-Utility,Median-Utility还是Low-Utility类型,均首先检查本地目标Set中是否存在无效块,如果有则直接将其作为空闲Slot来存放新来的数据.当不存在无效块时,则在牺牲块选择时会检查本地目标Set中的Native块的数量是否超过当前私有Way配额上限.如果超过则选择最近最久未使用的Native块作为牺牲块;若Native块数量未超过私有空间配额值,则选择最近最久未被访问过的Spilled块.至此,牺牲块选择过程结束.
当本地Cache失效时,完成牺牲块选择过程后,CSFP会进行溢出决策.若从本地Cache逐出的牺牲块属于片上唯一块(即Singlet状态位为1)且被本地处理器核访问过(即Spilled状态位为0),则允许对其进行溢出操作,将其发送至Destination Pointer指向的目标结点,由该结点上的同级Set作为接收者来提供Cache Slot.否则,将该牺牲块直接丢弃.至此,牺牲块溢出决策过程结束.
3 实验设计与结果分析