英特尔硬件上的商店缓冲区大小?什么是商店缓冲区?

Cur*_*ous 8 performance x86 assembly intel cpu-architecture

英特尔优化手册似乎对存储缓冲区的数量存在于处理器的许多地方,但谈判没有谈存储缓冲区的大小.这是公共信息还是商店缓冲区的大小保留为微架构细节?

我正在研究的处理器主要是Broadwell和Skylake,但其他人的信息也不错.

另外,存储缓冲区究竟做了什么?

Pet*_*des 11

存储缓冲区作为一个整体由多个条目组成.

每个核心都有自己的存储缓冲区1,用于将执行和退出与提交解耦为L1d缓存.即使有序CPU也可以从存储缓冲区中受益,以避免在缓存缺失存储上停滞,因为与负载不同,它们最终必须变得可见.(没有实际的CPU使用顺序一致性内存模型,因此至少允许StoreLoad重新排序,即使在x86和SPARC-TSO中也是如此).对于推测/无序CPU,它还可以在检测到旧指令中的异常或错误推测之后回滚存储,而不会使推测存储全局可见.这显然对正确性至关重要!

当两个逻辑核心都处于活动状态(超线程)时,英特尔将存储缓冲区分为两个; 每个逻辑核心都有一半.来自一个逻辑核心的加载仅窥探其自身的一半存储缓冲区2. 用于线程之间数据交换的内容是在一个Core上用HT执行的?

存储缓冲区以程序顺序(遵循x86的强排序内存模型3)尽快将退役存储指令中的数据提交到L1d .要求店承诺他们退休会不必要地拖延高速缓存未命中商店退休.仍然在存储缓冲区中的退役商店肯定会发生并且无法回滚,因此它们实际上可能会损害中断延迟.(在技术上,中断不需要序列化,但IRQ处理程序完成的任何存储都不会在现有的挂起存储库耗尽之后才会显示.并且正在序列化,因此即使在最好的情况下,存储缓冲区在返回之前也会消耗掉.)iret

这是一个常见的(?)误解,它必须被显式刷新才能使数据对其他线程可见.内存屏障不会导致存储缓冲区被刷新,完全屏障会使当前内核等待,直到存储缓冲区自身耗尽,然后才允许任何后续加载发生(即读取L1d).原子RMW操作必须等待存储缓冲区耗尽才能锁定高速缓存行并同时执行它们的加载和存储到该行而不允许它离开MESI Modified状态,从而阻止系统中的任何其他代理在观察期间观察它原子操作.

要实现x86的强排序内存模型,同时仍然在微体系结构上允许早期/无序加载(以及稍后检查在架构上允许发生加载时数据是否仍然有效),加载缓冲区+存储缓冲区条目共同形成内存顺序缓冲区(MOB).(如果在允许加载时仍然存在高速缓存行,那就是内存顺序错误推测.)这种结构大概是在哪里mfencelocked指令可以设置阻止StoreLoad重新排序的屏障而不会阻塞订单执行.(尽管mfence在Skylake上确实阻止了OoO执行独立的ALU指令,作为实现细节.)

movnt缓存绕过存储(例如movntps)也通过存储缓冲区,因此它们可以被视为推测,就像OoO exec CPU中的其他所有内容一样.但它们直接提交LFB(行填充缓冲区),即写入组合缓冲区,而不是L1d缓存.


在Intel CPU上存储指令解码到存储地址和存储数据uop(微融合到一个融合域uop).存储地址uop只是将地址(可能还有存储宽度)写入存储缓冲区,因此以后的加载可以设置存储 - >加载转发或检测它们不重叠.store-data uop写入数据.

存储地址和存储数据可以按任意顺序执行,无论哪个先准备就绪:将uop从前端写入ROB的分配/重命名阶段和后端的RS也为负载分配加载或存储缓冲区或在发布时存储uops.或者在一个可用之前停止.由于分配和提交按顺序发生,这可能意味着较旧/较年轻易于跟踪,因为它可以只是一个循环缓冲区,不必担心在环绕后仍然在使用旧的长期条目.(除非高速缓存旁路/弱排序的NT存储可以做到这一点吗?它们可以不按顺序提交到LFB(行填充缓冲区).与普通存储不同,它们直接提交到LFB以进行非核心传输,而不是L1d .)


但是一个条目的大小是多少?

存储缓冲区大小以条目而非位来衡量.

狭窄的商店不会在商店缓冲区中"使用更少的空间",他们仍然只使用1个条目.

Skylake的商店缓冲区有56个条目(wikichip),高于Haswell/Broadwell的42 个条目,以及SnB/IvB的36个条目(David Kanter在RealWorldTech上的HSW文章有图表).您可以在RWT,Wikichip图表或其他各种来源的Kanter写作中找到大多数早期x86搜索的数字.

SKL/BDW/HSW还有72个加载缓冲区条目,SnB/IvB有64个.这是未执行或正在等待数据从外部缓存到达的正在进行的加载指令的数量.


