c++ Cache分块优化技术

3pvhb19x  于 2023-03-14  发布在  其他
关注(0)|答案(1)|浏览(150)

我找不到很好的解释该高速缓存分块的概念,但我理解为什么我们会想要做缓存分块的矩阵乘法。
但是如果我有这样的代码(我试着尽可能地简化代码)

void func(double *array, double *array2)
for(int i = 0; i <1000; i++){
    for(int j = 0; j <1000; j++){
        for(int k = 0; k <1000; k++){
            int index = (i*10) + ( (20*j) +k) 
            array[index] = compute(array2[index]);
        }
    }
}

缓存分块在这里有何用处?

bwntbbo3

bwntbbo31#

非常简单地说,计算机有两个存储器:一种是快速而稀少的(SDRAM),另一种是缓慢而丰富的(DDR)。我们有千兆字节的DDR,只有几兆字节的SDRAM。事实上,还有更多类型,但这将是复杂的解释-你可以读更多的here
计算机所做的就是使用快速存储器暂时工作,这样你就不必一直访问大存储器。这就像做饭一样--你拿你需要的锅,做饭,最后你把所有的东西放回去。如果你必须经常拿和放锅,你的工作就会很慢。
内存也是一样,你需要把你的数据放在微观尺度上非常接近的地方,这样你就可以先接触几兆字节的小范围,然后移动到下一个块,等等。
在上面的循环中,你已经在做这件事了--内部循环k已经是内存中最集中的了。如果k循环在ij之外,那么性能会非常糟糕。
您可以看到,仅仅通过将类似k的代码与j行进行交换,就会导致性能的巨大损失,您可以看到k在外部越多,性能就变得越慢。

链接到quickbench:https://quick-bench.com/q/FG4aPSRbF5nuNHsVugL44nMNT-s

相关问题