- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
只是考虑将某些软件迁移到云时必须做的事情。
该软件使用从 SSE3 到 AVX 的大量 SIMD 内部函数(英特尔的)。它在本地服务器上运行良好。
我想知道应该做什么样的改变才能将它迁移到云端。
当然希望能够使用更改尽可能少的 SIMD 功能。
但是,似乎无法预测在云上运行时将使用哪种 CPU。当软件在一种虚拟机或容器上运行时,我怀疑是否可以使用特定 CPU 的低级功能。
最佳答案
是的,在云服务器上使用 SIMD 比在要分发到人们桌面的应用程序中更容易,因为您通常可以更好地控制代码将在哪些硬件上运行。 (取决于哪个云托管,您可以非常准确地知道,就像在您当前的私有(private)服务器上运行一样。)
在虚拟机内部,您编译的可执行文件中的机器代码仍然在(通常)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
是一个有用的基线编译目标。
虚拟机支持在物理机之间迁移虚拟机,但它们永远不会迁移到会删除 guest 开始使用的某些功能的主机。 (这是不通过 AVX 或宣传与 CPU 一样最新的 SSE 或 AVX 版本的原因之一。)
AVX 和 AVX512 添加了新的架构状态(新的/更宽的寄存器),因此需要对上下文切换提供新的保存/恢复支持。如果 OS/VM 在控制寄存器中没有设置正确的位,AVX 指令就会出错。因此,VM 可以完全阻止 guest 使用 AVX。但由于必须启用 SSE2,如果硬件支持,他们无法阻止您使用 SSE4.2。可能会设置 guest 虚拟机,因此 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 能力来支付大多数主机的电费。
关于x86 - 我可以将 SIMD 内在函数用于在云上运行的软件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54718527/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!