SSE 指令中的 UnsignedSaturate 是啥意思?

Posted

技术标签:

【中文标题】SSE 指令中的 UnsignedSaturate 是啥意思?【英文标题】:What does UnsignedSaturate in SSE instruction mean?SSE 指令中的 UnsignedSaturate 是什么意思? 【发布时间】:2012-08-27 11:26:58 【问题描述】:

我正在将 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 是什么意思?

【问题讨论】:

【参考方案1】:

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

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

另一种选择是缩放,它基本上将值“压缩”到更小的范围。饱和只会将它们切断。

您还可以使用它来将较大的类型转换为较小的类型,例如将 16 位值转换为 8 位值。您的示例很可能正是这样做的,尽管您可能比我更清楚您正在处理哪种类型。

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

【讨论】:

【参考方案2】:

该指令将 16 位有符号整数转换为 8 位无符号整数。问题是当值不合适时该怎么办。换句话说,小于 0 或大于 255。无符号饱和度指定该值随后被裁剪到其范围。也就是说,小于 0 的值转换为 0,大于 255 的转换为 255。

【讨论】:

C(非内部)中是否有此操作的等效项?因为常规铸造不会这样做(它不会饱和到零负值)。【参考方案3】:

饱和仅仅意味着给定变量保持最大可能值而不是溢出。

unsigned short v1 = 65535;
unsigned (saturate) short v2 = 65535;

v1++;
v2++;
printf("v1=%u v2=%u\n", v1, v2);

打印 v1=0 v2=65535

标准 C 中不存在饱和的概念,必须由扩展提供。

【讨论】:

以上是关于SSE 指令中的 UnsignedSaturate 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

等效于 Power PC 中的 SSE

SSE3指令有啥功能?

SSE、SSE2、SSE3指令集的区别?

使用 Mono.Simd SSE 指令进行流控制

SSE/SSE2 指令的打包和解包数据?

如何使用 SSE 指令?