2012-08-27 12 views
6

Estoy convirtiendo código SIMD en código c equivalente. Estoy atascado en una de las instrucciones SSE¿Qué significa UnsignedSaturate in SSE instruction?

__m128i _mm_packus_epi16 (__m128i a, __m128i b) 

vuelve

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

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

¿Qué significa UnsignedSaturate?

Respuesta

14

Básicamente, "saturación" significa que los valores más allá de algún valor "máximo" se establecen en "máximo", y los valores por debajo de un valor "mínimo" se establecen en "min". Por lo general, "mínimo" y "máximo" son los valores apropiados para algún tipo de datos.

Así, por ejemplo, si toma aritmética en bytes sin signo, "128 + 128" debería ser "256" (que es hexadecimal 0x100), que no cabe en un byte. La aritmética de enteros normales crearía un desbordamiento y descartaría la parte que no encaja, lo que significa "128 + 128 -> 0". Con aritmética saturada, "256> 255", por lo que el resultado es 255.

Otra opción sería escalar, lo que básicamente "comprime" los valores a un rango menor. La saturación simplemente los corta.

También puede usar esto para poner tipos más grandes en otros más pequeños, como poner valores de 16 bits en valores de 8 bits. Es muy probable que tu ejemplo haga exactamente eso, aunque probablemente sabrás mejor que yo de qué tipo de tipos estás tratando.

"UnsignedSaturation" probablemente tiene un mínimo de "0" y un "máximo" de lo que sea el máximo del tipo de resultado. Por lo tanto, las entradas negativas se convierten en "0".

1

Saturar simplemente significa que la variable dada mantiene el máximo valor posible en lugar de desbordarse.

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

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

grabados v1 v2 = 0 = 65535

El concepto de ácidos grasos saturados no existe en C estándar y deben ser proporcionados por las extensiones.

3

La instrucción convierte enteros de 16 bits enteros a enteros de 8 bits sin signo. El problema es qué hacer cuando el valor no encaja. En otras palabras, es menor que 0 o mayor que 255. La saturación sin signo especifica que el valor se recorta a su rango. En otras palabras, los valores menores que 0 se convierten a 0, más de 255 a 255.