英特尔拥有多个SIMD ISA,例如Xeon Phi上的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。
答案 0 :(得分:9)
我看到原因为三倍。
(1)当他们最初designed 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指令不适用于PC的常规SkyLake处理器,只有用于服务器的SkyLake Xeon处理器以及用于HPC的Xeon Phi。我可以理解这一点,因为CD扩展的目标是并行直方图生成;这种情况更可能是服务器/ HPC中的关键热点,而不是通用PC。
我确实认为这有点乱。英特尔正在开始看到亮点,并计划更好地进行其他扩展;据推测,AVX-512可以在下一代中扩展到1024位。不幸的是,它仍然不够好,而且Agner Fog discusses this on the Intel Forums。
对我来说,我希望看到一个可以升级的模型,而无需用户每次都必须重新编译代码。例如,不是在ISA中将AVX寄存器定义为512位,而应该是存储在微体系结构中的参数,并且可以由程序员在运行时检索。用户询问这台机器上可用的最大SIMD宽度是多少?,架构返回XYZ
,并且用户具有通用控制流来处理XYZ
的任何内容。这将比当前技术更清晰和可扩展,该技术对于每个可能的SIMD版本使用相同功能的若干版本。 : - /
答案 1 :(得分:1)
Xeon和Xeon Phi之间存在SIMD ISA融合,最终它们可能会变得相同。我怀疑你会在整个英特尔CPU系列中获得相同的SIMD ISA - 请记住,它从一个微小的Quark SOC延伸到Xeon Phi。在AVX-1024从Xeon Phi迁移到Quark或低端Atom CPU之前,将会有很长一段时间,可能是无限的。
为了在不同CPU系列(包括未来系列)之间获得更好的可移植性,我建议您使用比纯SIMD指令或内在函数更高级别的概念。使用OpenCL,OpenMP,Cilk Plus,C ++ AMP和autovectorizing编译器。通常,他们会很好地为您生成平台特定的SIMD指令。