SSE/SSE2
中的指令是否能够找到4位整数32位的最大值/最小值?
我尝试搜索一些东西,但我发现只有16/8位的指令。
提前谢谢。
答案 0 :(得分:5)
没有SSE4.1的最佳方式似乎是32位比较,然后使用该掩码进行混合:AND(mask, x) OR ANDN(mask, y)
。
Agner Fog's vector class library有a 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支持。