是的,在云服务器上使用SIMD比在将要分发给人们桌面的应用程序中更容易,因为您通常可以更好地控制代码运行的硬件.(根据哪个云托管,您可以完全了解,就像在当前的私有服务器上运行一样.)
在虚拟机内部,已编译的可执行文件中的机器代码仍然在(通常)x86 CPU上运行,通常是Intel Xeon,但可能是AMD服务器.
某些VM软件可能设置为不暴露AVX,但任何x86云主机至少会有SSE4.2.SSE2是x86-64的基线,因此无法公开,这不是一个选项.如此老的CPU,它们只有SSE4.1或SSSE3可能很久以前已经退役,因为不值得运行它们所需的功率.
大多数虚拟机/云托管中缺少的主要功能是硬件性能计数器. 因此,您将很难分析使用Linux调整云服务器perf record,或perf stat任何事件,如缓存未命中,甚至周期. perf可能有一些基于时间的采样,其他分析工具设计用于基于时间的采样而不是HW perf计数器.
例如,Google云计算服务器允许您选择运行实例的硬件类型,例如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,但它们永远不会迁移到丢弃guest虚拟机启动的某些功能的主机.(这是不通过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可能随时迁移到不支持它的硬件.
英特尔仍在Silvermont/Goldmont系列中生产没有AVX的CPU.其中一些用于低功耗服务器,但我认为这对于大多数云计算来说都是罕见的.(英特尔还销售没有AVX的Skylake Celeron/Pentium CPU,但你不会在云主机中找到它们.)
除此之外,Sandybridge在2011年左右是新的,而AMD大约在同一时间推出了Bulldozer.因此,任何物理上缺乏AVX支持的主流CPU都已经过时了,并且没有内存带宽和CPU功率值得大多数托管商的电费.