|
|
CPU的L1缓存是不是越大越好? |
|
作者:佚名 文章来源:本站原创 点击数: 更新时间:2023/1/27 21:19:12 | 【字体:小 大】 |
流潋紫后宫甄嬛传一级缓存(L1)、二级缓存(L2)等本身都属于计算机里“内存层级”细分后的产物。
首先从硬件上来说,寄存器 、L1、 L2、L3、内存、硬盘等存储设备本身的本质工作都是类似的,都是进行数据的存储和读取。他们需要分层的原因是在有限成本下,速度和容量的置换与平衡。寄存器的速度最快,成本也最高,随后L1 L2 L3 内存等的速度依次减少,而容量依次增大。L1固然快,但是造价真的高,所以做不大。
其次从定位上来说,在现在的计算机体系的“内存层级”中,L1、L2、L3承担的都是我们通常说的“内存 Memory”的Cache,L1、L2、L3等相对于程序员是“透明”的,由CPU自行管理。在实际的编程中,我们不会显式地使用这些第X级缓存(L-X),程序操作的是“内存 Memory”,使用“内存 Memory”的地址来存储和读取数据。 因此L-X所存的数据并不能直接通过程序使用的内存地址来进行存储和读取,L-X只保存“内存 Memory”的一部分数据,因此当我们要读取或者操作的时候,要查找和判断L-X是否包含给定内存地址的数据,而这个操作是有复杂度代价的。随着缓存容量的增加,通常伴随着操作延迟的增加,并不是越大越好。
我举个例子:假设在程序A中,数据在L2上一定访问得到,L1 Data=32KB的命中率是90%,延迟是3个周期,而如果L1命中失败则是12周期(Skylake水平),那么我们的数据操作的期望是:0.9*4+0.1*12=3.6+1.2=4.8周期。 此时如果说将L1翻倍到64KB,延迟顺应增加到4个周期(很保守了,Iclelake增加到48KB就变成了5周期),命中率提升到 95%,L2不变,那么期望是:0.95*5 + 0.05*12=5.35。那么实际上L1虽然做大了,但是整体的操作开销反而增加了,所以说在同样的技术下,L1并不是越大越好,而是要根据当前的实际L1的命中率去考虑,只有最适合(我的90%只是一个例子,实际并不是,也会发生改变)。在提升L1容量的同时保证延迟不增加这件事情,是非常艰难的,付出的成本是难以想象的。
所以大家注意到没,虽然半导体的工艺集成度在不断提升,但是L1的增速却很慢,通常只在32-64KB(Data/Instruction)附近,虽然不大,但这是对性能、成本最好的权衡。
|
|
 栏目文章
|
|
|