我需要针对某些处理器优化基于内存表的一组算法。我发现自己想知道为什么每个英特尔处理器至少在2010年以来每个核心使用64KB(32KB数据,32KB指令)的L1缓存。
为什么他们坚持使用64KB,即使每个其他缓存都增加了,而且引入了几乎巨大的L3缓存?
有什么我能读到的吗?
如果在未来5年或10年内这种情况有所增加,是否有一个有效的猜测?
我检查了其他供应商和Opterons,例如64KB + 64KB但是每个模块共享,而Interlagos(例如)每个核心只有16KB,每个模块共享64KB数据缓存。 Apple的A7和A8每个内核有64KB + 64KB,但其他供应商使用的是16KB + 16KB的64位Arm。
目前我设计的是8KB表,但是一旦我将两张表混合在一起,这就变得更加重要了。
答案 0 :(得分:2)
L1i和L1d需要较低的 latency ,并且(对于L1d)需要多个读/写端口。 L1d还需要支持从字节到32字节的任何宽度的未对齐加载/存储。 (或在具有AVX512的CPU上为64字节)。保持这些高速缓存的大小对于维护这些属性并保持功能强大很重要。
体积小还使VIPT(虚拟索引,物理标记)更容易,这对于最小化延迟至关重要。 (与地址的高位的TLB查找并行获取标签+数据。)
有关这些因素的更多详细信息,请参见Why is the size of L1 cache smaller than that of the L2 cache in most of the processors?。
将功率预算花费在其他地方(L1i / L1d除外)在特定点之外更有价值。例如在更好的OoO执行程序,更多的加载/存储缓冲区条目上,或者在更大的每核私有L2上,速度虽然快,但是不需要多个读/写端口,并且不需要支持未对齐的字节访问:这是关键可以使L1d保持较小而共享L3变得很大的变化。
有趣的事实:对于Ice Lake来说,英特尔最终通过将关联性从8k增加到12k来将L1d缓存从32k提升到48k(“免费”保留VIPT而没有混淆问题)。
这是英特尔自Pentium-M以来的第一个L1增长,从Pentium 3中的16k + 16k上升到32k + 32k(以及Pentium 4中的跟踪缓存+ 16k L1d)。
在P-M和Skylake-X之间,英特尔大大改善了L1d和L2之间的带宽,并将未对齐的SIMD加载/存储改进了,将SIMD加载/存储数据路径从8个扩展到了64个字节,并增加了另一个缓存读取端口。 (Haswell和更高版本每个周期可以进行2次读取和1次写入。)
OTOH,AMD多年来尝试了不同的L1配置,但对于Zen而言,它已经选择了与英特尔相同的良好设计。 (32k,良好的关联性,每核私有L2缓存对其进行备份,因此L1d的丢失不是灾难,也不必访问共享缓存。)
另请参见
答案 1 :(得分:0)
我不是专家,而是我的两分钱:
L1集成到核心,这意味着:它共享相同的时钟,其大小影响核心的大小。
第一个更符合逻辑问题。你希望L1与寄存器相比速度非常快。你不能通过计时L1来解决这个问题,因为核心也会被计时。 HW缓存类似于软件缓存,搜索它们需要时间。因此,当L1变大时,考虑到硬件缓存解决方案的复杂性保持相同,搜索会变得更慢。您可以提高解决方案的复杂程度,但这会对空间,能量和热量产生负面影响。
继续大小,即如果你把L1做得更大,你需要空间来存储那些位和字节,从而产生相同的空间,能量问题。
因此,您对L1和L2有不同的设计标准,并通过将它们分开来划分问题并在两个层面上征服它。如果你把L1变成大而慢的L2然后你会模糊它。
读数: