cache中的thrashing问题和应对办法
来自csapp的第6章.
这段代码看上去局部性不错.
如果cache的参数是(2,1,4,6), 也就是有2个set, 直接映射, 一个block是16 byte, 可存4个浮点数.
如果x,y的起始地址分别是0, 32.
对x[0], set对应0, 对y[0], 地址是32, 100000, set对应是0, 直接替换了x之前载入的x[0]-x[3]. 之后也是类似, 整个过程命中率是0.
为什么会这样?
设x的起始地址为ax, 设x与y对应的内存偏移是t. 那么什么情况下, ax与ax+t对应的set index会是一样的?
((ax)%2(b+s))/2b=((ax+t)%2(b+s))/2b成立的时候.
b是offset bits的长度, s是index bits的长度(也就是用来标志set的位数)
在这里, t=32, b=4, s=1, 发现仅仅是做了%2^(b+s)之后, 就已经相等了, 因为t是2^(b+s)的倍数.
如果想要它总是不相等怎么办? t需要再加x, 且满足x/2^b>=1, <2^(b+s), 这样就能保证不相等了. 最简单地, 只要取2^b, 就一定不相等.
这里b=4, 因此2^4=16, float的size是4, 因此padding为float[4]. 改x为float[12]即可. 差不多是通用公式了, 保证x与y的偏移%2^b为1就行(其它的也可以, 但要<2^s).