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

Is there a difference between SVML vs. normal intrinsic square root functions?

正常 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 指令组成的函数,因此它们应该比任何单个乘法甚至除法都慢。但是,我很好奇如果有可用的硬件级 Intrinsics 为什么会存在这些函数。

这些 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 构建中。


截图:


使用Intel编译器时,使用的是svml_dispmd.dll,还有真正的dispatch函数(真正的间接跳转ff 25 42 08 00 00),最终在v我的 sqrtpd