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
内部函数编译为内联 sqrtpd
和 sqrtps
一个可能的解释(随便猜):
SVML 打算 CPU 分派,但为 MSVC 编译的版本禁用了此 CPU 分派。目标可能是针对 Xeon Phi 以不同方式实现它,Xeon Phi 版本可能不包含在 SVML 的 MSVC 构建中。
截图:
使用Intel编译器时,使用的是svml_dispmd.dll
,还有真正的dispatch函数(真正的间接跳转ff 25 42 08 00 00
),最终在v我的 sqrtpd
正常 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
内部函数编译为内联sqrtpd
和sqrtps
一个可能的解释(随便猜): SVML 打算 CPU 分派,但为 MSVC 编译的版本禁用了此 CPU 分派。目标可能是针对 Xeon Phi 以不同方式实现它,Xeon Phi 版本可能不包含在 SVML 的 MSVC 构建中。
截图:
使用Intel编译器时,使用的是svml_dispmd.dll
,还有真正的dispatch函数(真正的间接跳转ff 25 42 08 00 00
),最终在v我的 sqrtpd