假设有一个包含4个sp值的__m128变量,并且您想要最小的一个,是否有任何可用的内部函数,或者除了这些值之间的简单线性比较之外的任何其他函数?
我的解决方案如下(假设输入__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];

这是相当可怕,但它的工作(顺便问一句,有什么像_mm_srli_si128除了__m128类型?)

最佳答案

没有单一指令/内在指令,但您可以用两次洗牌和两分钟来完成:

__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;
}

输出向量将包含输入向量中所有元素的最小值,复制到整个输出向量中。

09-30 23:58