写入组合缓冲区位于哪里?x86

写入组合缓冲区位于哪里?x86,x86,intel,cpu-architecture,cpu-cache,amd-processor,X86,Intel,Cpu Architecture,Cpu Cache,Amd Processor,写入合并缓冲区是如何物理连接的?我已经看到了说明许多变体的方框图: 在L1和内存控制器之间 在CPU的存储缓冲区和内存控制器之间 在CPU的AGU和/或存储单元之间 它依赖于微体系结构吗 在现代Intel CPU中,写合并由LFB(行填充缓冲区)完成,也用于从L1到L2的其他挂起传输。每个岩芯有10个(自Nehalem以来)。() 这就是为什么英特尔建议在进行NT存储时避免过多的其他流量,以避免因分配LFB的需求负载而导致的部分填充LFB的早期刷新。 LFB的“内部”连接到L1d、存储缓冲

写入合并缓冲区是如何物理连接的?我已经看到了说明许多变体的方框图:

  • 在L1和内存控制器之间
  • 在CPU的存储缓冲区和内存控制器之间
  • 在CPU的AGU和/或存储单元之间

它依赖于微体系结构吗

在现代Intel CPU中,写合并由LFB(行填充缓冲区)完成,也用于从L1到L2的其他挂起传输。每个岩芯有10个(自Nehalem以来)。()

这就是为什么英特尔建议在进行NT存储时避免过多的其他流量,以避免因分配LFB的需求负载而导致的部分填充LFB的早期刷新。

LFB的“内部”连接到L1d、存储缓冲区和加载端口。

LFB的“外部”可以与L2通信,或者(可能在L2的帮助下)通过环总线/网格到内存控制器,或者L3进行NT预取。对于L3和内存来说,脱离核心可能没有太大区别;只是在核心之间的环形/网状互连上发送不同类型的消息;在英特尔CPU中,内存控制器是(在“系统代理”中),就像其他具有L3片的内核一样。L1 LFB实际上没有直接连接到环总线,并且没有将数据放入L2的请求可能仍然通过L2超级队列缓冲区到达环总线/网格。这似乎是有可能的,因此每个内核只需要环总线上的一个存在点,并在L2和d L1发生在核心内部


NT store data直接从存储缓冲区输入LFB,并探测L1d以查看是否需要先逐出该行

正常存储数据从L1d移出时进入LFB,为分配的新行腾出空间,或响应另一个希望读取该行的内核的RFO

L1d中未命中的正常加载(和存储)需要缓存来获取该行,这也会分配一个LFB来跟踪传入的行(以及对L2的请求)。当数据到达时,它会直接发送到等待它的加载缓冲区,与将其放置在L1d中并行。(在CPU体系结构术语中,请参阅:缓存未命中只会阻塞,直到所需数据到达,其余缓存线“在后台”到达。)您(以及Intel的CPU架构师)肯定不希望二级命中延迟包括将数据放入L1d并再次取出


从WC内存加载NT(
movntdqa
)直接从LFB读取;数据根本不会进入缓存。LFB已经连接到加载端口,以便早期重新启动正常加载,因此SSE4能够添加
movntdqa
,而无需大量额外的硅成本。但它的特殊之处在于,未命中只会直接从内存填充LFB,绕过L3/L2/L1.NT存储区已经需要LFB才能与内存控制器通信。

写入缓冲区可以有不同的用途或在不同的处理器中有不同的用途。这个答案可能不适用于未特别提及的处理器。我想强调的是,“写入缓冲区”一词“在不同的背景下,可能意味着不同的事情。这个答案仅适用于英特尔和AMD处理器

英特尔处理器上的写组合缓冲区 每个缓存可能伴随零个或多个行填充缓冲区(也称为填充缓冲区)。二级缓存的填充缓冲区集合称为超级队列或超级队列(超级队列中的每个条目都是填充缓冲区)。如果缓存在逻辑核心或物理核心之间共享,则相关的填充缓冲区也在核心之间共享。每个填充缓冲区可以保存单个缓存线和描述缓存线的附加信息(如果已占用)包括缓存线地址、内存类型和一组有效位,其中位数取决于跟踪缓存线各个字节的粒度。在早期处理器(如)中,只有一个填充缓冲区能够进行写合并(和写折叠).随着处理器的更新,线路缓冲区和能够进行写合并的线路缓冲区的总数稳步增加

Nehalem到Broadwell在每个一级数据缓存中都包含10个填充缓冲区。Core和Core2每个物理核心有8个LFB。根据,Skylake上有12个LFB。@BeeOnRope观察到Cannon Lake上有20个LFB。我在手册中找不到明确的陈述,说明LFB与所有这些微体系结构上的WCB相同。然而,英特尔的一位人士写道:

请参阅《英特尔64和IA-32体系结构优化参考》 特定处理器中填充缓冲区数量的手册; 通常数字是8到10。请注意,有时这些数字也是 称为“写入组合缓冲区”,因为在一些较旧的 处理器仅支持流媒体存储

我认为LFB一词最初是由Intel在Intel Core微体系结构中引入的,在该微体系结构上,所有8个LFB都是WCB。基本上,Intel当时偷偷地将WCB重命名为LFB,但此后在其手册中没有对此进行澄清

同一句话还说,WCB一词在较旧的处理器上使用,因为它们不支持流式加载。这可以解释为LFB也被流式加载请求使用(
MOVNTDQA
).但是,第12.10.3节指出,流式加载将目标行提取到称为流式加载缓冲区的缓冲区中,这显然与LFB/WCB在物理上不同

在以下情况下使用行填充缓冲区:

(1)缓存中的加载未命中(请求或预取)会分配一个填充缓冲区。如果没有可用的填充缓冲区,加载请求会不断堆积在加载缓冲区中,甚至