每个条目的位大小是一个实现细节,对优化软件的方式没有任何影响.类似地,我们不知道uop的位大小(在前端,在ROB中,在RS中),或TLB实现细节,或许多其他东西,但我们知道有多少ROB和RS条目,以及在各种搜索中有多少不同类型的TLB条目.

英特尔没有公布其CPU设计的电路图和(AFAIK)这些尺寸通常不为人所知,因此我们甚至无法满足我们对设计细节/权衡的好奇心.


在存储缓冲区中写入合并:

对同一缓存行的背靠背窄存储可以(可能?)在它们提交之前被合并在存储缓冲区中,因此它可能只需要在L1d缓存的写端口上进行一个循环来提交多个存储.

我们肯定知道一些非x86 CPU可以做到这一点,我们有一些证据/理由相信英特尔CPU真的可以做到这一点.但它有限.请参阅以此注释开头的讨论:写入组合缓冲区是否用于正常写入英特尔上的WB内存区域?

此外,英特尔Skylake上的商店循环的出乎意料的差和奇怪的双峰性能可能是相关的.

我们肯定知道像Alpha 21264这样的弱排序的ISA确实在它们的存储缓冲区中存储了合并,因为手册记录了它,以及它对每个周期可以提交和/或读取L1d的限制.此外,PowerPC RS64-II和RS64-III(详细信息较少)通过以下评论链接的文档:是否存在任何现代/古老的CPU /微控制器,其中缓存的字节存储实际上比字存储慢?

人们已经发表了关于如何做(更积极?)商店合并TSO内存模型(如x86)的文章,例如总商店订单中的非投机商店合并

合并可以允许在数据提交到L1d之前释放存储缓冲区条目(可能仅在退出之后),如果其数据被复制到存储到同一行.这种情况只有在没有其他行的商店将它们分开时才会发生,否则会导致商店在程序顺序之外提交(变得全局可见),从而违反了内存模型.但是我们认为这可能发生在同一行的任何2个商店,甚至是第一个和最后一个字节.

(这可能意味着每个SB条目都有64个字节用于数据,除非合并与普通SB条目不同.但Skylake-AVX512几乎肯定有64字节的SB条目,因为单个商店可以那么宽.为了它的价值,据报道,SKL和SKX的内核基本相同,只缺少第二个512位FMA单元,可能还有256位的物理寄存器文件.所以SKL上的存储缓冲区条目几乎肯定有64字节数据的空间如果早期的CPU没有.但实际上我们认为许多早期的CPU 确实有空间将任何相邻的商店合并到同一行.)


术语:我一直在使用"合并"来讨论在存储缓冲区中的合并,而不是"写入组合"来讨论在LFB之前组合的NT存储(希望)在没有RFO的情况下进行全行写入.或者存储到执行相同操作的WC内存区域.

这种区别/惯例只是我编造的东西.根据评论中的讨论,这可能不是标准的计算机体系结构术语.

英特尔的手册(特别是优化手册)由不同的作者撰写多年,并且在术语上也不一致. 特别是如果谈到Pentium4,请参考优化手册的大部分内容.关于Sandybridge和Haswell的新章节是可靠的,但较旧的部分可能有陈旧的建议,这些建议仅与P4有关(例如inc与add 1),或者某些优化规则的微体系结构解释可能会令人困惑/错误.特别是第3.6.10节"写入组合".由于存储器排序规则,关于使用LFB在等待线路到达高速缓存未命中存储到WB存储器时组合存储的第一个要点似乎不合理.请参阅上面链接的我和BeeOnRope之间的讨论,以及此处的评论.


脚注1:

用于缓冲内部高速缓存的回写(或写入)的写入组合高速缓存将具有不同的名称.例如,Bulldozer-family使用16k直写L1d高速缓存,带有一个小的4k写回缓冲区.(请参阅为什么L1和L2高速缓存浪费空间可以节省相同的数据?有关详细信息和更多详细信息的链接.请参阅系统上的高速缓存大小估计?对于在Bulldozer系列上减速超过4k的重写阵列微基准测试中央处理器.)

脚注2:某些POWER CPU允许其他SMT线程在存储缓冲区中窥探退役存储:这可能导致不同的线程不同意来自其他线程的存储的全局顺序. 是否会有其他线程以相同的顺序看到两个原子写入不同线程中的不同位置?

脚注3:具有弱内存模型的非x86 CPU可以按任何顺序提交退役商店,允许将多个商店更积极地合并到同一行,并使得缓存未命中存储不会停止提交其他商店.

  • @pveentjer:是的,但是核心不能让任何其他加载或存储提交到该加载或存储之间的此缓存行或任何其他缓存行,否则它就不是*原子* RMW。`add [rdi], eax` 不是原子的,`lock add [rdi], eax` 是原子的。[num++ 对于“int num”可以是原子的吗?](/sf/ask/2757569531/)。从任何可以观察到差异的 POV 来看,加载和存储是对高速缓存行的同一单次访问(原子 RMW)的一部分。创建这种错觉需要微代码使用不属于正常内存目标指令的特殊微指令。 (2认同)

归档时间:

查看次数:

717 次

最近记录:

6 年,7 月 前