我有以下功能:
int doSomething(long numLoop,long arraySize){
int * buffer;
buffer = (int*) malloc (arraySize * sizeof(int));
long k;
int i;
for (i=0;i<arraySize;i++)
buffer[i]=2;//write to make sure memory is allocated
//start reading from cache
for(k=0;k<numLoop;k++){
int i;
int temp
for (i=0;i<arraySize;i++)
temp = buffer[i];
}
}
它的作用是声明一个数组并从头到尾读取。目的是看到缓存的效果。 我期望看到的是:当我调用doSomething(10000,1000)时,arraySize很小,所以它都存储在缓存中。之后我调用doSomething(100,100000),arraySize大于缓存的大小。因此,第二个函数调用应该比第一个函数调用更长。后一个函数调用涉及一些内存访问,因为整个数组不能存储在缓存中。 但是,第二次操作似乎与第一次操作大致相同。那么这里有什么问题?我试图用-O0编译它并没有解决问题。 谢谢。
更新1:这些是随机访问的代码,它似乎工作,大数组的时间访问是〜15s而小数组是~3s
int doSomething(long numLoop,int a, long arraySize){
int * buffer;
buffer = (int*) malloc (arraySize * sizeof(int));
long k;
int i;
for (i=0;i<arraySize;i++)
buffer[i]=2;//write to make sure memory is allocated
//start reading from cache
for(k=0;k<numLoop;k++){
int temp;
for (i=0;i<arraySize;i++){
long randnum = rand();//max is 32767
randnum = (randnum <<16) | rand();
if (randnum < 0) randnum = -randnum;
randnum%=arraySize;
temp = buffer[randnum];
}
}
}
答案 0 :(得分:1)
您正在按顺序访问数组
for (i=0;i<arraySize;i++)
temp = buffer[i];
因此,您访问的部分将始终位于缓存中,因为该模式无法预测。要查看缓存效果,您必须以较不可预测的顺序访问数组,例如通过生成(伪)随机索引,以便在数组的前端和后端之间跳转。
答案 1 :(得分:1)
除了其他答案:您的代码按顺序访问内存。我们假设缓存行是32个字节。这意味着您可能在每8次访问时获得缓存未命中。因此,选择一个随机索引,你应该使它至少比前一个值
多32个字节答案 2 :(得分:0)
为了测量多个调用的效果,您必须使用相同的缓冲区(期望第一次通过您加载缓存,以及下次使用它时)。在您的情况下,您为每个调用分配一个新的缓冲区。 (此外,您永远不会释放您的分配。)