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