我想使用 SIMD 运算查找字节数组中的最小值/最大值。到目前为止,我能够遍历数组并将最小值/最大值存储到 __m128i 变量中,但这意味着我正在查找的值混合在其他值中(确切地说是其他 15 个值)。
我找到了这些讨论here https://stackoverflow.com/questions/22256525/horizontal-minimum-and-maximum-using-sse and here https://stackoverflow.com/questions/9877700/getting-max-value-in-a-m128i-vector-with-sse对于整数,并且这一页 http://shybovycha.tumblr.com/post/122400740651/speeding-up-algorithms-with-sse对于浮动,但我不明白 _mm_shuffle* 是如何工作的。所以我的问题是:
- 为了从 __m128i 变量中提取最小/最大字节(或无符号字节)值,我必须执行哪些 SIMD 操作?
- _mm_shuffle* 如何工作?当我在网上查看“最小”文档时,我不明白。我知道这与_MM_SHUFFLE 宏 https://msdn.microsoft.com/en-us/library/4d3eabky(v=vs.71).aspx,但我不明白这个例子。
这是水平最大值的示例uint8_t
:
#include "tmmintrin.h" // requires SSSE3
__m128i _mm_hmax_epu8(const __m128i v)
{
__m128i vmax = v;
vmax = _mm_max_epu8(vmax, _mm_alignr_epi8(vmax, vmax, 1));
vmax = _mm_max_epu8(vmax, _mm_alignr_epi8(vmax, vmax, 2));
vmax = _mm_max_epu8(vmax, _mm_alignr_epi8(vmax, vmax, 4));
vmax = _mm_max_epu8(vmax, _mm_alignr_epi8(vmax, vmax, 8));
return vmax;
}
将返回所有元素中的最大值。如果您需要该值作为标量,则使用_mm_extract_epi8
.
如何适应最小值和带符号的最小值/最大值应该是相当明显的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)