为什么英特尔不以更兼容或更通用的方式设计其 SIMD ISA?

Why doesn't Intel design its SIMD ISAs in a more compatible or universal way?

Intel 在 Xeon Phi 上有多个 SIMD ISA,例如 SSE、AVX、AVX2、AVX-512 和 IMCI。这些 ISA 在不同的处理器上受支持。例如,AVX-512 BW、AVX-512 DQ 和 AVX-512 VL 仅在 Skylake 上受支持,但在 Xeon Phi 上不受支持。 Skylake 和 Xeon Phi 均支持 AVX-512F、AVX-512 CDI、AVX-512 ERI 和 AVX-512 PFI。

为什么英特尔不设计一个更通用的 SIMD ISA,可以 运行 在其所有高级处理器上?

此外,英特尔在开发 ISA 时删除了一些内在函数并添加了新的内在函数。很多内在函数有很多味道。例如,一些在压缩 8 位上工作,而一些在压缩 64 位上工作。某些口味未得到广泛支持。例如,Xeon Phi 不具备处理打包的 8 位值的能力。然而,Skylake 将拥有这个。

为什么英特尔以如此不一致的方式更改其 SIMD 内在函数?

如果 SIMD ISA 彼此更加兼容,则可以更轻松地将现有的 AVX 代码移植到 AVX-512。

我认为原因有三。

(1) 当他们最初 designed MMX 时,他们可以使用的区域很小,所以尽可能简单。他们还以与现有 x86 ISA 完全兼容的方式实现了这一点(精确中断 + 上下文切换时的一些状态保存)。他们没有预料到他们会不断地扩大 SIMD 寄存器宽度并添加这么多指令。每一代人在添加更宽的 SIMD 寄存器和更复杂的指令时,他们都必须维护旧的 ISA 以实现兼容性。

(2) 你在 AVX-512 上看到的这个奇怪的事情是因为他们试图统一两个不同的产品线。 Skylake 来自 Intel 的 PC/server 系列,因此它们的路径可以看作是 MMX -> SSE/2/3/4 -> AVX -> AVX2 -> AVX-512。 Xeon Phi 基于名为 Larrabee 的 x86 兼容显卡,该显卡使用 LRBni 指令集。这或多或少与 AVX-512 相同,但指令较少且与 MMX/SSE/AVX/etc...

不正式兼容

(3) 他们针对不同的人群提供不同的产品。例如,(据我所知)AVX-512 CD 指令在用于 PC 的常规 SkyLake 处理器中不可用,仅在用于服务器的 SkyLake Xeon 处理器以及用于 HPC 的 Xeon Phi 中可用。我可以在一定程度上理解这一点,因为 CD 扩展针对的是平行直方图生成;这种情况在 servers/HPC 中比在通用 PC 中更可能成为关键热点。

我同意这有点乱。英特尔 开始看到曙光并更好地规划额外的扩展;据推测,AVX-512 已准备好在下一代中扩展到 1024 位。不幸的是,它仍然不够好,Agner Fog discusses this on the Intel Forums.

对我来说,我希望看到一个可以升级的模型,而无需用户每次都重新编译他们的代码。例如,与其在 ISA 中将 AVX 寄存器定义为 512 位,不如将其作为存储在微体系结构中并可由程序员在运行时检索的参数。用户询问 这台机器上可用的最大 SIMD 宽度是多少?,架构 returns XYZ,用户有通用的控制流来处理任何问题XYZ 是。这将比当前技术更清晰和可扩展,当前技术为每个可能的 SIMD 版本使用相同功能的多个版本。 :-/

Xeon 和 Xeon Phi 之间存在 SIMD ISA 融合,最终它们可能会变得相同。我怀疑您是否会在整个 Intel CPU 系列中获得相同的 SIMD ISA - 请记住,它从微型 Quark SOC 延伸到 Xeon Phi。在 AVX-1024 从 Xeon Phi 迁移到 Quark 或低端 Atom CPU.

之前会有很长一段时间,可能是无限的

为了在不同 CPU 系列(包括未来的系列)之间获得更好的可移植性,我建议您使用比裸 SIMD 指令或内在函数更高级别的概念。使用 OpenCL、OpenMP、Cilk Plus、C++ AMP 和自动矢量化编译器。通常,他们会很好地为您生成平台特定的 SIMD 指令。