为什么Ice Lake不像tremont那样有MOVDIRx?他们已经有更好的了吗?

Why doesn't Ice Lake have MOVDIRx like tremont? Do they already have better ones?

我注意到英特尔 Tremont 有 64 字节存储指令 MOVDIRI and MOVDIR64B.
这些保证原子写入内存,而保证加载原子性。此外,写入顺序较弱,可能需要紧随其后的防护。
我在 IceLake 中找不到 MOVDIRx

为什么 Ice Lake 不需要像 MOVDIRx?
这样的指令
(第 15 页底部)
英特尔® 架构指令集扩展和未来功能编程参考
https://software.intel.com/sites/default/files/managed/c5/15/architecture-instruction-set-extensions-programming-reference.pdf#page=15

Ice Lake 有 AVX512,它给我们 64 字节加载 + 存储,但不能保证 64 字节存储的原子性。

我们用 movntps [mem], zmm / movntdq [mem], zmm 得到了 64 字节的 NT 存储。有趣的是,NT 存储不支持合并屏蔽以保留一些未写入的字节。不过,这基本上会通过创建部分行写入来破坏 NT 存储的目的。

可能 Ice Lake Pentium / Celeron CPUs 仍然没有 AVX1/2,更不用说 AVX512(可能他们可以出售 FMA 单元的高 128 位有缺陷的芯片 and/or 在至少一个核心上注册文件),因此只有 rep movsb 能够在那些 CPU 上内部使用 64 字节 loads/stores。 (IceLake 将具有 "fast short rep" 功能,这可能使它甚至对 64 字节的小副本也很有用,在不能使用向量 regs 的内核代码中很有用。)


可能英特尔不能(或不想)在他们的主流 CPUs 上提供原子性保证,只有在不支持的低功耗芯片上不支持多个套接字,但我还没有听到任何关于英特尔 CPUs 缓存行中实际存在撕裂的报告。实际上,我认为在 当前 Intel CPU 上不跨越缓存行边界的缓存 loads/stores 始终是原子的。

(与 AMD K10 不同,在 AMD K10 上,HyperTransport 确实在插槽之间的 8B 边界上造成撕裂,而在单个插槽上的内核之间看不到撕裂。 SSE instructions: which CPUs can do atomic 16B memory operations?)

反正用CPUID是没办法检测出来的,也没有文档记载,所以想安全利用基本上是不可能的。如果有一个 CPUID 叶告诉您系统的原子性宽度和单个套接字内的原子性宽度,那就太好了,因此仍然允许将 512 位 AVX512 操作拆分为 256 位两半的实现。 ...

无论如何,与其引入保证存储原子性的特殊指令,我认为 CPU 供应商更有可能开始记录并提供 CPUID 检测更广泛的存储原子性所有 2 次方大小的商店,或仅适用于 NT 商店,或其他东西。

让 AVX512 的某些部分需要 64 字节原子性将使 AMD 更难支持,如果他们遵循他们当前的半角矢量实现策略。 (Zen2 将具有 256 位矢量 ALU,使 AVX1/AVX2 指令主要是单 uop,但不幸的是,据报道它不会支持 AVX512。AVX512 是一个非常好的 ISA,即使你只在 256 位上使用它宽度,填补更多可以方便/高效完成的空白,例如 unsigned int<->FP 和 [u]int64<->double.)

所以 IDK 如果英特尔 同意 不这样做,或者出于他们自己的原因选择不这样做。


64B 写原子性的用例:

我怀疑主要用例可靠地创建 64 字节 PCIe 事务,实际上"atomicity" 本身不是,也不是为了另一个内核观察。

如果您关心从其他内核读取数据,通常您会希望 L3 缓存支持数据,而不是将其绕过 DRAM。 seqlock 可能是一种在 CPU 内核之间模拟 64 字节原子性的更快方法,即使 movdir64B 可用。

Skylake 已经有 12 个写入组合缓冲区(Haswell 有 10 个),因此(也许?)使用常规 NT 存储创建全尺寸 PCIe 事务并避免早期刷新并不难。但也许低功耗 CPU 具有更少的缓冲区,并且可靠地向 NIC 缓冲区或其他东西创建 64B 事务可能是一个挑战。

Why doesn't Ice Lake need such instructions like MOVDIRx?

我不会尝试从需求的角度来回答这个问题,而是指令集架构特性和英特尔产品开发方式的实际结果。

来自之前的回答:

Possibly Intel can't (or doesn't want to) provide that atomicity guarantee on their mainstream CPUs,

https://software.intel.com/sites/default/files/managed/c5/15/architecture-instruction-set-extensions-programming-reference.pdf 在 Table 1-1 中表示这些指令将在一系列微体系结构中得到支持:

"Direct stores: MOVDIRI, MOVDIR64B Tremont, Tiger Lake, Sapphire Rapids"

Tiger Lake 被宣布为 "the newest Intel® Core™ mobile processors" https://newsroom.intel.com/news-releases/intel-ces-2020/.

Sapphire Rapids 在 https://newsroom.intel.com/news-releases/intel-unveils-new-gpu-architecture-optimized-for-hpc-ai-oneapi/. See also https://s21.q4cdn.com/600692695/files/doc_presentations/2019/05/2019-Intel-Investor-Meeting-Shenoy.pdf 上被描述为“基于 10 纳米的英特尔® 至强® 可扩展处理器”。

免责声明:我在英特尔工作,只会引用和讨论官方资源。