我找不到很好的解释该高速缓存分块的概念,但我理解为什么我们会想要做缓存分块的矩阵乘法。
但是如果我有这样的代码(我试着尽可能地简化代码)
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]);
}
}
}
缓存分块在这里有何用处?
1条答案
按热度按时间bwntbbo31#
非常简单地说,计算机有两个存储器:一种是快速而稀少的(SDRAM),另一种是缓慢而丰富的(DDR)。我们有千兆字节的DDR,只有几兆字节的SDRAM。事实上,还有更多类型,但这将是复杂的解释-你可以读更多的here。
计算机所做的就是使用快速存储器暂时工作,这样你就不必一直访问大存储器。这就像做饭一样--你拿你需要的锅,做饭,最后你把所有的东西放回去。如果你必须经常拿和放锅,你的工作就会很慢。
内存也是一样,你需要把你的数据放在微观尺度上非常接近的地方,这样你就可以先接触几兆字节的小范围,然后移动到下一个块,等等。
在上面的循环中,你已经在做这件事了--内部循环
k
已经是内存中最集中的了。如果k
循环在i
和j
之外,那么性能会非常糟糕。您可以看到,仅仅通过将类似
k
的代码与j
行进行交换,就会导致性能的巨大损失,您可以看到k
在外部越多,性能就变得越慢。链接到quickbench:https://quick-bench.com/q/FG4aPSRbF5nuNHsVugL44nMNT-s