mu11zi22yu33 2017-11-07 20:32 采纳率: 0%
浏览 922

已知代码,求L1缓存大小

通过下面这段代码,修改M和B,推算出计算机的L1缓存大小,有没有大神能给我讲讲怎么做呢
#include
#include
#include
#define M 256
#define B 8

double CLOCK() {
struct timespec t;
clock_gettime(CLOCK_MONOTONIC, &t);
return (t.tv_sec * 1000)+(t.tv_nsec*1e-6);
}

main(int argc, char **argv)
{
int i,j,k,jj,kk,en;
double start, finish, total, sum;
int a[M][M], b[M][M], c[M][M];
printf("int : %lu\n",sizeof(int));
printf("float : %lu\n",sizeof(float));
//初始化
for (i=0; i<M; i++)
for (j=0; j<M; j++)
a[i][j] = i+j;

for (i=0; i<M; i++)
   for (j=0; j<M; j++)
       b[i][j] = i+j;

for (i=0; i<M; i++)
   for (j=0; j<M; j++)
       c[i][j] = 0;

en = B * 4;
//en = M;
start = CLOCK();

int n = 0;
for(n = 0;n <10;n++)
{
for (kk=0; kk<en; kk+=B)
for (jj=0; jj<en; jj+=B)
for (i=0; i< M; i++)
for (j = jj; j< jj + B; j++)
{
sum = c[i][j];
for (k=kk; k< kk + B; k++)
{
sum+= a[i][j] * b[k][j];
}
c[i][j] = sum;
}

}
finish = CLOCK();
total = finish - start;
printf("Time for the loop = %f\n", total);

return 0;

}

  • 写回答

1条回答 默认 最新

  • threenewbee 2017-11-08 01:35
    关注

    原理是调整数据量,观察程序运行的时间,如果程序运行时间显著变长,那么可以找到对应的临界点,那么它使用的内存就是L1的大小,或者和L1大小有关。
    然而实际上并不是这样,现代cpu有越来越多的优化可以打破缓存的局限,比如自动分支预测和缓存预测。
    你这样的代码估计放在pentium/486的时代才有准确性可言。

    评论

报告相同问题?

悬赏问题

  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64
  • ¥15 iOS 自定义输入法-第三方输入法
  • ¥15 很想要一个很好的答案或提示
  • ¥15 扫描项目中发现AndroidOS.Agent、Android/SmsThief.LI!tr