【问题标题】:Why doesn't Ice Lake have MOVDIRx like tremont? Do they already have better ones?为什么 Ice Lake 没有像 tremont 这样的 MOVDIRx?他们已经有更好的了吗?
【发布时间】:2019-07-21 23:45:36
【问题描述】:

我注意到英特尔 Tremont 有 64 字节的存储指令,带有 MOVDIRIMOVDIR64B
这些保证原子写入内存,而 保证负载原子性。此外,写入是弱排序的,可能需要立即进行屏蔽。
我在 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

【问题讨论】:

    标签: assembly x86 intel cpu-architecture instruction-set


    【解决方案1】:

    为什么 Ice Lake 不需要像 MOVDIRx 这样的指令?

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

    来自上一个答案:

    英特尔可能无法(或不想)在其主流 CPU 上提供原子性保证,

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

    “直营店:MOVDIRI、MOVDIR64B Tremont、Tiger Lake、Sapphire Rapids”

    Tiger Lake 被宣布为“最新的英特尔® 酷睿™ 移动处理器” 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/ 上被描述为“基于 10 纳米的英特尔® 至强® 可扩展处理器”。另见https://s21.q4cdn.com/600692695/files/doc_presentations/2019/05/2019-Intel-Investor-Meeting-Shenoy.pdf

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

    【讨论】:

    • 哦,太好了,我希望这些指令最终会出现在主流的 SnB 系列 CPU 中。仍然太糟糕了,我们没有 AFAIK 获得任何真正的 AVX512 64 字节普通存储的原子性保证,只能通过这个 movdir64b NT 存储。
    • 没有任何保证,因为这样做会限制实现的灵活性。如果您查看rigtorp.se/isatomic,您会发现在实践中观察到的原子性是 CPU 管道中数据路径宽度的函数,或者类似的东西。
    • 我希望有一个 CPUID 功能标志(与 AVX512F 分开),它可以让软件检测 16、32 和/或 64 字节对齐的加载/存储是否保证是原子的。这样软件可以利用,例如对于std::atomic<16B_struct> 加载或存储。 (GCC7 及更高版本将这些访问编译为对 libatomic 辅助函数的调用,因此动态链接器符号解析可以检查一次目标函数是否可以是使用 SSE 的函数,或者锁定 cmpxchg16b。)
    • 这仍然可以让 CPU 实现 AVX512,方法是将 512 位指令拆分为 2 或 4 个微指令(AMD 风格)或 2 个周期用于加载或存储数据端口中的单个微指令(Sandybridge 风格) ;他们只会宣传普通可缓存加载/存储的原子性,仅与它们实际提供的一样宽。但这可能需要 CPUID 报告取决于内核之间互连的某些内容,具体取决于它的工作方式。例如注意仅在 K10 Opteron Why is integer assignment on a naturally aligned variable atomic on x86? 中的套接字之间的 16 字节撕裂)
    • 谢谢。这是个好消息!我很想在主流笔记本电脑中看到这款 x86 big.LITTLE 与 Cupertino 的 2021 年夏季 mbp 相抗衡。如果你能兑现承诺。 ?
    【解决方案2】:

    Ice Lake 有 AVX512,它为我们提供了 64 字节的加载和存储,但不能保证 64 字节的存储原子性。

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

    Ice Lake Pentium / Celeron CPU 可能仍然没有 AVX1/2,更不用说 AVX512(可能是为了销售在 FMA 单元的高 128 位和/或至少一个内核上注册文件存在缺陷的芯片),因此只有 rep movsb 能够在这些 CPU 上内部使用 64 字节加载/存储。 (IceLake 将具有“快速短表示”功能,这可能使其即使对于小的 64 字节副本也很有用,在不能使用向量 reg 的内核代码中很有用。)


    可能英特尔不能(或不想)在其主流 CPU 上提供原子性保证,仅在不支持多个插槽的低功耗芯片上提供,但我没有没有听到任何关于英特尔 CPU 缓存行中实际存在撕裂的报告。在实践中,我认为在当前英特尔 CPU 上不跨越缓存线边界的缓存加载/存储始终是原子的。

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

    无论如何,使用 CPUID 无法检测到这一点,并且没有记录在案,因此基本上不可能安全地利用它。如果有一个 CPUID 叶告诉您系统和单个套接字内的原子性宽度,那就太好了,因此仍然允许将 512 位 AVX512 操作分成 256 位两半的实现....

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

    如果 AMD 遵循其当前的半角向量实现策略,则使 AVX512 的某些部分需要 64 字节原子性将使 AMD 难以支持。 (Zen2 将具有 256 位向量 ALU,使 AVX1/AVX2 指令主要是单 uop,但不幸的是,据报道它不会支持 AVX512。AVX512 是一个非常好的 ISA,即使您只以 256 位宽度使用它,填补了可以方便/有效地完成的更多空白,例如 unsigned intFP 和 [u]int64double。)

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


    64B 写入原子性用例:

    我怀疑主要用例是可靠地创建 64 字节 PCIe 事务,实际上并不是“原子性”本身,也不是供其他内核观察的。

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

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

    【讨论】:

    • 真的需要 64B 原子性吗?我的意思是,您通常只需要原子写入/读取,以便信号量/自旋锁标志在线程之间同步或在它们之间传递新的数据集,所以实际上ptr_t atomicity(在 64b 中已经是 8B :-o )是 IMO 所有人实际应该需要。如果需要更多,我想应该有一些相当简单的方法将该设计转换为只需要 flag/ptr_t 的东西(这更像是问题,而不是声称)。所以也许这是没有太多推动引入此类指令的另一个原因......
    • @Ped7g:任何你会为 (Implementing 64 bit atomic counter with 32 bit atomics) 使用 seqlock 的用例,例如128 位计数器或时间戳,仅使用 128 位原子存储/加载会更便宜。或者更大的数据结构。 How can I implement ABA counter with c++11 CAS? 还展示了一些笨拙的联合黑客,让 GCC not 使用 lock cmpxchg16b 来执行 16 字节的原子加载,而我们真的只需要低半部分。 (不过,在这种情况下,我们仍然需要一个 DWCAS 来更新;不仅仅是一个纯粹的存储。)
    • @Ped7g:更新进一步考虑,我敢打赌实际用例是创建 64 字节 PCIe 事务。
    • 好吧,新的 AVX 商店不支持合并屏蔽(太糟糕了),但有 curious case of MOVMASKDQU,它支持。然而,它被最新的扩展留下了,所以我不确定它的效率会有多高。我猜屏蔽存储更难支持:你不能只将整行发送到 RAM,你要么需要一直到 DRAM 的屏蔽功能,要么必须在 some 处读取它i> 指向然后进行合并并将其写回。
    • 现代 DIMM 和协议以及内存控制器针对整行的突发传输进行了优化,因此即使屏蔽写入可以一直到 RAM,它们也可能很慢。
    猜你喜欢
    • 1970-01-01
    • 2011-04-09
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多