块大小

    块大小也是缓存的一个重要物理参数。Intel声称PIII系列的缓存块大小为32字节,P4的为64(L1)和128(L2),AMD声称Athlon系列的缓存块大小为64字节。对这些声明,我们都必须通过测试数据来检验其真实性。

    首先看一下L1的块大小的测试。我们用取一定大小的一块内存来测试L1的块大小。设所用的内存大小为MemSize,则其应该满足如下条件:

        2L1Size<=MemSize<=L2Size

在这个条件下,L1的命中率将随着不同的操作顺序而变化,因为数据集大小已经超过L1大小;而L2的命中率将是100%,因为数据可以完全放在L2中。

    在讨论之前定义几个变量:(1)BlockSize表示缓存实际的块大小;(2)ItemSize表示每个测试核心语句操作的数据单元大小,在我们的讨论中一般是4字节(32位操作);(3)n=BlockSize/ItemSize表示每块中的数据单元数;(4)HitRate表示L1的命中率;(5)MissRate=1-HitRate表示L1的不命中率;(6)Latency表示访问的平均延迟,在这里也可以叫做平均访问时间;(7)Penalty表示L1未命中而L2命中时的附加开销。不失一般性,可以设其中BlockSize、ItemSize和n均是2的指数且BlockSize>=ItemSize。

    为说明问题,我们举一个仅有1块的缓存的例子,如下图所示:

BlockSize_01.gif (4319 bytes)

设L1Size=BlockSize=32B,ItemSize=4B,MemSize=64B。

    首先看顺序访问。第一次访问单元0,则L1未命中,将内存块1调入缓存。后续的7次访问(地址1~7)都是L1命中。然后是访问单元8,显然由是一个L1未命中,将内存块2调入缓存。后续的7次访问(地址9~F)又都是L1命中。然后是绕回地址0,将再次重复前面的操作。可见,在这个过程中,不失一般性可知道:MissRate=1/n。另外,我们还可以知道,在采取LRU和类似替换策略的缓存中,这个结论可以适用于任何大小和任何相关路数的缓存(具体过程很简单,这里就不再说明了)。对于采取其它替换策略的缓存(比如随机替换策略),在MemSize远大于L1Size的时候也是近似适用的。

    下面看以8字节为单位的块跳跃访问方式。这种方式下,其访问的地址顺序是:

        0 2 4 6   8 A C E   1 3 5 7   9 B D F   ......

与上面类似,可以知道每相邻的4次内存访问将有一次L1未命中事件。不失一般性,可知道:MissRate=2/n。

    同理可知当跳跃单位为4个内存单元时,MissRate=4/n,......于是可得下表:

跳跃间隔 1(顺序) 2 4 ...... (1<<i) (<n) ...... n >n
MissRate 1/n 2/n 4/n ...... (1<<i)/n ...... 1 1

首先MissRate随着跳跃间隔的增加而线性增加,当达到1的时候就不再增加了(废话!未命中率可能超过1吗???)。而MissRate将直接影响缓存的性能,这一点似乎不用说明了。所以我们只要逐渐地增加跳跃间隔,直到性能不再下降,就可以推测出块大小。至于分析是否正确将在后面的实验中用数据来检验.

    对L2来说,情况是完全相同的,就不再说明了。

    下面是测试数据,分成L1和L2的2组:

BlockSize_02.gif (11389 bytes)

其中横坐标表示块大小。前3行是读操作的产出,Latency是用RL/04测量的平均访问时间,HitRate是根据上面的分析计算出的命中率。Penalty是未命中附加开销,是根据公式计算出的。根据缓存理论,有:

        Latency = HitTime + MissRate*Penalty    ===>   Penalty = (Latency-HitTime)/MissRate

其中HitTime是以前测试L1性能时得到的Latency参数。

    首先把L1的数据画成曲线:

BlockSize_02.gif (4096 bytes)

由于测试数据表示成完成一个操作的平均周期数(产出),所以数值越小性能越好。在16~32字节处的陡升充分说明了PIII的L1的块大小为32字节。再看一下L1的Penalty,可以看出在所有情况下计算出的Penalty都是很接近的,说明这里非常符合缓存的理论模型。

    这里还要对上面的曲线的一个现象进行说明。对Read16,跳跃步长为4、8和16的性能都是一样的。这其实是因为它们本来就是相同的操作。对于跳跃步长小于ItemSize的情况,在语义上是有问题的,所以测试中如果发现这种情况,就强制把跳跃步长设成ItemSize。所以在这里会有1条水平线。同样的情况发生在Read08的跳跃步长为4和8的情况。

    L2的情况与L1相同,这里就不分析了。需要指出的是L2的Penalty不再是一个常数,可见这里缓存理论需要修改。至于如何修改才能符合实际情况,我还没有想出来。有知道的请告诉我!


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.