sábado, 22 de noviembre de 2008

Programando con la tecnología MMX de Intel

La tecnología MMX de Intel se compone de un conjunto de extensiones para la IA diseñados para mejorar muchísimo el rendimiento de las aplicaciones avanzadas multimedia y de comunicaciones. Estas extensiones se combinan con una instrucción única para múltiples datos (SIMD) para acelerar el rendimiento de las aplicaciones como procesado de imagen, síntesis de audio, videoconferencias, etc, usarán a menudo algoritmos intensivos de computación para ejecutar operaciones repetidas en elementos de datos nativos. Los repertorios SIMD consisten en instrucciones que aplican una misma operación sobre un conjunto más o menos grande de datos. Es una organización que influye muchas unidades de procesamiento bajo la supervisión de una unidad de control común. Es decir, una única unidad de control despacha las instrucciones a diferentes unidades de procesamiento. Todos los procesadores reciben la misma instrucción de la unidad de control, pero operan sobre diferentes conjuntos de datos. O sea que la misma instrucción es ejecutada de manera síncrona por todas las unidades de procesamiento.
La tecnología MMX define un software muy simple y flexible, sin ningún modo nuevo ni ningún estado visible del sistema operativo nuevo. Todo el software que existía podrá ser ejecutado sin problemas.
Incorpora estas extensiones al entorno de programación del IA: 8 registros MMX (de MM0 a MM7), 4 tipos de datos MMX (bytes compactados, words compactados, doublewords compactados, y quadwords), y el conjunto de instrucciones de MMX.
Los registros MMX consisten en 8 registros de 64 bits cada uno, que son operados directamente mediante el conjunto de instrucciones MMX. Estos registros sólo se pueden usar para ejecutar cálculos en tipos de datos MMX; no se pueden usar para direccionar a memoria. Para eso están los modos estándar de acceso a memoria del IA y los registros de propósito general.
El modelo SIMD de ejecución soporta en la tecnología MMX direccionamiento directo, y mejora las necesidades de las aplicaciones de comunicaciones, de gráficos, etc que usan sofisticados algoritmos, ejecutando las mismas operaciones muchos números de tipos de datos pequeños. Por ejemplo, el vídeo y la información gráfica normalmente se representan en cuantías de 1 byte (8 bits) en paralelo. Aquí, una instrucción MMX puede operar en 8 de estos bytes simultáneamente.
Los bytes compactados son enumerados del 0 al 7, con el byte 0 conteniendo los bits menos significativos del tipo de datos. Los words compactados son enumerados del 0 al 4, con el word 0 conteniedo los bits 0 hasta el 15, y el word 4 conteniendo los bits 48 hasta 63. Los doublewords compactados son enumerados del 0 al 1, con el doubleword 0 conteniendo los bits del 0 al 31, y con el doubleword 1 conteniendo los bits del 32 al 63. Las instrucciones MMX mueven desde y hacia la memoria y a los registros de propósito general en bloques de 64 bits los tipos de datos compactados y los quadwords. Cuando se ejecutan operaciones aritméticas o lógicas sobre estos tipos de datos, las instrucciones MMX operan en paralelo a los bytes individuales, words o doublewords contenidos en los registros MMX de 64 bits.
Cuando se guardan en memoria los bytes, words, doublewords en los tipos de datos compactados se almacenan en direcciones consecutivas, con el dato menos significativo en la dirección mas baja.
Los valores en los registros MMX tienen el mismo formato que una cuantía de 64 bits en memoria, y tienen dos modos de acceso a los datos; modo de acceso de 64 bits (se usa por ejemplo, para acceder a memoria de 64 bits o instrucciones lógicas y aritméticas), y modo de acceso de 32 bits (se usa por ejemplo, para acceder a memoria de 32 bits, y algunas instrucciones no compactadas).
El conjunto de instrucciones del MMX consiste en 57 instrucciones (que no voy a detallar) que se pueden agrupar en estas categorías: instrucciones de transferencia de datos, instrucciones aritméticas, instrucciones de comparación, instrucciones de conversión, instrucciones lógicas, instrucciones Shift, y instrucciones de estado de vacío de MMX.
La tecnología MMX usa las mismas técnicas de interfaz entre la arquitectura en punto flotante y el sistema operativo. Usa los mismos registros que la FPU, los reutiliza. No se debe mezclar código MMX con código en punto flotante en el nivel de instrucción por varias razones: El valor tope de la pila del estado de un word en punto flotante, se pone a cero después de la instrucción MMX, y el puntero del código en punto flotante se pierde; una instrucción MMX cuando escribe en un registro MMX, escribe unos (11s) en la parte del exponente del correspondiente registro en punto flotante; el código en punto flotante que usa contenidos de registro generados por instrucciones MMX pueden causar excepciones en punto flotante o resultados incorrectos; Excepto EMMS, el resto de instrucciones MMX ponen la tag word a un estado válido, sin guardar el estado anterior en punto flotante; las transiciones frecuentes entre instrucciones MMX y en punto flotante puede afectar negativamente al rendimiento en algunas implementaciones porque son muy lentas, por lo tanto lo óptimo es que el programador utilice el procesador de un modo u otro, aunque si no es posible es recomendable seguir estas directrices: Particionar el módulo de tecnología MMX y el módulo en punto flotante, en conjuntos separados de instrucciones (subrutinas o bucles separados) de forma que sólo contengan instrucciones de un tipo; No contar con los contenidos de los registros durante las transiciones; Cuando el estado MMX no se requiere, vaciarlo usando la instrucción EMMS; Salir de la sección de código en punto flotante con la pila vacía.
La MMX tiene otro problema añadido, y es que sólo soporta operaciones con números enteros. Intel solucionó esos problemas más adelante con las extensiones Streaming SIMD, que da soporte para operaciones en punto flotante de 32 bits y un sistema adicional de registros de 128 bits que facilita el uso de SIMD y la FPU a la vez.

No hay comentarios: