C simd _m128 晶圆厂

问题描述 投票:0回答:2

如何为 __m128 向量制作 fabs() ?

我是否必须使用符号位将原始向量乘以 1.0f/-1.0f ?

没有找到任何指令集来做到这一点。

我不需要 __m256 或 512。我正在搜索 __m128 数据类型

c simd sse
2个回答
0
投票

我在相关帖子中找到了一个提出这个建议的人,但是如果你有更好的建议,请提出。我是 simd 新手。

__m128 _m128_fabs(__m128 x)
{
    __m128 minus_zero = _mm_set1_ps(-0.0);  // epi32(1U<<31)
    __m128 signbits = _mm_and_ps(x, minus_zero);
    __m128 flipped = _mm_xor_ps(x, signbits);

    // reuse the zero constant we already have, maybe saving an instruction
    __m128 nonzero = _mm_cmpneq_ps(x, minus_zero);
    return _mm_and_ps(flipped, nonzero);
}

0
投票

我认为以下方法会起作用。 基于掩码,我们对正数和负数进行排序,并从正数中减去负数:

__m128 _m128_fabs(__m128 x)
{
   __m128i mask = _mm_cmpgt_ps(val, _mm_setzero_ps()); // make mask > 0
   __m128i pos  = _mm_and_ps(mask, val); // values > 0  or 0
   __m128i neg  = _mm_andnot_ps(mask, val); // values <= 0 or 0
   __m128i res  = _mm_sub_ps(pos, neg); // take pos, subtract neg
   return res;
}
© www.soinside.com 2019 - 2024. All rights reserved.