L1 、L2、L3、主存 的大小是逐渐增大,速度是逐渐减小的。
下面是现代CPU的一个架构示意图:
其中:Regs,是寄存器。
d-cache,是数据缓存。
i-cache,是指令缓存。
本次我们并不讨论这个缓存快的影响。
L1、L2、L3和主存的缓存的内容,可以参考下图:
图片来自:https://www.deskdecode.com/what-is-cpu-central-processing-unit-and-how-its-work/
CPU的缓存里面还有很多的细节,我就先忽略了,知道上面的信息就已经足够我们理解今天的问题了。
2.2 性能损失的原因 -- 缓存命中率
有了上面的各级别的缓存参考之后,我们可以想象一下,如果把上面的图像换成是我们的二维数组呢。是不是就是下面这样(可能没有那么严谨,但是不妨碍我们理解)。
在RAM(主存)的数据是这样的:
L3缓存就是这样的(红色框选中部分):
L2缓存就是这样的(红色框选中部分):
有了这个这些层级的缓存之后,CPU在计算的时候就可以不用来回的到速度极慢的RAM(主存)中去找数组的数据了。
2.2.1 友好的遍历方式
假设上面的数据的变量名称是A,成员使用 a 来表述。
我们取数据按照 从左到右,再从上到下 的顺序来进行遍历。