【问题标题】:Calculate Cache miss rate for a for loop?计算for循环的缓存未命中率?
【发布时间】: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


    【解决方案1】:

    您可以尝试使用内核中的 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;
    }
    

    希望对你有所帮助。

    【讨论】:

    • 我们需要手工完成,还需要编码和比较...您将如何手工完成?
    • 猜猜它取决于你的数组的每个成员的大小和你的缓存行粒度,在最好的情况下你的数组是缓存行对齐的,你的第一次访问将带来你的数组的开头和将能够访问所有数据,直到 for 循环扫描第一个缓存行中包含的数据,如果它用完,则需要获取下一个缓存行,依此类推……但是现代 CPU 的预取数据围绕第一个获取的 $line 最小化缓存未命中。
    猜你喜欢
    • 2019-07-04
    • 2014-06-26
    • 2018-07-22
    • 2014-07-29
    • 2013-04-30
    • 1970-01-01
    • 2012-05-23
    • 2019-11-30
    • 2019-10-05
    相关资源
    最近更新 更多