Write-Combining Buffer位于何处? 86

时间:2018-04-21 20:29:11

标签: x86 intel cpu-architecture cpu-cache amd-processor

Write-Combine缓冲区是如何物理连接的?我已经看到了说明许多变体的框图:

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

是否依赖于微架构?

2 个答案:

答案 0 :(得分:6)

在现代Intel CPU中,写入组合由LFB(行填充缓冲器)完成,也用于来自L1的其他待定传输。 L2。每个核心都有10个(自Nehalem以来)。 (Transfers between L2 and L3 use different buffers, called the "superqueue")。

这就是为什么英特尔建议在执行NT存储时避免过多的其他流量,以避免因分配LFB的需求负载导致部分填充的LFB的早期冲洗。  https://software.intel.com/en-us/articles/copying-accelerated-video-decode-frame-buffers

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

LFB的“外部”可以与L2通信或(可能有L2的帮助)通过环形总线/网格到内存控制器,或L3用于NT预取。对于L3和内存来说,离开核心可能并没有太大的不同;只是在核心之间的环/网状互连上发送不同类型的消息;在Intel CPU中,内存控制器是just another stop on the ring bus(在“系统代理”中),就像其他核心的L3片段一样。@BeeOnRope suggests L1 LFB不直接 连接到环形总线,并且不将数据放入L2的请求可能仍然通过L2超级缓冲区到达环形总线/网格。这似乎很可能,因此每个核心只需要在环形总线上存在一个点并且L2和L1之间的仲裁发生在核心内部。

NT存储数据直接从存储缓冲区进入LFB,并探测L1d以查看是否需要首先驱逐该行。

正常存储数据在从L1d驱逐时进入LFB,或者为分配新线路腾出空间,或者响应来自另一个想要读取该线路的核心的RFO。

在L1d中丢失的

正常加载(和存储)需要缓存来获取该行,该行还分配LFB以跟踪传入行(以及对L2的请求)。当数据到达时,它会直接发送到等待它的加载缓冲区,与将其放入L1d并行。 (在CPU体系结构术语中,请参阅"early restart" and "critical word first":缓存未命中仅阻塞,直到所需数据到达,其余缓存行“在后台”到达。)您(以及英特尔的CPU架构师)绝对不会我希望L2命中延迟包括将数据放入L1d并再次将其恢复。

来自WC内存(movntdqa)的NT加载直接从LFB读取;数据永远不会进入缓存。 LFB已经连接到加载端口以便提前重启正常负载,因此我认为SSE4能够在硅中添加movntdqa而无需额外的成本。特别之处在于,未命中只会直接从内存中填充LFB,绕过L3 / L2 / L1。 NT商店已经需要LFB才能与内存控制器通信。

答案 1 :(得分:3)

patent声明WC缓冲区确实是任何用'WC'标记的行填充缓冲区。

当前优选的实施例使用英特尔™架构微处理器中已经存在的结构,即填充缓冲区。填充缓冲区是一组多个具有字节粒度有效和脏位的高速缓存行的集合,乱序微处理器使用该高速缓存行来创建非阻塞高速缓存。 WC缓冲区是标记为允许合并WC存储的单个填充缓冲区。逐出后,WC填充缓冲区将等待,直到正常填充缓冲区被逐出。在当前优选实施例中,仅实现了一个写合并缓冲器。在物理上,任何填充缓冲区都可以用作写合并缓冲区。由于仅提供一个逻辑写合并缓冲区,因此当需要第二个写合并缓冲区时,将开始逐出过程

然后继续说WC缓冲区可以是WB类型也可以是USWC类型。在这里可能使用写合并缓冲区来表示“行填充缓冲区”,但我不这么认为,因为在它之前的句子中它使用它来引用WC缓冲区。

这使我相信WC并不是在谈论USWC内存,而WC只是行填充缓冲区的一个属性。在这种情况下,我想这是说一个LFB可用于合并来自存储缓冲区(可能是WB或USWC类型)的写操作,而其他LFB可用于在L1和L2与不允许商店打。

