我正在将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
是什么意思?
答案 0 :(得分:15)
基本上,“饱和度”表示超出某个“最大”值的值设置为“max”,低于“min”值的值设置为“min”。通常,“min”和“max”是适合某些数据类型的值。
因此,例如,如果对无符号字节进行算术运算,则“128 + 128”必须为“256”(十六进制0x100),这不适合一个字节。正常整数运算会产生溢出并丢弃不适合的部分,这意味着“128 + 128 - > 0”。使用饱和算术,“256> 255”,因此结果为255。
另一种选择是缩放,它基本上将值“压缩”到更小的范围。饱和只是将它们切断了。
您也可以使用它将较大的类型放入较小的类型中,例如将16位值放入8位值。你的例子最有可能就是这样,虽然你可能比我知道的更好,你在那里处理的是哪种类型。
“UnsignedSaturation”最有可能具有“0”的最小值和“max”,无论结果类型的最大值是多少。因此,负输入变为“0”。
答案 1 :(得分:3)
该指令将16位有符号整数转换为8位无符号整数。问题是当值不适合时该怎么做。换句话说,小于0或大于255.无符号饱和度指定该值被剪切到其范围。换句话说,小于0的值将转换为0,大于255到255。
答案 2 :(得分: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中不存在,必须由扩展提供。