你有一个三(或四)个浮点数的向量.总结它们的最快方法是什么?
SSE(movaps,shuffle,add,movd)总是比x87快吗?SSE4.2中的水平加法说明值得吗?移动到FPU的成本是多少,然后是faddp,faddp?什么是最快的特定指令序列?
"尝试安排事情,这样你可以一次总结四个向量"将不被接受作为答案.:-)
我是新手使用内在函数但是我想编写一个函数,它接受4个双精度计算器的计算a > 1e-5 ? std::sqrt(a) : 0.0我的第一直觉是写如下
#include <immintrin.h>
__m256d f(__m256d a)
{
__m256d is_valid = a > _mm256_set1_pd(1e-5);
__m256d sqrt_val = _mm256_sqrt_pd(a);
return is_valid * sqrt_val;
}
Run Code Online (Sandbox Code Playgroud)
根据gcc.godbolt.com编译如下
f(double __vector(4)):
vsqrtpd ymm1, ymm0
vcmpgtpd ymm0, ymm0, YMMWORD PTR .LC0[rip]
vmulpd ymm0, ymm1, ymm0
ret
.LC0:
.long 2296604913
.long 1055193269
.long 2296604913
.long 1055193269
.long 2296604913
.long 1055193269
.long 2296604913
.long 1055193269
Run Code Online (Sandbox Code Playgroud)
但我担心如果sqrt_val包含一个会发生什么nan.我认为0.0 * nan不会起作用.这里有什么最好的做法?
编辑
在阅读了@ChrisCooper(和@njuffa)的评论后,我被链接到另一个堆栈溢出答案,所以我将测试自我平等,然后and用我的结果测试.
#include <immintrin.h>
__m256d …Run Code Online (Sandbox Code Playgroud)