Performance 为什么现代CPU没有';t交错缓存?

Performance 为什么现代CPU没有';t交错缓存?,performance,computer-architecture,Performance,Computer Architecture,在这方面存在一些问题,例如,当阵列或矩阵恰好与缓存大小对齐时,性能会下降。如何使用的想法已经存在了几十年。那么为什么现代计算机不交错缓存以减少超级对齐的后果呢?交错解决了另一个问题(内存访问延迟)。因为缓存速度很快,所以交错并没有真正的帮助。对于缓存对齐问题,传统的解决方案是。大多数现代缓存都已存储,但这(就像链接状态中的内存存储一样)旨在改善访问定时和顺序访问带宽,而不是解决其他问题 您链接的问题被解决为错误编码(按行而不是按列遍历),但一般来说,如果您想解决缓存中错误对齐引起的问题,您需要查

在这方面存在一些问题,例如,当阵列或矩阵恰好与缓存大小对齐时,性能会下降。如何使用的想法已经存在了几十年。那么为什么现代计算机不交错缓存以减少超级对齐的后果呢?

交错解决了另一个问题(内存访问延迟)。因为缓存速度很快,所以交错并没有真正的帮助。对于缓存对齐问题,传统的解决方案是。

大多数现代缓存都已存储,但这(就像链接状态中的内存存储一样)旨在改善访问定时和顺序访问带宽,而不是解决其他问题

您链接的问题被解决为错误编码(按行而不是按列遍历),但一般来说,如果您想解决缓存中错误对齐引起的问题,您需要查找缓存倾斜的关联性()。根据这种方法,集合映射不是基于简单的集合位,而是涉及基于标记位的一些洗牌-这允许在数据在相同集合上发生冲突的情况下更好地传播数据。请注意,如果您正在使用整个缓存,这并不能真正帮助您,只适用于一些“热集”被过度使用,而其他热集大部分未被触及的情况

然而,据我所知,这不是一种常见的做法,因为这是一个非常具体的问题,可以通过代码(或通过编译器)轻松解决,因此可能不值得硬件解决方案


编辑:
在Paul的问题之后进行了更多的搜索-似乎延迟关键的更近缓存没有使用此功能(或者至少它没有被发布,但我想如果这样做了,它会出现在优化指南中,因为它对性能调整很重要,并且很容易被检测到)。这可能包括在任何内存访问中都必须查询的L1和TLB

但是,根据此链接,它至少在某些英特尔芯片的L3缓存中完成:

每个核心有一个三级缓存片,每个片可以 每个周期向数据环提供半条缓存线(32B)。全部的 物理地址通过 单散列函数。在缓存片之间对数据进行分区 简化一致性,增加可用带宽并减少 缓存地址的热点和争用


因此,它至少用于大规模、低延迟的关键缓存。

这个问题似乎是离题的,因为它与CPU体系结构和设计有关,并且根据指南与编程无关。是的,我的意思是扭曲的关联性。那么为什么这个解决方案没有被利用呢?由于这个问题发生在很多人身上,而且软件解决方案可能需要程序员的一些关注,因此在硬件级别上实现它是有意义的。正如我所说,你必须向CPU公司询问这一点-我只能假设潜在的收益是不值得的。当然,他们会使用可靠的基准来评估这些东西,而不是破坏代码。素数模索引也被提出@Michael For L1 access扭曲的关联性会增加延迟(将这些延迟折叠到AGU或缓存阵列索引中可以减少此问题),并引入别名问题。为什么这样不用于L2或TLB是Area51提案中的一个问题。您可能会发现(以及该wiki的其他部分)很有趣。@PaulA.Clayton,我不确定在地址位上添加一个简单的xor会花费这么多,但如果它这样做,那么它在TLB查找路径中也同样重要。虽然同意L2,但我看到它至少是由Intel在L3中完成的(请参见编辑)@lee或者尚不清楚SandyBridge的L3哈希函数是否特别复杂;例如,模二的幂仍然是一个散列函数。POWER4(和5)有3个L2片,并使用“多”地址位的模3来选择片(并将带宽减少到相对于核心的最远片),但这或多或少是普通的索引。TLB和翻译后二级缓存没有别名问题,并且往往从冲突减少中获益更多(一级TLB相对于一级缓存的索引位更少也可能影响设计选择)。