gpt4 book ai didi

c - 使用 SSE 从 _m128i 寄存器中提取非零值

转载 作者:行者123 更新时间:2023-12-05 01:36:00 27 4
gpt4 key购买 nike

我必须提取 __m128i 寄存器的非零值。
例如,我有一个带有八个无符号短裤的 vector 。

__m128i vector {40, 0, 22, 0, 0, 0, 0, 8}

我想用最少的 SSE 指令提取 40、22 和 8。
然后非零值将存储在非零值数组中。
{40, 22, 8, more values from different vectors ... }

是否可以洗牌它们或者是否有很好的内在提取和存储?

最佳答案

如果你看 at this paper ,作者描述了如何使用_mm_cmpestrm指令来做基本上你想要的。他们算法的核心是这样的(我稍微修改了它来做你想要的,而不是他们想要的):

__m128i res_v = _mm_cmpestrm(
vector,
8,
mm_setzero_si128(),
8,
_SIDD_UWORD_OPS|_SIDD_CMP_EQUAL_ANY|_SIDD_BIT_MASK|_SIDD_NEGATIVE_POLARITY);
int r = _mm_extract_epi32(res_v, 0);

__m128i p = _mm_shuffle_epi8(vector, sh_mask[r]);

如果您按照论文中的描述构建查找表 sh_mask,则 p 应该具有非零元素(没有任何重新排序),后跟零元素。 r 中设置的位数将告诉您非零元素的数量。

_mm_cmpestrm 不幸的是在 SSE4 中。

关于c - 使用 SSE 从 _m128i 寄存器中提取非零值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15767404/

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