如何为 __m128 向量制作 fabs() ?
我是否必须使用符号位将原始向量乘以 1.0f/-1.0f ?
没有找到任何指令集来做到这一点。
我不需要 __m256 或 512。我正在搜索 __m128 数据类型
我在相关帖子中找到了一个提出这个建议的人,但是如果你有更好的建议,请提出。我是 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);
}
我认为以下方法会起作用。 基于掩码,我们对正数和负数进行排序,并从正数中减去负数:
__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;
}