7

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

4

3 回答 3

16

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

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

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

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

“UnsignedSaturation”很可能具有最小值“0”和结果类型的最大值的“最大值”。因此,负输入变为“0”。

于 2012-08-27T11:41:32.813 回答
3

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

于 2012-08-27T11:45:44.067 回答
1

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

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

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

打印 v1=0 v2=65535

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

于 2012-08-27T11:44:46.173 回答