2

所以我在创建一个程序来测量 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));

}

4

1 回答 1

0

即使您可以确保未优化阵列访问,gettimeofday也没有足够的时间分辨率来测量缓存访问,尤其是 L1(任何最近的商品处理器都有 2 或 3 级缓存)。

可能会得到一个纳秒时钟和大量统计数据,以减少每个测量的误差。

另一方面,您可以使用具有此类功能的第三方库(例如 PAPI(Performance API))来获取信息而不是度量。

于 2012-12-10T12:46:35.293 回答