7

SIMDコードを同等のcコードに変換しています。SSE命令の1つで立ち往生しています

__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」(16進数の0x100)である必要があり、これはバイトに収まりません。通常の整数演算では、オーバーフローが発生し、適合しない部分が破棄されます。これは、「128 +128->0」を意味します。飽和演算では、「256> 255」なので、結果は255になります。

もう1つのオプションは、スケーリングです。これは、基本的に値をより小さな範囲に「圧縮」します。飽和はそれらを遮断するだけです。

これを使用して、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 に答える