微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

(Persistence) 将 Intel 非临时存储排序到同一高速缓存行

如何解决(Persistence) 将 Intel 非临时存储排序到同一高速缓存行

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

因此,对于具有 NVRAM 的系统(例如具有英特尔 3D XPoint NVRAM 的英特尔 Cascade Lake 处理器),在发生崩溃时,缺少重新排序保证了写入的 前缀相同的缓存行占优势?

解决方法

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

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

驱逐 WC 缓冲区的协议取决于实现 不应依赖软件来保证系统内存的一致性。

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

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

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

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

英特尔已将所有微架构上的块大小指定为 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 缓冲区中跨越块边界的写入操作在架构上不能保证是原子的,除非在合并写入后缓冲区完全满(在 Intel 处理器上)。

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

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

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

导致 WC 缓冲区被逐出的事件可能因供应商和来自同一供应商的处理器而异。一些事件是架构性的(记录在开发人员手册中),而其他事件是特定于实现的(记录在数据表中)。存储序列化指令是同步事件的一个例子,它保证刷新同一逻辑核心上的所有 WC 缓冲区。传递到逻辑内核的硬件中断是异步事件的一个示例,该事件也会导致其所有 WC 缓冲区被逐出。此外,每个物理或逻辑核心的 WC 缓冲区数量取决于实现,并且可能为零。 WC 缓冲区的大小也与实现相关,从架构上讲,可能大于或小于 L1D 缓存线的大小。除了结合 WC 写入之外,WC 缓冲区还可用于多种用途,具体取决于微架构。

因此,即使您只写入完整的 WC 缓冲区,也无法确保仅在 WC 缓冲区变满时才将其驱逐以实现持久原子性,即使在使用执行完整 WC 驱逐的 Intel 处理器上单笔交易。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。