【问题标题】:L1 Cache Line SizeL1 缓存行大小
【发布时间】:2015-02-07 23:53:14
【问题描述】:

我正在尝试通过 C 代码在 L1 I D 缓存为 32 KB 且 L2 缓存为 2MB 的平台上确定 L1 缓存行大小。

#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
}

上面是一个小代码 sn-p,我用它来访问数组的元素并尝试确定缓存行边界处访问延迟的跳跃。但是,当我执行代码时,我得到的所有计时输出都是 0.000。我已经阅读了有关此主题的 stackoverflow 上的几个线程,但不太了解,因此尝试编写此代码。 谁能向我解释一下概念上或句法上是否有错误?

【问题讨论】:

    标签: c caching cpu-cache


    【解决方案1】:

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

    相反,测量传递数组所需的总时间,然后除以 SIZE 以摊销它。由于 SIZE 也相当小,您可能应该重复此操作数百次并摊销整个事情。

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

    【讨论】:

      猜你喜欢
      • 2013-01-20
      • 2021-11-27
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 2012-09-22
      • 2021-09-30
      • 1970-01-01
      • 2013-07-05
      相关资源
      最近更新 更多