相关疑难解决方法(0)

在x86上做水平浮点矢量和的最快方法

你有一个三(或四)个浮点数的向量.总结它们的最快方法是什么?

SSE(movaps,shuffle,add,movd)总是比x87快吗?SSE4.2中的水平加法说明值得吗?移动到FPU的成本是多少,然后是faddp,faddp?什么是最快的特定指令序列?

"尝试安排事情,这样你可以一次总结四个向量"将不被接受作为答案.:-)

floating-point optimization x86 assembly sse

41
推荐指数
4
解决办法
2万
查看次数

用c ++中的内在函数检查nans

我是新手使用内在函数但是我想编写一个函数,它接受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)

c++ floating-point intrinsics

4
推荐指数
1
解决办法
397
查看次数

标签 统计

floating-point ×2

assembly ×1

c++ ×1

intrinsics ×1

optimization ×1

sse ×1

x86 ×1