c++ - SVML 与普通内在平方根函数之间有区别吗?

标签 c++ intel sse intrinsics sse2

普通 sqrtps/pd 或 SVML 版本在精度或性能上是否存在任何差异:

     __m128d _mm_sqrt_pd (__m128d a) [SSE2]
     __m128d _mm_svml_sqrt_pd (__m128d a) [SSE?]
     __m128 _mm_sqrt_ps (__m128 a) [SSE]
     __m128 _mm_svml_sqrt_ps (__m128 a) [SSE?]

我知道像 _mm_sin_ps 这样的 SVML Intrinsics 实际上是由多个 asm 指令组成的函数,因此它们应该比任何单个乘法甚至除法都慢。但是,如果有可用的硬件级内部函数,我很好奇为什么这些函数存在。

这些 SVML 函数是在 SSE2 之前创建的吗?还是精度有差异?

最佳答案

我检查了 MSVC 中的代码生成。

  • _mm_svml_sqrt_pd 编译成函数调用;被调用的函数由一个 sqrtpd 后跟 ret
  • 组成
  • _mm_svml_sqrt_ps 编译成函数调用;被调用的函数由一个 sqrtps 后跟 ret
  • 组成
  • _mm_sqrt_pd_mm_sqrt_ps 内部函数编译为内联的 sqrtpdsqrtps

一个可能的解释(只是猜测): SVML 打算进行 CPU 调度,但为 MSVC 编译的版本禁用了此 CPU 调度。目标可能是针对 Xeon Phi 以不同方式实现它,Xeon Phi 版本可能不包含在 SVML 的 MSVC 构建中。


截图: enter image description here


当使用英特尔编译器时,它使用的是svml_dispmd.dll,并且有实际的调度函数(真正的间接跳转ff 25 42 08 00 00),最终在v对我来说是 sqrtpd

关于c++ - SVML 与普通内在平方根函数之间有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69354607/

相关文章:

linux - 在 ARMv6 上运行 x86 打印机驱动程序二进制文件

c++ - 使用 SSE 将 8 位整数除以 4(或移位)

c++静态函数未找到

c++ - 使用 boost::function 绑定(bind)到重载方法

assembly - Intel x86_64 汇编,如何在 x87 和 SSE2 之间移动? (计算 double 的反正切)

c++ - 为什么我的 SSE 代码比原生 C++ 代码慢?

c++ - SSE42 & STTNI - PcmpEstrM 比 PcmpIstrM 慢两倍,这是真的吗?

c++ - Bison malloc 内存损坏

C++,具有方法和枚举类型的类-方法和枚举值可以具有相同的名称吗?

assembly - 如何在 i386 上将 "pushl 2000"从 AT&T asm 转换为 Intel 语法