Cpu cache CPU缓存是如何工作的(内部问题的完整描述)?

Cpu cache CPU缓存是如何工作的(内部问题的完整描述)?,cpu-cache,data-oriented-design,Cpu Cache,Data Oriented Design,最近,我开始对面向数据的设计感兴趣。到目前为止,我已经阅读了一些关于这个主题的文章和出版物。我了解缓存是如何工作的,它是如何构建的(通常是抽象的)L1、L2、L3,什么是缓存线,什么是N路关联,为什么缓存如此高效等等。不幸的是,我从理论上理解了这一切,但从例子上看,我不能很好地理解它们。另外,我不能把它合并成一个,因此我的问题 我在互联网上遇到了一个例子()(Example3->code belowe) 我的问题: 我不明白为什么性能会随着阵列大小的增加而降低(请参见链接中的图片) 毕竟,缓存线

最近,我开始对面向数据的设计感兴趣。到目前为止,我已经阅读了一些关于这个主题的文章和出版物。我了解缓存是如何工作的,它是如何构建的(通常是抽象的)L1、L2、L3,什么是缓存线,什么是N路关联,为什么缓存如此高效等等。不幸的是,我从理论上理解了这一切,但从例子上看,我不能很好地理解它们。另外,我不能把它合并成一个,因此我的问题

我在互联网上遇到了一个例子()(Example3->code belowe)

我的问题:

我不明白为什么性能会随着阵列大小的增加而降低(请参见链接中的图片)

毕竟,缓存线是64字节(我在某处读到这是大小),所以它应该总是适合L1。我不理解数据大小和给定缓存级别之间的关系,因为缓存线是64字节+预取器256字节(我在某处读到这是大小),所以所有内容都适合L1。(如果缓存线忙,我们可以删除它并添加新的所需缓存线。)

int steps=64*1024*1024;//任意步数
int lengthMod=阵列长度-1;
对于(int i=0;i

在32kB和4MB(L1和L2的大小)之后可以看到明显的下降 我机器上的缓存

此外:我不明白如何将数据加载到缓存中。我们假设所需的数据不在缓存的任何级别,并且整个缓存是空的

数据是否首先加载到L3,然后加载到L2和L1(如果合适)?还是只到L1

我想答案并不清楚,这取决于CPU和缓存设计,但如果有人能用某种一般的方式描述它,我将非常感激。

int steps = 64 * 1024 * 1024; // Arbitrary number of steps
int lengthMod = arr.Length - 1;
for (int i = 0; i < steps; i++)
{
    arr[(i * 16) & lengthMod]++; // (x & lengthMod) is equal to (x % arr.Length)
}