x86-64优化手册指出:“写合并缓冲区用于所有内存类型的存储”和“以Intel微体系结构代号Nehalem开始,有10个缓冲区可用于写合并”。我们知道nehalem有10个LFB,所以对我来说,可以将所有10个LFB标记为WC,如专利的图3所示(这恰好概述了一次只有一个LFB可以作为WC缓冲区的情况)。

它还指出“在对一级缓存的写入未命中时,它允许在从缓存/内存层次结构的更深层读取所有权(RFO)之前对该同一个缓存行进行多个存储。然后读取剩余的行,将尚未写入的字节与返回行中的未修改字节合并。当发生针对先前未写的缓存行的写合并缓冲区的写操作时,将拥有所有权的读取(RFO)。如果随后的写操作发生在另一个写合并缓冲区中,则可能对该高速缓存行产生单独的RFO。随后对第一缓存行和写入合并缓冲区的写入将被延迟,直到为第二RFO提供服务以保证对写入进行正确排序的可见性为止。如果写操作的内存类型是写合并,则不会存在RFO,因为该行未缓存​​,因此不会出现此类延迟。

写合并缓冲区似乎是LFB的特殊用例,它在发生RFO(*)时用于合并写操作,因此可以完成存储并可以释放存储缓冲区条目(如果有,则多个它们都写入同一缓存行)。有效位指示在到达E状态时合并到高速缓存行中的位。我对下一部分的解释是,如果发生写入第二高速缓存行的情况,那么为了再次写入第一行,它需要等到第一和第二LFB(顺序)写入L1d高速缓存。这是为了维护写入的全局可见性的正确顺序。我假设LFB在行出现在高速缓存中时就被转储到高速缓存中,并且所有写到该行之后的内容都直接写到高速缓存行中。

如果内存类型为USWC,则无需执行RFO,但是无论如何,写操作均分配给缓冲区。

由于PAT对虚拟地址进行操作,因此可能会出现别名。即同一物理页面可以具有多个不同的缓存策略。如果流存储(表示USWC写操作码WCiL(F))在L3高速缓存中命中,它将导致该行的QPI WBMtoI,然后根据SAD交织规则将其发送到正确的家乡代理,然后再发生USWC存储。大概L1 / L2高速缓存在存储通过时也会执行此操作,尽管如果只有一个核心具有副本,它可能留给L3逐出并写回该行。至于USWC的负载,我实际上并不知道。似乎没有单独的操作码,因此它可以在DRd请求中设置一个标志以指示它是非临时性的负载。我不确定L3高速缓存是否可以将别名高速缓存行转发给USWC读取请求,或者是否必须将其写回并且必须从DRAM满足读取请求(我说是DRAM,但是内存控制器也可能有一个存储加载转发机制,所以我应该说家乡代理)

我不确定“非临时提示”的存储/加载方式。英特尔第1卷手册似乎在说,存储缓冲区中的提示会强制L1d控制器将除WP和UC(-)以外的所有其他存储都解释为USWC,而提示不会更改负载策略,即不执行任何操作。提示在存储缓冲区中可能有额外的好处。在L1d控制器返回数据之前,内存调度程序不知道加载/存储的缓存策略,因此提示告诉它适用弱排序,并且可以更有效地调度它们。我认为非临时性写入可以与其他写入重新排序。

(*)我不知道S-> E请求是否导致写入的行填充缓冲区分配,或者是否可以立即将其写入高速缓存。我要说的是,它确实分配了LFB,因为如果它在发送S-> E请求时将其临时存储在高速缓存行中,则可能会丢失此数据,因为可能首先出现来自L3的响应另一个内核的无效请求。我说S-> E请求是因为我不知道这叫什么。可以将其封装为RFO数据包,但带有指示不需要读取的标志,也可以是定义冲突的所谓ItoM。有些资料称它为RFO,但是打算进行完整的高速缓存行写入,这意味着如果高速缓存处于I状态,则不需要读取。这也可能用于S-> E转换。它不是被称为S / I-> E,而是被称为ItoM来表示写该行的意图,但是我不知道为什么ItoE也不意味着这个。有趣的是,实际上有2种不同的UPI操作码用于多路缓存一致性,即InvItoE和InvItoM,两者都具有相同的描述例外,后者添加了“目的是在不久后执行写回操作”