gpt4 book ai didi

x86 - 写合并缓冲区在哪里? x86

转载 作者:行者123 更新时间:2023-12-01 19:29:51 26 4
gpt4 key购买 nike

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

L1和内存 Controller 之间的

  • 在CPU的存储缓冲区和内存 Controller
  • 之间
  • 在CPU的AGU和/或存储单元之间

  • 它是否依赖于微体系结构?

    最佳答案

    写缓冲区在不同处理器中可以具有不同的用途或不同的用途。此答案可能不适用于未特别提及的处理器。我想强调一下,“写缓冲区”一词在不同的上下文中可能意味着不同的东西。该答案仅与Intel和AMD处理器有关。

    英特尔处理器上的写合并缓冲区

    每个高速缓存可能伴随着零个或多个行填充缓冲区(也称为填充缓冲区)。 L2处的填充缓冲区的集合称为 super 队列或超队列( super 队列中的每个条目都是一个填充缓冲区)。如果高速缓存是在逻辑核心或物理核心之间共享的,则相关的填充缓冲区也将在核心之间共享。每个填充缓冲区可以容纳单个高速缓存行以及描述高速缓存行(如果已被占用)的其他信息,包括高速缓存行的地址,内存类型和一组有效位,其中位数取决于跟踪缓存行的各个字节。在早期处理器(例如Pentium II)中,只有一个填充缓冲区能够进行写合并(和写折叠)。随着新型处理器的出现,行缓冲区和能够进行写合并的缓冲区的总数稳步增长。

    直到Broadwell的Nehalem在每个L1数据高速缓存中都包含10个填充缓冲区。核心和核心2每个物理核心具有8个LFB。根据this的说明,Skylake上有12个LFB。 @BeeOnRope已观察到Cannon湖上有20个LFB。我在手册中找不到明确的说法,说所有这些微体系结构中的LFB与WCB相同。但是,Intel的一位人士写的这首article表示:

    Consult the Intel® 64 and IA-32 Architectures Optimization Reference Manual for the number of fill buffers in a particular processor; typically the number is 8 to 10. Note that sometimes these are also referred to as "Write Combining Buffers", since on some older processors only streaming stores were supported.



    我认为LFB是Intel最初在Intel Core微体系结构中引入的,所有8个LFB也是WCB。基本上,英特尔当时偷偷地将WCB重命名为LFB,但此后一直未在其手册中加以澄清。

    相同的引用还表示,术语WCB用于较旧的处理器,因为它们不支持流负载。可以将其解释为,流负载请求( MOVNTDQA)也使用LFB。但是,第12.10.3节说,流负载将目标行提取到称为流负载缓冲区的缓冲区中,这显然在物理上不同于LFB/WCB。

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

    (1)在缓存中的加载未命中(需求或预取)上分配了填充缓冲区。如果没有可用的填充缓冲区,则加载请求将继续堆积在加载缓冲区中,这最终可能导致停滞发布阶段。在有加载请求的情况下,分配的填充缓冲区用于临时保存来自内存层次结构较低层的请求的行,直到它们可以被写入高速缓存数据阵列为止。但是,即使尚未将高速缓存行的请求部分写入高速缓存数据阵列,也可以将其提供给目标寄存器。根据 Patrick Fay (Intel):

    If you search for 'fill buffer' in the PDF you can see that the Line fill buffer (LFB) is allocated after an L1D miss. The LFB holds the data as it comes in to satisfy the L1D miss but before all the data is ready tobe written to the L1D cache.



    (2)在可缓存存储区上将填充缓冲区分配给L1缓存,并且目标行未处于允许修改的一致性状态。我的理解是,对于可缓存存储,只有RFO请求保留在LFB中,但是要存储的数据在存储缓冲区中等待,直到将目标行提取到为其分配的LFB条目中。英特尔优化手册的第2.4.5.2节中的以下语句支持此要求:

    The L1 DCache can maintain up to 64 load micro-ops from allocation until retirement. It can maintain up to 36 store operations from allocation until the store value is committed to the cache, or written to the line fill buffers (LFB) in the case of non-temporal stores.



    这表明如果目标行不在L1D中,则可缓存存储区不会提交给LFB。换句话说,存储必须在存储缓冲区中等待,直到将目标行写入LFB,然后在LFB中修改该行,或者将目标行写入L1D,然后对该行进行了修改。在L1D中。

    (3)填充行分配到L1高速缓存中不可缓存的写合并存储上,而不管该行是处于高速缓存中还是其相干状态。可以将在同一高速缓存行中的WC存储合并并折叠(在同一行中对同一位置的多次写入将使程序顺序中的最后一个存储在全局可观察之前覆盖以前的存储)。当前在LFB中分配的请求之间的顺序未保持。因此,如果有两个使用中的WCB,则不能保证首先将其驱逐出去,而与程序顺序有关的存储顺序无关。这就是为什么即使所有商店都按顺序退役后,WC商店也可能变得在全局范围内乱序观察的原因(尽管WC协议(protocol)允许WC商店不按顺序提交)。此外,WCB不会被监听,因此只有在到达内存 Controller 时才可以全局观察。可以在Intel手册V3的11.3.1节中找到更多信息。

    有些 some AMD processors使用与非临时存储的填充缓冲区分开的缓冲区。在P6中(第一个实现WCB的)和P4中还有许多WCB缓冲区专用于WC内存类型(不能用于其他内存类型)。在P4的早期版本中,有4个这样的缓冲区。对于支持超线程的P4版本,启用超线程并且两个逻辑内核都在运行时,WCB会在两个逻辑内核之间进行静态分区。但是,现代的英特尔微体系结构竞争性地共享了所有LFB,但是我认为每个逻辑内核至少要有一个可用,以防止饥饿。

    (4) L1D_PEND_MISS.FB_FULL的文档指示UC存储区分配在相同的LFB中(无论该行处于高速缓存还是其一致性状态)。像可缓存存储区一样,但与WC不同,UC存储区不在LFB中合并。

    (5)我实验上观察到,在LFB中也分配了来自 INOUT指令的请求。有关更多信息,请参见: How do Intel CPUs that use the ring bus topology decode and handle port I/O operations

    附加信息:

    填充缓冲区由高速缓存 Controller 管理,该高速缓存 Controller 连接到其他级别的其他高速缓存 Controller (如果是LLC,则连接到内存 Controller )。当请求命中高速缓存时,不会分配填充缓冲区。因此,在缓存中命中的存储请求直接在缓存中执行,而在缓存中命中的加载请求直接从缓存中得到服务。从缓存中逐出一行时,不会分配填充缓冲区。逐出的行将写入其自己的缓冲区(称为回写缓冲区或逐出缓冲区)。这是Intel的 patent,讨论I/O写入的写入梳理。

    我进行了一个与我描述的 here非常相似的实验,以确定即使同一行有多个负载,是否也分配了一个LFB。事实证明确实如此。在回写L1D高速缓存中未命中的行的第一个负载将获得为其分配的LFB。以后所有对同一高速缓存行的加载都将被阻止,并在其相应的加载缓冲区条目中写入一个阻止代码,以指示它们正在等待该LFB中保持的同一请求。当数据到达时,L1D缓存将唤醒信号发送到加载缓冲区,并且在该行上等待的所有条目都被唤醒(无阻塞),并计划在至少一个加载端口可用时发布到L1D缓存。显然,内存调度程序必须在未阻塞的负载和刚从RS分派(dispatch)的负载之间进行选择。如果在所有等待负载得到维修之前,由于某种原因将该线路逐出,则将再次阻塞它们,并再次为该线路分配LFB。我没有测试过商店的情况,但是我认为无论操作如何,都会为一条生产线分配一个LFB。可以根据需要将LFB中的请求类型从预取提升为需求负载,将推测性RFO提升为需求RFO。我还凭经验发现,在刷新管道时,不会删除在错误的路径上由uops发出的推测性请求。它们可能会降级以预取请求。我不确定。

    AMD处理器上的写合并缓冲区

    我以前根据 article提到过,有些AMD处理器使用的缓冲区与非临时存储的填充缓冲区分开。我引用这篇文章:

    On the older AMD processors (K8 and Family 10h), non-temporal stores used a set of four “write-combining registers” that were independent of the eight buffers used for L1 data cache misses.



    “在较旧的AMD处理器上”部分使我感到好奇。较新的AMD处理器是否发生了变化?在我看来,这在所有较新的AMD处理器(包括最新的Family 17h处理器(Zen))上仍然适用。 Zen mircoarchitecture上的WikiChip article包含两个提及WC缓冲区的图形: thisthis。在第一个图中,尚不清楚如何使用WCB。但是,在第二篇中,很明显,所示的WCB实际上确实是用于NT写入的(WCB和L1数据高速缓存之间没有连接)。第二个数字的来源似乎是 slides1。我认为第一个数字是由WikiChip制作的(这说明了为什么将WCB放置在不确定的位置)。实际上,WikiChip文章并未提及WCB。但是,仍然可以通过查看 Software Optimization Guide for AMD Family 17h Processors手册中的图7和 patent中的Family 17h处理器的加载和存储队列来确认所示的WCB仅用于NT写操作。 AMD优化手册指出,现代AMD处理器中每个内核有4个WCB。我认为这适用于K8和所有更高版本的处理器。不幸的是,没有提到起到英特尔填充缓冲区作用的AMD缓冲区。

    迈克尔·克拉克(Michael Clark), 1,2016。

    关于x86 - 写合并缓冲区在哪里? x86,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49959963/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com