如何使用程序检查总缓存大小

时间:2012-12-08 22:34:48

标签: c caching size

所以我在创建用C测量缓存大小的程序时遇到了一些麻烦。我理解了解决这个问题的基本概念,但我仍然无法弄清楚我到底做错了什么。

基本上,我创建了一个不同长度的数组(以2s的幂为单位)并访问数组中的每个元素并将其放入虚拟变量中。我通过阵列做了大约1000次以消除“噪音”,如果我只做一次以获得准确的时间测量,否则会发生“噪音”。然后,我寻找导致访问时间大幅增加的大小。不幸的是,这是我遇到问题的地方,我没有看到使用我的代码跳转,显然我做错了。

另一件事是我使用/ proc / cpuinfo来检查缓存,它说大小是6114,但这不是2的幂。我被告知要以2的幂来计算缓存可以解释任何人为什么会这样?

以下是我的代码......如果需要,我会发布其余的

 {
    struct timeval start;
struct timeval end;
int n =1 ; // change this to test different sizes
int array_size = 1048576*n; // size of 1MB
int x = 0;
int i =0, j=0;
int *a;
int sum = 0;
a =malloc((array_size)*sizeof(int));



for(j=0; j < array_size; j ++)
    {

        a[j] = 1; // intialize all elements to 1


    }



gettimeofday(&start,NULL);

for(i=0; i<500; i++)
{
    for(j=0; j < array_size; j ++)
    {

        x += a[j];
    }
}



gettimeofday(&end,NULL);

      sum = x+8192;

int timeTaken = (end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec *1000000 + start.tv_usec);
printf("Time Taken: %d \n", timeTaken);
printf("Average: %f \n", (double)timeTaken/((double)array_size));

}

1 个答案:

答案 0 :(得分:0)

即使你可以确保数组访问它没有得到优化,gettimeofday也没有足够的时间分辨率来测量缓存访问,尤其是L1(任何最近的商品处理器都有2或3级的高速缓冲存储器)。

可能获得具有纳秒时钟和大量统计信息的内容,以减少每项措施的错误。

另一方面,您可以使用具有this kind of feature的PAPI(Performance API)等第三方库来获取信息而不是测量。