gpt4 book ai didi

assembly - SSE4.1 带溢出的无符号整数比较

转载 作者:行者123 更新时间:2023-12-03 23:01:46 25 4
gpt4 key购买 nike

考虑到 16 位无符号加法( _mm_add_epi16() )会溢出,有没有办法像 C >= (A + B) 与 SSE2/4.1 指令进行比较?
代码片段看起来像 -

#define _mm_cmpge_epu16(a, b) _mm_cmpeq_epi16(_mm_max_epu16(a, b), a)

__m128i *a = (__m128i *)&ptr1;
__m128i *b = (__m128i *)&ptr2;
__m128i *c = (__m128i *)&ptr3;

_m128i xa = _mm_lddqu_si128(a);
_m128i xb = _mm_lddqu_si128(b);
_m128i xc = _mm_lddqu_si128(c);

_m128i res = _mm_add_epi16(xa, xb);
_m128i xmm3 = _mm_cmpge_epu16(xc, res);
问题是当 16 位加法溢出(环绕)时,大于比较会导致误报。我不能为我的目的使用饱和加法。我在这里查看了检测无符号加法溢出的机制 SSE2 integer overflow checking .但是如果大于比较,我该如何使用。

最佳答案

以下是一些合理的方法:

#include <cstdint>
using v8u16 = uint16_t __attribute__((vector_size(16)));

v8u16 lthsum1(v8u16 a, v8u16 b, v8u16 c) {
return (c >= a) & (c - a >= b);
}

v8u16 lthsum2(v8u16 a, v8u16 b, v8u16 c) {
return (a + b >= a) & (a + b <= c);
}
你可以看到它是如何编译的
godbolt .这两种方法大致相同,我没有看到 -msse4.1 有很大的变化。使用 gcc,但 AVX2 及更高版本确实改进了代码。 clang对于第二个变体,sse4.1 也得到了小的改进。与 AVX512BW ,clang 本身就做得很好。

关于assembly - SSE4.1 带溢出的无符号整数比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65343454/

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