为了账号安全,请及时绑定邮箱和手机立即绑定

Intel Core i7处理器使用哪种缓存映射技术?

/ 猿问

Intel Core i7处理器使用哪种缓存映射技术?

红颜莎娜 2019-10-12 09:47:53

我了解了不同的缓存映射技术,例如直接映射,关联映射和集合关联映射技术,还学习了权衡取舍。但是我很好奇如今在英特尔酷睿i7或AMD处理器中使用了什么。以及技术如何发展。哪些方面需要改进?



查看完整描述

3 回答

?
春华秋衣

直接映射缓存基本上在现代高性能CPU中从未使用过。对于相同大小的集关联缓存,命中率的巨大优势大大节省了功率,而控制逻辑的复杂性仅高一点。如今,晶体管预算非常庞大。


对于软件来说,至少有两个彼此间隔4k的倍数的阵列是很常见的,这会在直接映射的缓存中造成冲突未命中。(如果循环需要一次迭代遍历所有数组,则调整具有多个数组的代码可能涉及使它们倾斜以减少冲突遗漏)


现代CPU是如此之快,以至于DRAM延迟超过200个核心时钟周期,即使对于功能强大的无序执行CPU来说,也无法掩盖高速缓存未命中,这也太大了。


多级缓存是必不可少的(所有高性能CPU都使用了这种缓存),以便为最热的数据提供低延迟(〜4个周期)/高吞吐量(例如,每个时钟最多2个负载和1个存储,并具有128、256甚至L1D缓存和向量加载/存储执行单元之间的512位路径),同时仍然足够大,可以缓存合理大小的工作集。建立一个非常大/非常快/高度关联的缓存,以执行与典型工作负载相同的当前多级缓存,这在物理上是不可能的。当数据必须物理传输很远时,光速延迟是一个问题。电力成本也将是过高的。(实际上,功率/功率密度是现代CPU的主要限制因素,请参阅《现代微处理器:90分钟指南!》。)


在我知道的所有x86 CPU中,所有级别的缓存(除了uop缓存之外)都被物理索引/物理标记。大多数设计中的L1D高速缓存从页偏移量以下获取其索引位,因此也是VIPT,允许TLB查找与标签获取并行发生,但没有任何别名问题。因此,不需要在上下文切换或其他任何东西上刷新缓存。(有关一般的多级缓存和VIPT速度技巧以及某些实际x86 CPU的某些缓存参数的更多信息,请参见此答案。)


专用(每核)L1D / L1I和L2缓存是传统的集关联缓存,对于小型/快速缓存,通常为8路或4路。在所有现代x86 CPU上,缓存行大小均为64字节。数据缓存是回写的。(除AMD Bulldozer系列外,L1D是通过4kiB小型写合并缓冲区进行直写的。)


http://www.7-cpu.com/具有适用于各种微体系结构(包括许多x86,例如Haswell)的良好的缓存组织/等待时间数,带宽和TLB组织/性能数。


英特尔Sandybridge系列中的“ L0”解码uop缓存是集关联的,并且可以进行虚拟寻址。最多3个块(最多6个微指令)可以缓存32字节机器代码块中指令的解码结果。相关:涉及英特尔SnB系列CPU上涉及微编码指令的循环的分支对齐。(uop缓存是x86的一大进步:x86指令的长度可变,并且难以快速/并行地进行解码,因此缓存内部解码结果以及机器码(L1I $)具有显着的性能和吞吐量优势。强大仍然需要解码器,因为uop缓存不大;它在循环(包括中到大循环)中最有效,避免了Pentium4错误(或当时基于传输器大小的限制),因为解码器性能较弱并依赖于跟踪缓存。)


现代英特尔(我认为是AMD)和L3 aka LLC,也就是最后一级缓存,使用的索引功能不仅仅是地址位的范围。这是一个哈希函数,可以更好地分配内容以减少固定步幅的冲突。 根据Intel的说法,我的缓存应该是12路的,但应该是24路的。。


从Nehalem的起,英特尔使用大包容共享的L3高速缓存,该滤波器核之间的相干性的流量。例如,当一个内核读取另一个内核的L1d中处于修改状态的数据时,L3标签会说出哪个内核,因此只能将RFO(所有权读取)发送给该内核,而不进行广播。 现代英特尔CPU L3缓存如何组织?。包含属性非常重要,因为这意味着在L3不知道的情况下,私有L2或L1高速缓存都不能拥有高速缓存行的副本。如果它在专用缓存中处于“排他”或“已修改”状态,则L3将对该行具有无效数据,但是标签仍会说出哪个核心可能具有副本。绝对没有副本的内核不需要发送有关它的消息,从而节省了内核和L3之间内部链接的功耗和带宽。有关英特尔“ i7”(即Nehalem和Sandybridge系列,它们是不同的体系结构,但使用相同的缓存层次结构)中的片上缓存一致性的更多详细信息,请参见为什么保留片上缓存一致性。


