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

问题描述 投票:3回答:1

我注意到英特尔Tremont有MOVDIRIMOVDIR64B的64字节存储指令。 这些保证原子写入内存,而不保证负载原子性。此外,写入是微弱的顺序,紧接着可能需要围栏。 我在IceLake找不到MOVDIRx。 冰湖为什么不需要像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个回答
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字节副本也很有用,在无法使用向量寄存器的内核代码中非常有用。)


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

(与AMD K10不同,HyperTransport确实在套接字之间的8B边界上撕裂,而单个插槽上的核心之间没有撕裂.SSE instructions: which CPUs can do atomic 16B memory operations?

在任何情况下,都无法使用CPUID检测到这一点,并且没有记录,因此基本上不可能安全地利用它。如果有一个CPUID叶子告诉你系统的原子性宽度和单个套接字,那将是很好的,所以仍然允许将512位AVX512操作分成256位的实现....

无论如何,我认为CPU厂商更有可能开始记录并为所有2-power-of-size商店或仅NT提供更大存储原子性的CPUID检测。商店或其他东西。

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

因此IDK可能会同意不这样做,或者选择不是出于自己的原因。


64B写入原子性的用例:

我怀疑主要用例是可靠地创建64字节PCIe事务,实际上不是“原子性”本身,而不是由另一个核心观察。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.