__m128中至少有4个SP值

Fil*_*ffa 7 c sse simd

假设有一个__m128变量包含4个SP值,并且您想要最小值,是否有任何可用的内部函数,或者除了值之间的天真线性比较之外的任何其他函数?

正确知道我的解决方案如下(假设输入__m128变量是x):

x = _mm_min_ps(x, (__m128)_mm_srli_si128((__m128i)x, 4));
min = _mm_min_ss(x, (__m128)_mm_srli_si128((__m128i)x, 8))[0];
Run Code Online (Sandbox Code Playgroud)

这是非常可怕的,但它的工作(顺便说一下,有什么类似的_mm_srli_si128但是__m128类型?)

Pau*_*l R 6

没有单一指令/内在但你可以用两个shuffle和两个分钟来做:

__m128 _mm_hmin_ps(__m128 v)
{
    v = _mm_min_ps(v, _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 1, 0, 3)));
    v = _mm_min_ps(v, _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 0, 3, 2)));
    return v;
}
Run Code Online (Sandbox Code Playgroud)

输出向量将包含输入向量中所有元素的min,在整个输出向量中复制.