我想使用SIMD操作在字节数组中找到最小/最大值.到目前为止,我能够通过数组并将最小/最大值存储到__m128i变量中,但这意味着我正在寻找的值与其他值混合在一起(确切地说是15个其他值).
我在这里和这里找到了这些讨论的整数,这个页面用于浮点数,但我不明白如何工作_mm_shuffle*.所以我的问题是:
以下是横向最大值的示例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;
}
Run Code Online (Sandbox Code Playgroud)
最大值将在所有元素中返回.如果您需要将值作为标量,那么请使用_mm_extract_epi8.
应该相当明显如何适应min,以及签名的min/max.