普通 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
内部函数编译为内联的sqrtpd
和sqrtps
一个可能的解释(只是猜测): SVML 打算进行 CPU 调度,但为 MSVC 编译的版本禁用了此 CPU 调度。目标可能是针对 Xeon Phi 以不同方式实现它,Xeon Phi 版本可能不包含在 SVML 的 MSVC 构建中。
当使用英特尔编译器时,它使用的是svml_dispmd.dll
,并且有实际的调度函数(真正的间接跳转ff 25 42 08 00 00
),最终在v对我来说是 sqrtpd
关于c++ - SVML 与普通内在平方根函数之间有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69354607/