5

非临时存储(例如 movnti)是否由同一线程发布到同一缓存行,按程序顺序到达内存?

因此对于具有 NVRAM 的系统(例如具有 Intel 3D XPoint NVRAM 的 Intel Cascade Lake 处理器),在发生崩溃的情况下,缺乏重新排序可以保证写入同一缓存行的前缀占上风?

4

1 回答 1

3

假设非临时存储的已解析内存类型是 WC(或 WC+),这就是我认为您要问的问题,答案大多不在 Intel 和 AMD 处理器上。

对于英特尔处理器,英特尔 SDM V2 的第 11.3.1 节中的某些语句指定了在具有至少一个 WC 缓冲区的微架构上的写组合写行为。

清除 WC 缓冲区的协议是依赖于实现的,并且不应被软件依赖于系统内存一致性。

这是一个一般性声明,表示 WC 驱逐的原因和为驱逐 WC 缓冲区而执行的事务取决于实现。但是在手册的不同地方都有具体的说明。

同样 [如 P6 上],对于从基于 Intel NetBurst 微架构的处理器开始的更新的处理器,完整的 WC 缓冲区将始终作为单个突发事务传播,使用事务中的任何块顺序。

如果同一个 WC 缓冲区中的所有字节都是有效的,这意味着自分配缓冲区以来每个字节至少被写入一次,当缓冲区因任何原因被驱逐时,缓冲区中的整个缓存行将使用单个事务被驱逐. 如果缓冲区的目标是内存控制器,它是 CLX 上持久性域中的第一个单元,则事务的所有字节都被持久化,或者没有字节。这意味着保持已写入该行的写指令的程序顺序。这些特定写入和其他写入之间的顺序将在后面讨论。

当事务的目标是内存控制器时,此上下文中的“在事务中使用任何块顺序”部分从软件的角度来看并不重要,但对于其他目标很重要。

Intel 已将块大小指定为在所有微架构上对齐 8 个字节。此块大小仅适用于核心和非核心互连,但不适用于实现其他协议的范围。但是对于针对 IMC 的写入,持久原子性在事务的粒度上得到保证,事务的粒度可能包含 1 到 64 个字节(所有现代 Intel 和 AMD 处理器上 WC 缓冲区的大小为 64 个字节),具体取决于缓冲区被驱逐时有效字节在同一 WC 缓冲区内的分布,具体取决于确切的驱逐协议。在 Intel 处理器上,保证事务包含所有 64 个有效字节,以防 WC 缓冲区被完全驱逐。

AMD 手册只说完整的 WC 缓冲区驱逐可以作为单个事务执行。

以下引用指定了部分 WC 缓冲区驱逐(并非所有字节在缓冲区中都被标记为有效)的情况下的顺序保证以及不同 WC 缓冲区中的写入之间的顺序。它适用于 Intel 和 AMD 处理器。

一旦 WC 缓冲区的逐出开始,数据就会受到其定义的弱排序语义的影响。

该段的其余部分继续详细说明。可以使用一个或多个事务来驱逐部分 WC 缓冲区,并且这些事务之间没有顺序保证。一旦写指令被提交到 WC 缓冲区,它在程序顺序中的位置就完全丢失了。如果这些事务的目标是 IMC,则仅在单个事务的粒度上提供持久原子性。这就是具有有效内存类型 WC 的写入如何在不持久化早期 WC 写入的情况下持久化的方式。如果不同的写指令在同一个 WC 缓冲区内部分重叠,则相对于同一 WC 缓冲区中的其他写操作而言,一条写指令可能会变得部分持久化。WC 缓冲区中跨越块边界的写操作在架构上不能保证是原子的,

WC 缓冲区可以按与缓冲区分配顺序不同的顺序被逐出。Fence 指令不能用于选择性地刷新 WC 缓冲区。但是,除了 WC 之外的任何类型的写入(其中存在重叠分配的 WC 缓冲区)都会导致该缓冲区在执行写入之前被逐出。在 WCB 中命中的负载可能不会导致缓冲区被驱逐。

为刷新单个 WC 缓冲区而发生的事务不一定相对于为刷新同一物理内核中的另一个 WC 缓冲区而发生的事务进行排序。即使 WC 逐出逻辑被实现为串行逐出 WC 缓冲区(这很可能),也不能保证来自不同 WC 缓冲区的事务最终不会在物理核心域之外交错。

这一切都意味着,即使在同一个物理内核中,同一 WC 缓冲区和不同 WC 缓冲区的不同块之间也不能保证持久排序。

导致 WC 缓冲区被驱逐的事件可能在供应商和来自同一供应商的处理器之间有所不同。一些事件是架构性的(记录在开发人员手册中),而其他事件是特定于实现的(记录在数据表中)。存储序列化指令是同步事件的一个示例,它确实保证刷新同一逻辑内核上的所有 WC 缓冲区。传递到逻辑核心的硬件中断是异步事件的一个示例,它也会导致其所有 WC 缓冲区被逐出。此外,每个物理或逻辑内核的 WC 缓冲区数量取决于实现,可能为零。WC 缓冲区的大小也取决于实现,从架构上讲,它可能大于或小于 L1D 高速缓存行的大小。

因此,即使您只编写完整的 WC 缓冲区,也无法确保 WC 缓冲区仅在其满时才被逐出以保持原子性,即使在使用单个事务执行完整 WC 逐出的 Intel 处理器上也是如此.

MOVDIR64B您可以使用来保证原子性,而不是执行多个 WC 写指令。MOVDIR64B不分配 WC 缓冲区并直接到达目的地,但它可能与已分配的 WC 缓冲区合并,在这种情况下,缓冲区在合并缓冲区的现有内容和MOVDIR64B. 在任何情况下, 的写操作MOVDIR64B始终作为单个事务执行。请注意,目标内存操作数MOVDIR64B需要在 64 字节边界上对齐。与传统的 WC 商店类似,MOVDIR64B与除 UC 之外的任何其他商店一样弱排序。MOVDIR64B在 TNT、TGL 和 SPR 上受支持。

WC/WC+ 写入不针对除 Intel 和 AMD 处理器上的 UC 之外的任何内存类型的其他写入进行排序。此外,跨越对齐的 8 字节边界的任何内存类型的单个写入指令(或写入物理内存地址空间的指令)本身不能保证在超过对齐的 8 字节的粒度上是原子的。这包括持久原子性。唯一的例外是MOVDIR64B,ENQCMDENQCMDS。最后两个在进行 MMIO 写入时是相关的。对齐的 64 字节 AVX-512 存储可能是持久原子的,但这在架构上没有保证,不应依赖。

于 2021-04-02T15:14:12.040 回答