Core2Duo具有共享的末级缓存(L2),但是在L2未命中时生成RFO(所有权读取)请求的速度很慢。因此,带有适合L1d的小缓冲区的内核之间的带宽与不适合L2d的大缓冲区(即DRAM速度)一样慢。当缓冲区适合L2而不适合L1d时,大小会有一个较快的范围,因为写入内核将自己的数据逐出到L2,而其他内核的负载可能在不产生RFO请求的情况下受到冲击。(请参见Ulrich Drepper的“每个程序员应该了解的内存”中的图3.27:具有2个线程的Core 2带宽。(完整版本在此处)。


Skylake-AVX512具有更大的每核L2(1MiB而不是256k),并且每核具有更小的L3(LLC)片。它不再具有包容性。它使用网状网络而不是环形总线将核心相互连接。请参阅这篇AnandTech文章(但其他页面上的微体系结构详细信息有一些错误之处,请参见我留下的评论)。


来自英特尔®至强®处理器可扩展系列技术概述


由于LLC的非包容性,LLC中不存在高速缓存行并不表示该行不存在于任何内核的专用高速缓存中。因此,探听过滤器用于在LLC中未分配缓存时跟踪内核的L1或MLC中的缓存线位置。在上一代CPU上,共享LLC本身负责这项任务。


此“探听过滤器”仅在不能包含假阴性的情况下才有用。可以将无效或RFO(MESI)发送到没有行副本的核心。当另一个核心正在请求对其进行独占访问时,让一个核心保留行的副本是不可行的。因此,它可能是一个包含标签的跟踪器,该跟踪器知道哪些核心可能具有哪一行的副本,但是哪些不缓存任何数据。


或者,在没有严格包含所有L2 / L1标签的情况下,探听过滤器可能仍然有用。我不是多核/多路套接字侦听协议的专家。我认为同一个监听过滤器也可能有助于过滤套接字之间的监听请求。(在Broadwell及更早版本中,只有四路及更高版本的Xeon具有用于内核间通信的侦听过滤器;仅双路的Broadwell Xeon及更早版本不过滤两个套接字之间的侦听请求。)


AMD Ryzen 对内核集群使用单独的L3缓存,因此必须在L3中为每个集群复制许多内核之间共享的数据。同样重要的是,从一个群集中的内核进行的写入需要更长的时间才能被另一个群集中的内核看到,而一致性请求必须经过群集之间的互连。(类似于多插槽Intel系统中的插槽之间,其中每个CPU软件包都有自己的L3。)


因此,这为我们提供了NUCA(非统一缓存访问),类似于在多插槽系统中获得的常规NUMA(非统一内存访问),在该系统中,每个处理器都内置了一个内存控制器,并且访问本地内存是比访问连接到另一个插槽的内存更快。


近期的Intel多路插座系统具有可配置的侦听模式,因此从理论上讲,您可以调整NUMA机制,使其最适合所运行的工作负载。有关可用侦听模式的表和说明,请参阅英特尔有关Broadwell-Xeon的页面。


另一个进步/发展是IvyBridge及更高版本上的L3中的自适应替换策略。当某些数据具有时间局部性但工作集的其他部分更大时,这可以减少污染。(即,使用标准LRU替换在巨型阵列上循环将驱逐所有内容,使L3缓存仅高速缓存阵列中的数据,这些数据将很快不再被触及。自适应替换试图缓解该问题。)


查看完整回答
反对 回复 2019-10-12
?
烙印99

从安全角度来看,使用经典索引编制和替换可能会被认为是有问题的。可以进一步完善替换策略,可以利用压缩,通过减少容量使用,接近使用(NUCA和从生产者到消费者的数据推送)来节省功率,一致性开销,共享管理(例如资源投标和隔离)。低悬垂的果实可能收获良好,但似乎仍有大量的果实。

查看完整回答
反对 回复 2019-10-12
?
海绵宝宝撒

Core2中不是这种情况。我认为由一个内核写入并由另一个内核读取的数据必须通过DRAM,就像在简单的MESI中一样。(Core2确实具有大型共享L2)。但是是的,inclusive属性并未专门启用该功能。包含性的好处在于,不必将一致性流量广播到所有内核,因为L3标签会告诉您数据可能存储在何处。(无声驱逐可能会导致误报,从而导致无用的RFO或无效消息,但误报是不可能的,因此它可以过滤掉大量流量。)

查看完整回答
反对 回复 2019-10-12

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信