L1缓存行大小

时间:2014-12-09 22:20:20

标签: c caching cpu-cache

我试图通过平台上的C代码确定L1缓存行大小,其中L1 I D缓存各为32 KB,L2缓存为2 MB。

#include<stdio.h>
#include<stdlib.h>
#include<sys/time.h>
#include<time.h>
#define SIZE 100
long long wall_clock_time();
int main()
{
    int *arr=calloc(SIZE,sizeof(int));
    register int r,i;
    long long before,after;
    double time_elapsed;
    for(i=0;i<SIZE;i++)
    {
        before=wall_clock_time();
        r=arr[i];
        after=wall_clock_time();
        time_elapsed=((float)(after - before))/1000000000;
        printf("Element Index = %d, Time Taken = %1.4fn",i,time_elapsed);
    }
    free(arr);
    return 0;
}
long long wall_clock_time() {
    #ifdef __linux__
    struct timespec tp;
    clock_gettime(CLOCK_REALTIME, &tp);
    return (long long)(tp.tv_nsec + (long long)tp.tv_sec * 1000000000ll);
    #else
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return (long long)(tv.tv_usec * 1000 + (long long)tv.tv_sec * 1000000000ll);
    #endif
}

上面是一个小代码片段,我用它来访问数组的元素并尝试确定缓存行边界处访问延迟的跳转。但是,当我执行代码时,我得到所有的定时输出为0.000。我已经在stackoverflow上阅读了关于这个主题的几个线程但是无法理解,因此试图编写这段代码。 任何人都可以向我解释在概念上或语法上是否存在错误吗?

1 个答案:

答案 0 :(得分:2)

0.00应该暗示你测量的东西太小了。调用测量功能的开销比你测量的高几个数量级。

相反,测量传递数组所需的总时间,然后除以SIZE以分摊它。由于SIZE也相当小,你应该重复这个动作数百次,并在整个事情上摊销。

请注意,这仍然不会为您提供延迟,而是提供访问的吞吐量。你需要想出一种方法来测量线的大小(尝试从二级缓存中读取,并使用读取到同一行的事实将在L1中击中。通过增加步骤,你和& #39;能够看到你的BW何时停止降级并保持不变)。