计算for循环的缓存未命中率?

时间:2018-04-19 15:25:42

标签: caching architecture

如果我有一个类似于下面的for循环。如何计算缓存未命中率。

for (i = 0; i < N-1; i++){
 a[i] = (a[i] + a[i+1])/2;
}

启动时会出现强制缓存未命中,因为缓存未加载。但是[i + 1]还会有缓存未命中吗?这是计算缓存未命中率的正确方法吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用来自核心的tsc寄存器来执行您的代码,只要有高速缓存未命中,您将获得明显更高的访问时间,因此您可以推断出发生了高速缓存未命中。

unsigned long long int rdtsc(void){
       unsigned long long int x;
       unsigned a, d;

       __asm__ volatile("rdtsc" : "=a" (a), "=d" (d));

       return ((unsigned long long)a) | (((unsigned long long)d) << 32);;
}

因此,您可能希望在执行要测量缓存访问权限的指令之前和之后读取tsc寄存器,如下图所示。

您可以查看以下链接中的图片,了解其工作原理。 https://adriancolyer.files.wordpress.com/2018/01/meltdown-fig-4.jpeg?w=480

long long int start_time = 0;
long long int total_time = 0;

for (i = 0; i < N-1; i++){
    start_time = rdtsc();
    a[i] = (a[i] + a[i+1])/2;
    total_time = rdtsc() - start_time;
}

希望这会对你有所帮助。