如果我有一个类似于下面的for循环。如何计算缓存未命中率。
for (i = 0; i < N-1; i++){
a[i] = (a[i] + a[i+1])/2;
}
启动时会出现强制缓存未命中,因为缓存未加载。但是[i + 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;
}
希望这会对你有所帮助。