仅考虑将某些软件迁移到云时必须执行的操作。 从SSE3到AVX,该软件使用了许多Intel的SIMD内部函数。它在本地服务器上运行良好。 我想知道应该进行哪种更改才能将其迁移到云。 当然希望能够以尽可能少的更改使用SIMD功能。 但是,似乎无法预测在云上运行时将使用哪种CPU。而且我怀疑,当软件在一种虚拟机或容器上运行时,是否能够使用特定CPU的低级功能。
答案 0 :(得分:6)
是的,在云服务器上使用SIMD比在要分发到人们桌面的应用程序中更容易使用,因为通常您可以 more 控制代码将在哪种硬件上运行。 (取决于哪个云托管,您可以确切地知道,就像在当前的私有服务器上运行一样。)
在虚拟机内部,编译后的可执行文件中的机器代码仍在本地(通常)x86 CPU上运行,通常是Intel Xeon,但也可能是AMD服务器。
某些VM软件可能已设置为不公开AVX,但是任何x86云主机都将至少具有SSE4.2 。 SSE2是x86-64的基线,因此无法公开它不是一种选择。这么老的CPU只有SSE4.1或SSSE3,很可能很早就已经淘汰了,因为它们不具备运行它们所需的功能。
大多数虚拟机/云托管所缺少的主要功能是硬件性能计数器。因此,您将很难进行性能分析以使用Linux perf record
来调整云服务器,或者perf stat
用于任何事件,例如缓存未命中,甚至循环。 perf
可能有一些基于时间的采样,而其他性能分析工具是为基于时间的采样而不是硬件性能计数器而设计的。
Google Cloud计算服务器可让您选择实例将在哪种硬件上运行,例如Haswell或Skylake-X。无论使用哪种方式,都可以使用AVX2和FMA。 (以及BMI2,popcnt等)。使用Skylake-X,您还可以获得AVX512BW / AVX512DQ /其他一些AVX512口味。视情况使用clang
/ gcc -O3 -march=skylake-avx512
或-march=haswell
进行编译。
如果能够假设AVX + FMA对您的软件很重要,那么我认为其他云主机也具有类似的机制,可让您至少选择一组最低的ISA扩展基线。我希望非常非常容易找到最小的AVX,也可能容易找到最小的Haswell。 (AVX2 + FMA + BMI1 / BMI2)。 -march=haswell
是有用的基准编译目标。
VM支持在物理计算机之间迁移VM,但是它们永远不会迁移到主机上,而该主机会失去来宾启动的某些功能。 (这是不通过AVX或不像CPU那样发布最新的SSE或AVX版本的原因之一。)
AVX和AVX512添加了新的体系结构状态(新的/更宽的寄存器),因此需要在上下文切换中提供新的保存/恢复支持。没有OS / VM在控制寄存器中设置的正确位,AVX指令将出错。因此,VM可以完全阻止访客使用AVX。但是,由于必须启用SSE2,因此如果硬件支持,他们将无法阻止您使用SSE4.2。来宾VM可能已设置为CPUID仅广告SSE2,但没有更高的广告,但是当SSE2指令起作用时,它们不会使SSE4.2指令出错。对于AVX2 + FMA相同:如果启用了AVX1,则只有真正不支持AVX2或FMA的基础CPU才能使它们出错,而不是CPUID的人工限制。但是不宣传FMA可能意味着您的VM可以随时迁移到不支持它的硬件。
Intel在Silvermont / Goldmont系列中仍在生产没有AVX的CPU。其中一些用于低功耗服务器,但我认为对于大多数云计算而言,这种情况很少见。 (英特尔还出售不带AVX的Skylake Celeron / Pentium CPU,但您不会在云主机中找到它们。)
除此之外,Sandybridge在2011年左右才是新产品,AMD大约在同一时间推出了Bulldozer。因此,任何实际上缺乏AVX支持的主流CPU都已过时,并且没有内存带宽和CPU能力足以应付大多数主机的电费。