c - L1 缓存行大小

标签 c caching cpu-cache

我正在尝试通过 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
}

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

最佳答案

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

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

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

关于c - L1 缓存行大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27389958/

相关文章:

c++ - 如何创建临时文件以帮助在 C++ 中缓存大数据?

c++ - 我们是否可以保证任何原子写入都会立即将原子变量的新值存储在主内存中?

java - 使用标准 Java HashMap(与 Trove THashMap 相比)导致非 HashMap 代码运行速度变慢

c - C 中的 unsigned int 到 const char*

c - 整数类型指针的大小和 int* 的大小

c++ - 使用 unique_ptr 缓存位置

caching - hash_data vcl_hash 的作用是什么?

memory - 缓存一致性协议(protocol) AMD Opteron 芯片(MOESI?)

将 unicode 文件的包含内容复制到 c 中的 char 数组中

未使用的 typedef 或 struct 定义是否会导致 C 程序中的行为发生变化?