gpt4 book ai didi

c++ - 从 __m128i 中查找最小值/最大值

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:56 34 4
gpt4 key购买 nike

我想使用 SIMD 操作找到字节数组中的最小值/最大值。到目前为止,我能够遍历数组并将最小值/最大值存储到 __m128i 变量中,但这意味着我正在寻找的值与其他值混合在一起(确切地说是另外 15 个值)。

我找到了这些讨论 herehere对于整数,this page对于 float ,但我不明白 _mm_shuffle* 是如何工作的。所以我的问题是:

  1. 我必须执行哪些 SIMD 操作才能从 __m128i 变量中提取最小/最大字节(或无符号字节)值?
  2. _mm_shuffle* 是如何运作的?当我在线查看“最小”文档时,我不明白。我知道它与 _MM_SHUFFLE macro 有关,但我不明白这个例子。

最佳答案

这是 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

对于最小值和带符号的最小值/最大值如何调整它应该是相当明显的。

关于c++ - 从 __m128i 中查找最小值/最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40985572/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com