在 32 位整数中查找最大值
Find max among 32 bit integers
SSE/SSE2
中是否有指令能够在4个32位整数中找到max/min?
我试着搜索一些东西,但我只找到了 16/8 位的说明。
提前致谢。
也许 PMAXSD
可以解决问题?
Compares packed signed dword integers in the destination operand (first operand) and the source operand (second operand), and returns the maximum for each packed value in the destination operand.
但是,它需要 SSE 4.1 and/or AVX 支持。
没有 SSE4.1 的最佳方法似乎是 32 位比较,然后使用该掩码进行混合:AND(mask, x) OR ANDN(mask, y)
.
Agner Fog's vector class library has 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)
.
SSE/SSE2
中是否有指令能够在4个32位整数中找到max/min?
我试着搜索一些东西,但我只找到了 16/8 位的说明。
提前致谢。
也许 PMAXSD
可以解决问题?
Compares packed signed dword integers in the destination operand (first operand) and the source operand (second operand), and returns the maximum for each packed value in the destination operand.
但是,它需要 SSE 4.1 and/or AVX 支持。
没有 SSE4.1 的最佳方法似乎是 32 位比较,然后使用该掩码进行混合:AND(mask, x) OR ANDN(mask, y)
.
Agner Fog's vector class library has 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)
.