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



英特尔有几种SIMD isa,如SSE, AVX, AVX2, AVX-512和Xeon Phi上的IMCI。不同的处理器支持这些isa。例如,AVX-512 BW, AVX-512 DQ和AVX-512 VL只支持Skylake,而不支持Xeon Phi。AVX-512F, AVX-512 CDI, AVX-512 ERI和AVX-512 PFI在Skylake和Xeon Phi上都支持。

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

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

为什么英特尔改变它的SIMD本质在这样一个不一致的方式?

如果SIMD isa彼此之间的兼容性更好,则可以将现有的AVX代码移植到AVX-512上,花费的精力要少得多。

我认为原因有三:

(1)当他们最初设计MMX时,他们的工作空间很小,所以尽可能地使它简单。他们还采用了一种与现有x86 ISA完全兼容的方式(精确中断+在上下文切换时节省一些状态)。他们没有预料到,他们会不断扩大SIMD寄存器的宽度,并添加如此多的指令。每一代当他们添加更宽的SIMD寄存器和更复杂的指令时,他们都必须维护旧的ISA以保持兼容性。

(2)你在AVX-512上看到的奇怪的事情是他们试图统一两个不同的产品线。Skylake来自英特尔的PC/服务器线,因此它们的路径可以被视为MMX -> SSE/2/3/4 -> AVX-> AVX2 -> AVX-512。Xeon Phi处理器基于一种名为Larrabee的x86兼容显卡,该显卡使用LRBni指令集。这或多或少与AVX-512相同,但指令较少,并且不与MMX/SSE/AVX等正式兼容…

(3)他们针对不同的人群有不同的产品。例如,(据我所知)AVX-512 CD指令在普通的SkyLake pc处理器中是不可用的,除了用于HPC的Xeon Phi之外,还用于服务器的SkyLake Xeon处理器中。我可以在一定程度上理解这一点,因为CD扩展的目标是并行直方图生成;这种情况更有可能成为服务器/HPC中的关键热点,而不是通用pc。

我同意这是有点乱。英特尔正在开始看到光明,并计划更好地进行额外的扩展;据说AVX-512在未来一代可以扩展到1024位。不幸的是,它仍然不够好,Agner Fog在英特尔论坛上讨论了这个问题。

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

在Xeon和Xeon Phi之间存在SIMD ISA收敛,最终它们可能变得相同。我怀疑你永远不会在整个英特尔CPU系列中得到相同的SIMD ISA -记住,它从一个微小的夸克SOC延伸到Xeon Phi。在AVX-1024从Xeon Phi迁移到Quark或低端Atom CPU之前,将有很长时间,可能是无限的。

为了在不同的CPU家族(包括未来的CPU家族)之间获得更好的可移植性,我建议您使用比单纯的SIMD指令或内在机制更高层次的概念。使用OpenCL, OpenMP, Cilk Plus, c++ AMP和自动向量化编译器。通常,它们可以很好地为您生成特定于平台的SIMD指令。

最新更新