在32位整数中找到最大值

时间:2016-06-05 00:02:59

标签: assembly sse

SSE/SSE2中的指令是否能够找到4位整数32位的最大值/最小值? 我尝试搜索一些东西,但我发现只有16/8位的指令。 提前谢谢。

https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=max&expand=4465,4463,3278&techs=SSE,SSE2

2 个答案:

答案 0 :(得分:5)

没有SSE4.1的最佳方式似乎是32位比较,然后使用该掩码进行混合:AND(mask, x) OR ANDN(mask, y)

Agner Fog's vector class librarya function for it

// function max: a > b ? a : b
static inline Vec4i max(Vec4i const & a, Vec4i const & b) {
#if INSTRSET >= 5   // SSE4.1 supported
    return _mm_max_epi32(a,b);
#else
    __m128i greater = _mm_cmpgt_epi32(a,b);
    return selectb(greater,a,b);
#endif
}

我对该库on github进行了一些大多数未经测试且尚未合并的更改。我的大多数变化都是对我有时间研究的少数函数的重大改进(整数水平和,四字算术右移,四字乘法)。 (测试/反馈欢迎!)

但是很多现有的代码都很好,所以我绝对建议使用那些包装类。当您在启用优化的情况下构建时,它们不会增加开销,并且它们使语法变得更加容易。例如a+b代替_mm_add_epi32(a,b)

答案 1 :(得分:2)

也许PMAXSD可以解决这个问题?

  

比较目标操作数(第一个操作数)和源操作数(第二个操作数)中的打包有符号双字整数,并返回目标操作数中每个打包值的最大值。

但是,它需要SSE 4.1和/或AVX支持。