Cache抖动的实验
关于cpu中的cache抖动现象,简单研究了一下,个人认为cache抖动分为三个阶段:无抖动现象阶段,剧烈抖动阶段和稳定抖动阶段。
实验环境:Ubuntu17.04+valgrind模拟器
实验硬件:Cache 64组*4路组相联*64B每路
实验文件:main.cpp ,代码如下:
#include <stdio.h>
#define column 16
#define row 1000 //row的值需要不断进行改变,从而观察miss数
int matrix[row][column];
int main()
{
for(int i=0; i<column; i++)
{
for(int j=0; j<row; j++)
{
matrix[j][i] = 1;
}
}
return 0;
}
主要原理:
1.数组的每一行恰好对应cache的每一路,以此简化操作;
2.通过更改row的数量,观察写操作过程中的miss数量,从而分析各个阶段的特点;
3.(1)无抖动阶段:当row<=64*4时,所有数据都能放到cache中,不会发生抖动现象;
(2)剧烈抖动阶段:当row>64*4 并且row <=64*4+64时,由于cache的循环使用,发生剧烈抖动现象;
第一次Cache抖动应当发生在,64组×4路的Cache被装满之后(column =16,row=256),row增加1(row=257)到row增加64(row=320)之间。
例如:当row增加1时(row=257),访问第257行时,由于数组的第0行到第3行已经保存在cache第0组,将会替换掉第0组的第0路,之后再替换掉第0组第1行、第0组第2行、第0组第3行,进行循环。
可见,在访问第0行、第1行、第2行、第3行和第256行时,会一直出现miss,总共会出现5*16=80次miss。当row=256时,只有256行,只有在访问第一次的时候miss,剩下的数据访问都可以hit。
所以,由row=256到row=257时,miss的增加数为5*16-4=76次。
进而,推导出这一阶段cache增加的miss数量公式为N=n*(k+1)*i-k*i。
其中N为miss的增加数,n为每一行的元素的数量,k+1为该阶段的特征值,其大小为组内行数k+1,k为组内行数,i为访问的数组增加的行数(以i=0作为比较基准,row=256)。(3)稳定抖动阶段:当row>64*4+64时,抖动现象仍然出现,不过趋势比较平稳;
第二次Cache抖动应当发生在,64组的Cache都出现第二阶段所示的抖动现象(row=320)之后,即row>320时,会出现第二次抖动现象。
例如:当row相对第二阶段的临界值增加1时(row=321),访问第321行时,由于数组的第257行、第1行到第3行已经保存在cache第0组,将会替换掉第0组的第1路,之后再替换掉第0组第2行、第0组第3行,进行循环。
可见,在访问第0组的第0行、第1行、第2行、第3行、第256行和第321行时,会一直出现miss,总共会出现6*16=96次miss。当row=320时,访问第0组的第0行、第1行、第2行、第3行和第256行,会一直出现miss,总共会出现5*16=80次miss。
所以,由row=320到row=321时,miss的增加数为6*16-5*16=16次。
进而,推导出这一阶段cache增加的miss数量公式为N=n*i。
其中N为miss的增加数,n为每一行的元素的数量,i为访问的数组增加的行数(以i=0作为比较基准,row=320)。实验过程和结果:
(1)无抖动阶段:将row依次更改为100,101,102,103,发现miss数随着row的增加而增加步长为1。
(2)剧烈抖动阶段:将row依次更改为256,257,260,320。结果如表所示:
行数 | 256 | 257 | 260 | 320 |
miss数 | 2160 | 2236 | 2464 | 7024 |
miss相对增加数 | 0 | 76 | 304 | 4864 |
折合公式 | 16*5*0-4*0 | 16*5*1-4*1 | 16*5*4-4*4 | 16*5*64-4*64 |
故第二阶段,Cache的增加数符合N=n*(k+1)*i-k*i的规律。第一阶段和第二阶段的临界值为256。
行数 | 320 | 321 | 330 | 420 | 1320 |
miss数 | 7024 | 7040 | 7184 | 8624 | 23024 |
miss相对增加数 | 0 | 16 | 160 | 1600 | 16000 |
折合公式 | 16*0 | 16*1 | 16*10 | 16*100 | 16*1000 |
故第三阶段,Cache的增加数符合N=n*i的规律。第二阶段和第三阶段的临界值为30。
抖动临界值:
通过以上实验,对于本cpu,发现Cache抖动的临界值分别时256和320。