c++ - SSE指令中的UnsignedSaturate是什么意思?

标签 c++ c sse

我正在将 SIMD 代码转换为等效的 C 代码。我被困在 SSE 指令之一

__m128i _mm_packus_epi16 (__m128i a, __m128i b)

返回

r0 := UnsignedSaturate(a0)
r1 := UnsignedSaturate(a1)

...
r7 := UnsignedSaturate(a7)
r8 := UnsignedSaturate(b0)
r9 := UnsignedSaturate(b1)
...
r15 := UnsignedSaturate(b7)

UnsignedSaturate 是什么意思?

最佳答案

基本上,“饱和度”意味着超过某个“最大”值的值被设置为“最大”,低于“最小”值的值被设置为“最小”。通常,“min”和“max”是适用于某些数据类型的值。

因此,例如,如果您对无符号字节进行算术运算,则“128+128”必须是“256”(十六进制 0x100),这不适合一个字节。正常的整数运算会产生溢出并丢弃不适合的部分,这意味着“128+128 -> 0”。使用饱和算法,“256 > 255”所以结果是 255。

另一个选项是缩放,它基本上将值“压缩”到较小的范围。饱和度只是将它们切断。

您还可以使用它来将较大的类型放入较小的类型,例如将 16 位值放入 8 位值。您的示例很可能正是这样做的,尽管您可能比我更了解您在那里处理的是哪种类型。

“UnsignedSaturation”很可能有一个“0”的最小值和一个“最大值”,无论结果类型的最大值是多少。因此,负输入变为“0”。

关于c++ - SSE指令中的UnsignedSaturate是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12141075/

相关文章:

c - 二进制交织、二进制混合、交替位

c++ - 在C++中模拟虚拟构造函数

performance - 为什么 SSE 标量 sqrt(x) 比 rsqrt(x) * x 慢?

c++ - 与第 3 方库链接导致 openssl 中出现段错误

c - 如何限制子线程或子进程以限制在 C 中 fork

c - SDL2 音频问题 C 编程(不是混音器)

c - 使用c和fcntl在unix系统中锁定文件

optimization - SSE2 内在函数 : access memory directly

c++ - 右值引用和完美转发

c++ - 优化编译器消除错误