【发布时间】:2018-04-20 02:23:43
【问题描述】:
如果我有一个像下面这样的 for 循环。如何计算缓存未命中率。
for (i = 0; i < N-1; i++){
a[i] = (a[i] + a[i+1])/2;
}
在开始时会出现强制缓存未命中,因为缓存不会被加载。但是对于 a[i+1] 也会有缓存未命中吗?这是计算缓存未命中率的正确方法吗?
【问题讨论】:
标签: caching architecture
如果我有一个像下面这样的 for 循环。如何计算缓存未命中率。
for (i = 0; i < N-1; i++){
a[i] = (a[i] + a[i+1])/2;
}
在开始时会出现强制缓存未命中,因为缓存不会被加载。但是对于 a[i+1] 也会有缓存未命中吗?这是计算缓存未命中率的正确方法吗?
【问题讨论】:
标签: caching architecture
您可以尝试使用内核中的 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;
}
希望对你有所帮助。
【讨论】: