2012-08-27 12 views
6

Ich konvertiere SIMD-Code in gleichwertigen c-Code. Ich bin an einem SSE-Befehle steckenWas bedeutet unsignedSaturate im SSE-Befehl?

__m128i _mm_packus_epi16 (__m128i a, __m128i b) 

es gibt

r0 := UnsignedSaturate(a0) 
r1 := UnsignedSaturate(a1) 

... 
r7 := UnsignedSaturate(a7) 
r8 := UnsignedSaturate(b0) 
r9 := UnsignedSaturate(b1) 
... 
r15 := UnsignedSaturate(b7) 

Was bedeutet UnsignedSaturate bedeuten?

Antwort

14

Im Grunde bedeutet "Sättigung", dass Werte jenseits einiger "max" -Werte auf "max" und Werte unterhalb von "min" auf "min" gesetzt werden. Normalerweise sind "min" und "max" die Werte, die für einen bestimmten Datentyp geeignet sind.

Wenn Sie beispielsweise Arithmetik für vorzeichenlose Bytes nehmen, müsste "128 + 128" "256" sein (was hex 0x100 ist), das nicht in ein Byte passt. Normale Integer-Arithmetik würde einen Überlauf erzeugen und den Teil, der nicht passt, verwerfen, was "128 + 128 -> 0" bedeutet. Bei gesättigter Arithmetik "256> 255" ist das Ergebnis also 255.

Eine andere Option wäre die Skalierung, die die Werte im Grunde auf einen kleineren Bereich "komprimiert". Sättigung schneidet sie einfach ab.

Sie können auch größere Typen in kleinere Typen einfügen, z. B. 16-Bit-Werte in 8-Bit-Werte setzen. Ihr Beispiel macht wahrscheinlich genau das, obwohl Sie wahrscheinlich besser als ich wissen werden, mit welchen Typen Sie es zu tun haben.

"UnsignedSaturation" hat höchstwahrscheinlich eine min von "0" und eine "max" von was auch immer der max des Ergebnistyps ist. Somit werden negative Eingaben in "0" umgewandelt.

1

Sättigung bedeutet einfach, dass die angegebene Variable den maximal möglichen Wert einhält und nicht überläuft.

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

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

druckt v1 = 0 v2 = 65535

Das Konzept der gesättigten Fettsäuren in Standard-C ist nicht vorhanden und müssen von Erweiterungen zur Verfügung gestellt werden.

3

Der Befehl konvertiert 16-Bit-Ganzzahlen mit Vorzeichen in Ganzzahlen mit 8-Bit-Ganzzahl ohne Vorzeichen. Das Problem ist, was zu tun ist, wenn der Wert nicht passt. Mit anderen Worten, ist kleiner als 0 oder größer als 255. Vorzeichenlose Sättigung gibt an, dass der Wert dann auf seinen Bereich begrenzt wird. Mit anderen Worten, Werte kleiner als 0 werden in 0 umgewandelt, mehr als 255 bis 255.