我可以将SIMD内在函数用于在云上运行的软件吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以将SIMD内在函数用于在云上运行的软件吗?相关的知识,希望对你有一定的参考价值。
只考虑将某些软件迁移到云时必须完成的工作。该软件使用了很多从SSE3到AVX的SIMD内在函数(英特尔)。它在本地服务器上运行良好。我想知道将它迁移到云应该做些什么样的改变。当然希望能够尽可能少地使用SIMD功能。但是,似乎无法预测在云上运行时将使用哪种CPU。我怀疑当软件在某种虚拟机或容器上运行时是否可以使用特定CPU的低级功能。
是的,在云服务器上使用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功率值得大多数托管商的电费。
以上是关于我可以将SIMD内在函数用于在云上运行的软件吗?的主要内容,如果未能解决你的问题,请参考以下文章
Cython 和 SIMD 内在函数:防止 SIMD 内在函数的参数转换为 python 对象