【问题标题】: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 是什么意思?

【问题讨论】:

    标签: c++ c sse


    【解决方案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 中不存在饱和的概念,必须由扩展提供。

      【讨论】:

        猜你喜欢
        • 2012-10-31
        • 1970-01-01
        • 1970-01-01
        • 2014-12-10
        • 1970-01-01
        • 2022-01-23
        • 2011-07-31
        • 2022-12-13
        • 1970-01-01
        相关资源
        最近更新 更多