Esto es algo un poco más subjetivo que lo demás.
El manual es muy interesante en el sentido práctico de programación a bajo nivel porque expone muy claramente el funcionamiento de procesadores Intel en los que están basados los actuales Pentium 4, Core Duo, etc. que son casi omnipresentes en cualquier computadora de todo el mundo. Sin embargo, se necesita tener al menos una base de programación a bajo nivel para poder ir llevando todo lo que se indica en este manual. Este tipo de programación es mas pesada y complicada que los lenguajes de alto nivel, por eso es también mas minoritaria; pero funciona mejor.
Lo más relevante de este manual es lo primero, la parte de E/S y la identificación del procesador; la introducción, el entorno de ejecución, cómo se llama a los procedimientos, interrupciones y a las excepciones, como se direccionan los datos, los registros (a memoria, a puertos E/S...), cómo se comunica un procesador con el "exterior", cómo un programa sabe en qué tipo de máquina se está ejecutando y actúe en consecuencia. La FPU y la tecnología MMX es algo más secundario (pero también importante) porque es más importante saber lo que hacen, que cómo lo hacen. Antes eran útiles para muchas cosas, pero ahora lo son mucho más porque las interfaces gráficas están mucho mas evolucionadas y necesitan hacer cálculos numéricos mucho más rápidos que las de antes, por ejemplo.
Me ha sorprendido la cantidad de la memoria y de información que debe manejar el procesador para controlar todos los campos, puertos de entrada, de salida, bidireccionales, excepciones, interrupciones, privilegios...todo eso a velocidades increíbles (los procesadores actuales están en el orden de 3.000.000.000 operaciones por segundo), poniendo al límite la resolución óptica de los dispositivos utilizados para la fabricación del microprocesador (cada vez se usan longitudes de onda más bajas).
Lo que es curioso, es que en procesadores con soporte para SSE2 en adelante (que soporta punto flotante), siga en uso también la FPU...tendré que investigar ;-)
Bueno, espero que esto os pueda ayudar algún día :-)
viernes, 28 de noviembre de 2008
Indicaciones para escribir editores de excepciones SIMD en punto flotante
Igual que para las excepciones de punto flotante de la FPU, el procesador escoge una de dos posibles acciones cuando de una instrucción de las extensiones Streaming SIMD surge una excepción en punto flotante:
- Si la excepción está enmascarada, es producido un resultado por defecto que es aceptable en la mayoría de las situaciones. No se emite indicación externa, pero la correspondiente bandera de excepción en el MXCSR se establece y puede ser examinada más tarde.
- Si no está enmascarada, un editor de excepciones registrado previamente por el usuario será invocado a través de la excepción vector 19 del SIMD en punto flotante.
La rutina para invocar al editor de excepciones a través de la interrupción en el vector 19 es normalmente parte del kernel del software del sistema. Una entrada en la tabla de descripción de interrupciones debe ser seleccionada previamente por este vector. Algunos compiladores usan librerías run-time para ayudar en la edición de excepciones en punto flotante. Si cualquier operación en punto flotante de la FPU va a ser ejecutada y es posible que produzca una excepción en punto flotante, entonces la rutina de edición de excepciones debe desactivar todas las excepciones en punto flotante o la debe implementar como nueva candidata. Si no es el caso, la rutina debe borrar el estado de las banderas de las excepciones FPU, o enmascarar todas las excepciones en punto flotante de la FPU. Para las excepciones en punto flotante de las extensiones Streaming SIMD, las banderas de excepciones en MXCSR no tienen por que borradas, incluso si continúan no enmascaradas. Las excepciones en este caso ocurren inmediatamente, y una bandera de estado de excepciones de las extensiones Streaming SIMD que está activada cuando la correspondiente excepción no está enmascarada, no generará una excepción. Acciones típicas ejecutadas en este bajo nivel de rutina de editor de excepciones son:
- incrementar un contador de excepciones para mostrarlas más tarde.
- mostrar información de diagnóstico.
- abortar ejecuciones posteriores, o usar punteros de excepciones para construir una instrucción que funcione sin ellas, y ejecutarla.
- guardar información sobre excepciones en una estructura de datos que pase a tener un nivel más alto en el uso de editores de excepciones.
En la mayoría de los casos habrá 3 componentes en un editor de excepciones en punto flotante de bajo nivel: un 'prólogo', un 'cuerpo', y un 'epílogo'. El prólogo ejecuta funciones que deben protegidas de posibles interrupciones por servicios de mayor prioridad. Cuando el proceso crítico se completa, el prólogo puede re-activar las interrupciones y permitir a los editores de interrupciones de mayor prioridad reemplazar al editor de excepciones. El cuerpo examina la información de diagnóstico y hace una respuesta dependiente de la aplicación. Finalmente el epílogo hace lo inverso al prólogo; restaura el estado normal del procesador para retomar la ejecución normal.
Una instrucción de las extensiones Streaming SIMD se puede ejecutar en paralelo con otras similares, con instrucciones de enteros, en punto flotante, o instrucciones MMX. La sincronización de excepciones será también necesaria, y es similar a lo que expliqué con la sincronización de los editores de excepciones de la FPU.
- Si la excepción está enmascarada, es producido un resultado por defecto que es aceptable en la mayoría de las situaciones. No se emite indicación externa, pero la correspondiente bandera de excepción en el MXCSR se establece y puede ser examinada más tarde.
- Si no está enmascarada, un editor de excepciones registrado previamente por el usuario será invocado a través de la excepción vector 19 del SIMD en punto flotante.
La rutina para invocar al editor de excepciones a través de la interrupción en el vector 19 es normalmente parte del kernel del software del sistema. Una entrada en la tabla de descripción de interrupciones debe ser seleccionada previamente por este vector. Algunos compiladores usan librerías run-time para ayudar en la edición de excepciones en punto flotante. Si cualquier operación en punto flotante de la FPU va a ser ejecutada y es posible que produzca una excepción en punto flotante, entonces la rutina de edición de excepciones debe desactivar todas las excepciones en punto flotante o la debe implementar como nueva candidata. Si no es el caso, la rutina debe borrar el estado de las banderas de las excepciones FPU, o enmascarar todas las excepciones en punto flotante de la FPU. Para las excepciones en punto flotante de las extensiones Streaming SIMD, las banderas de excepciones en MXCSR no tienen por que borradas, incluso si continúan no enmascaradas. Las excepciones en este caso ocurren inmediatamente, y una bandera de estado de excepciones de las extensiones Streaming SIMD que está activada cuando la correspondiente excepción no está enmascarada, no generará una excepción. Acciones típicas ejecutadas en este bajo nivel de rutina de editor de excepciones son:
- incrementar un contador de excepciones para mostrarlas más tarde.
- mostrar información de diagnóstico.
- abortar ejecuciones posteriores, o usar punteros de excepciones para construir una instrucción que funcione sin ellas, y ejecutarla.
- guardar información sobre excepciones en una estructura de datos que pase a tener un nivel más alto en el uso de editores de excepciones.
En la mayoría de los casos habrá 3 componentes en un editor de excepciones en punto flotante de bajo nivel: un 'prólogo', un 'cuerpo', y un 'epílogo'. El prólogo ejecuta funciones que deben protegidas de posibles interrupciones por servicios de mayor prioridad. Cuando el proceso crítico se completa, el prólogo puede re-activar las interrupciones y permitir a los editores de interrupciones de mayor prioridad reemplazar al editor de excepciones. El cuerpo examina la información de diagnóstico y hace una respuesta dependiente de la aplicación. Finalmente el epílogo hace lo inverso al prólogo; restaura el estado normal del procesador para retomar la ejecución normal.
Una instrucción de las extensiones Streaming SIMD se puede ejecutar en paralelo con otras similares, con instrucciones de enteros, en punto flotante, o instrucciones MMX. La sincronización de excepciones será también necesaria, y es similar a lo que expliqué con la sincronización de los editores de excepciones de la FPU.
Indicaciones para escribir un editor de excepciones de FPU
Como escribí en el capítulo "Unidad en punto flotante", la IA soporta 2 formas de acceso a editores de excepciones para manipular excepciones no enmascaradas de la FPU; el modo nativo y el compatible con MS-DOS. Lo primero de todo: ¿Por qué MS-DOS no entra en el 'modo nativo'? Los primeros procesadores no tenían unidad de punto flotante integrado en el mismo chip, la tenían en un chip coprocesador numérico separado. El primer coprocesador de ese tipo fue el Intel 8087. Para la salida de la señal de excepciones en punto flotante, este chip tiene un pin de salida INT que los diseñadores del 8087 recomendaron que fuera rutado a través de un controlador de interrupciones programable (PIC) hacia el pin INTR del procesador. Entonces el número del vector de interrupciones que lo acompaña podía ser usado para el acceso al editor de excepciones en punto flotante. Sin embargo, el diseño original del PC de IBM y del sistema operativo MS-DOS usaron un mecanismo diferente para editar la salida INT del 8087. Lo conectaban directamente al pin NMI de entrada del procesador. Entonces el editor de interrupciones de NMI tenía que diferenciar entre interrupciones producidas por una excepción en punto flotante, o por algún otro evento NMI.
Cuando la compatibilidad MS-DOS está activa para los procesadores Intel486 y Pentium y el pin de entrada IGNNE# se activa, la señal FERR# se genera así: 1º, cuando una instrucción FPU causa una excepción FPU no enmascarada, el procesador usa un método "a plazos" para reportar el error, es decir que el procesador no responde inmediatamente (está un tiempo 'congelado'); 2º Cuando se congela, activa la salida FERR#; 3º El procesador congelado espera a una interrupción externa, producida por un hardware en respuesta a la salida FERR#; 4º En sistemas compatibles con MS-DOS, FERR# está conectada a la entrada IRQ13 en la cascada del PIC, y éste genera una interrupción 75H. El método de comunicar el error "a plazos" es usado por todas las excepciones causadas por instrucciones básicas de aritmética, para las demás las guarda en memoria. Sin embargo algunas instrucciones de la FPU con algunas excepciones, usa un método inmediato para comunicar los errores.
Algunas implementaciones hardware han sido menos robustas porque dependían del editor de excepciones para borrar la excepción de petición de interrupción de la FPU en el PIC ANTES de que el editor causara FERR# por no ser confirmado por el borrado de la excepción de la misma FPU.
Si la compatibilidad está activa para procesadores de la familia P6, todo es casi idéntico a lo anterior, salvo que aquí todas las excepciones para todas las instrucciones de FPU causan un error que se comunica inmediatamente; FERR# se activa tan pronto como la FPU detecta un error no enmascarado, no hay esperas. El problema es que puede ser que la interrupción sea servida después de la siguiente instrucción de la secuencia del código, por lo tanto habrá un retraso que depende de la implementación del hardware externo.
Dependiendo de opciones determinadas por el software de diseño de sistemas, el procesador escoge una de dos opciones para actuar en caso de excepción numérica: La 1ª es que selecciona las excepciones por sí mismo produciendo un fix-up por defecto, que en la mayoría de las ocasiones es lo más razonable. Esto permite al programa numérico continuar sin molestias. Cuando detecta una excepción enmascarada, se establece una bandera en el registro numérico de estado pero no se especifica cuándo ocurrió ni dónde fue provocada; En la 2ª un software editor de excepciones puede ser invocado para editarla. Cuando una excepción numérica no está enmascarada y ocurre la excepción, la FPU para la ejecución de las instrucciones numéricas posteriores y provoca una llamada a un software editor de excepciones, que puede implementar cualquier procedimiento de recuperación.
La administración de sincronización requiere un control para las excepciones antes de dejar al procesador que cambie el valor usado por la FPU. Es importante recordar que casi todas las instrucciones numéricas pueden producir excepciones numéricas en determinadas circunstancias. La sincronización de excepciones se refiere a que el editor de excepciones inspecciona y se ocupa de la excepción en el contexto donde se ocurrió. Si la ejecución simultánea está permitida, la reserva del procesador cuando reconoce la excepción a veces no está en el contexto en el que se dio. Pudo haber cambiado sus registros internos y ejecutado un programa completamente diferente en el tiempo en el que ocurrió la excepción. Si el editor de excepciones no puede recapturar el contexto original, no se puede determinar la causa de la excepción ni se puede recuperar completamente de ella. Para resolver este problema, la FPU tiene registros especiales actualizados en el inicio de cada instrucción numérica, para describir la reserva del programa numérico cuando se intenta ejecutar la instrucción que provoca el fallo. Esto proporciona herramientas de ayuda al editor de excepciones para recapturar el contexto original, pero el código de la aplicación debe estar pensado con esta sincronización. Sin embargo, los compiladores de lenguajes de alto nivel ya proporcionan automáticamente toda sincronización requerida; sin embargo, en los lenguajes de bajo nivel es responsabilidad del programador.
Cuando la compatibilidad MS-DOS está activa para los procesadores Intel486 y Pentium y el pin de entrada IGNNE# se activa, la señal FERR# se genera así: 1º, cuando una instrucción FPU causa una excepción FPU no enmascarada, el procesador usa un método "a plazos" para reportar el error, es decir que el procesador no responde inmediatamente (está un tiempo 'congelado'); 2º Cuando se congela, activa la salida FERR#; 3º El procesador congelado espera a una interrupción externa, producida por un hardware en respuesta a la salida FERR#; 4º En sistemas compatibles con MS-DOS, FERR# está conectada a la entrada IRQ13 en la cascada del PIC, y éste genera una interrupción 75H. El método de comunicar el error "a plazos" es usado por todas las excepciones causadas por instrucciones básicas de aritmética, para las demás las guarda en memoria. Sin embargo algunas instrucciones de la FPU con algunas excepciones, usa un método inmediato para comunicar los errores.
Algunas implementaciones hardware han sido menos robustas porque dependían del editor de excepciones para borrar la excepción de petición de interrupción de la FPU en el PIC ANTES de que el editor causara FERR# por no ser confirmado por el borrado de la excepción de la misma FPU.
Si la compatibilidad está activa para procesadores de la familia P6, todo es casi idéntico a lo anterior, salvo que aquí todas las excepciones para todas las instrucciones de FPU causan un error que se comunica inmediatamente; FERR# se activa tan pronto como la FPU detecta un error no enmascarado, no hay esperas. El problema es que puede ser que la interrupción sea servida después de la siguiente instrucción de la secuencia del código, por lo tanto habrá un retraso que depende de la implementación del hardware externo.
Dependiendo de opciones determinadas por el software de diseño de sistemas, el procesador escoge una de dos opciones para actuar en caso de excepción numérica: La 1ª es que selecciona las excepciones por sí mismo produciendo un fix-up por defecto, que en la mayoría de las ocasiones es lo más razonable. Esto permite al programa numérico continuar sin molestias. Cuando detecta una excepción enmascarada, se establece una bandera en el registro numérico de estado pero no se especifica cuándo ocurrió ni dónde fue provocada; En la 2ª un software editor de excepciones puede ser invocado para editarla. Cuando una excepción numérica no está enmascarada y ocurre la excepción, la FPU para la ejecución de las instrucciones numéricas posteriores y provoca una llamada a un software editor de excepciones, que puede implementar cualquier procedimiento de recuperación.
La administración de sincronización requiere un control para las excepciones antes de dejar al procesador que cambie el valor usado por la FPU. Es importante recordar que casi todas las instrucciones numéricas pueden producir excepciones numéricas en determinadas circunstancias. La sincronización de excepciones se refiere a que el editor de excepciones inspecciona y se ocupa de la excepción en el contexto donde se ocurrió. Si la ejecución simultánea está permitida, la reserva del procesador cuando reconoce la excepción a veces no está en el contexto en el que se dio. Pudo haber cambiado sus registros internos y ejecutado un programa completamente diferente en el tiempo en el que ocurrió la excepción. Si el editor de excepciones no puede recapturar el contexto original, no se puede determinar la causa de la excepción ni se puede recuperar completamente de ella. Para resolver este problema, la FPU tiene registros especiales actualizados en el inicio de cada instrucción numérica, para describir la reserva del programa numérico cuando se intenta ejecutar la instrucción que provoca el fallo. Esto proporciona herramientas de ayuda al editor de excepciones para recapturar el contexto original, pero el código de la aplicación debe estar pensado con esta sincronización. Sin embargo, los compiladores de lenguajes de alto nivel ya proporcionan automáticamente toda sincronización requerida; sin embargo, en los lenguajes de bajo nivel es responsabilidad del programador.
miércoles, 26 de noviembre de 2008
Identificación del procesador y detección de características
Cuando se escribe un software previsto para funcionar en varios tipos de procesadores IA, generalmente es necesario identificar el tipo de procesador que lo ejecutará, para saber los elementos disponibles para la aplicación.
La instrucción CPUID retorna el tipo de procesador que la ejecuta. Está disponible sólo en Pentium, Pentium Pro, y los procesadores Intel486. También identifica las posibilidades presentes en el procesador, incluyendo la existencia de un chip FPU. Esta información se puede obtener de esa instrucción: El valor más alto del operando que responde a la instrucción; el número ID de identificación de la familia del procesador, el modelo ID, y el stepping ID; la presencia de un chip FPU; la información TLB y cache; el soporte o presencia de las siguientes extensiones de la arquitectura:
- modos mejorados de virtual-8086
- extensiones para depurar
- extensiones Page-size
- instrucción de lectura de contador time stamp (RDTSC)
- Lee los modelos específicos de registros (RDMSR) y escribe instrucciones de esos modelos (WRMSR)
- extensiones de direccionamiento físico
- excepciones de comprobación de máquina
- compara e intercambia instrucciones de 8 bytes (CMPXCHG8B)
- en chip, controlador avanzado programable de interrupciones (APIC)
- rango de registros de tipo de memoria (MTRR)
- bandera global de page
- control de arquitectura de la máquina
- instrucción de movimiento condicional (CMOVcc)
- tecnología MMX
La instrucción causará la excepción de opcode no válido (#UD) si es ejecutada por un procesador que no la soporte.
La instrucción CPUID retorna el tipo de procesador que la ejecuta. Está disponible sólo en Pentium, Pentium Pro, y los procesadores Intel486. También identifica las posibilidades presentes en el procesador, incluyendo la existencia de un chip FPU. Esta información se puede obtener de esa instrucción: El valor más alto del operando que responde a la instrucción; el número ID de identificación de la familia del procesador, el modelo ID, y el stepping ID; la presencia de un chip FPU; la información TLB y cache; el soporte o presencia de las siguientes extensiones de la arquitectura:
- modos mejorados de virtual-8086
- extensiones para depurar
- extensiones Page-size
- instrucción de lectura de contador time stamp (RDTSC)
- Lee los modelos específicos de registros (RDMSR) y escribe instrucciones de esos modelos (WRMSR)
- extensiones de direccionamiento físico
- excepciones de comprobación de máquina
- compara e intercambia instrucciones de 8 bytes (CMPXCHG8B)
- en chip, controlador avanzado programable de interrupciones (APIC)
- rango de registros de tipo de memoria (MTRR)
- bandera global de page
- control de arquitectura de la máquina
- instrucción de movimiento condicional (CMOVcc)
- tecnología MMX
La instrucción causará la excepción de opcode no válido (#UD) si es ejecutada por un procesador que no la soporte.
Entrada/Salida
Además de poder transferir datos desde y hacia la memoria interna, también se pueden transferir desde y hacia memoria externa a través de los puertos de entrada/salida. Estos puertos son creados físicamente por circuitos que decodifican los pines de control, de datos y de dirección del procesador. Están orientados a la comunicación con dispositivos periféricos, y pueden ser de entrada, de salida, o bidireccionales.
A los puertos de E/S del procesador se puede acceder de 2 formas: A través de un espacio separado de direcciones de E/S, o a través de memoria de E/S mapeada. Para acceder mediante la primera opción se recurre a las instrucciones especiales de E/S y un mecanismo especial de protección de E/S. Para acceder mediante la memoria mapeada se recurren al movimiento a través los registros de propósito general y las instrucciones string, con protección proporcionada a través de segmentación. Un beneficio de usar el acceso mediante un espacio separado de direcciones es que está garantizado el completar la escritura en los puertos de E/S antes de que se ejecute la siguiente instrucción.
Físicamente hablando, en los Pentium Pro, Pentium II, y Pentium III una transacción especial de memoria I/O en el bus del sistema indica si las líneas de acceso serán direccionadas a las direcciones de memoria o a las direcciones E/S. El espacio de direcciones de E/S consiste en un fragmento de memoria individual de 64 K direccionable a los 8 bits de los puertos de E/S, enumerados desde 0 a FFFFH (la 'H' es de hexadecimal). Las direcciones desde F8H hasta FF están reservadas, así que no se puede asignar puertos de E/S a ese rango. 2 puertos consecutivos de 8 bits cualesquiera pueden ser usados como uno de 16 bits, y 4 consecutivos como uno de 32 bits. De esta forma el procesador puede transferir datos de 8, de 16 o de 32 bits. Como en la memoria, los puertos de 16 bits deben estar alineados a direcciones pares, de modo que los 16 bits puedan ser transferidos en un ciclo de reloj, y los de 32 bits a direcciones múltiplos de 4. El procesador soporta transferencias hacia puertos no alineados, pero requiere uno o más ciclos de bus extra. El orden exacto de los ciclos de bus para acceder a puertos no alineados no está definido, y no está garantizado que sea el mismo en procesadores IA posteriores.
A los dispositivos de E/S que respondan como un componente de memoria se puede acceder a través del espacio de direcciones de memoria física del procesador. Cuando se usa el mapeado de memoria de E/S, todas las instrucciones del procesador que hagan referencia a la memoria pueden ser usadas para acceder a un puerto de E/S localizado en una dirección de memoria física. Por ejemplo, la instrucción MOV puede mover datos entre cualquier registro y un puerto de E/S mapeado en memoria.
Las instrucciones de E/S del procesador permiten el acceso a los puertos de E/S a través del espacio de direcciones de E/S (estas instrucciones no se pueden usar para acceder a puertos E/S mapeados en memoria), se dividen en 2 grupos: Los que transfieren un ítem único (sea un byte, un word, o un doubleword) entre un puerto de E/S y un registro de propósito general, y los que transfieren una cadena de ítems (cadenas de bytes, de words o de doublewords) entre un puerto E/S y la memoria.
Cuando el procesador está funcionando en modo protegido, existen mecanismos de protección para regular el acceso a los puertos de E/S. Cuando se accede a los puertos E/S mediante el espacio de direcciones de E/S, 2 mecanismos de control regulan el acceso a los puertos. El primero es el campo de nivel de privilegios de E/S en el registro EFLAGS (permite al sistema operativo o al programa establecer el nivel de privilegios necesario para ejecutar la E/S); el segundo es el permission bit map de E/S del segmento de estado de tareas (TSS) (se usa para permitir el acceso limitado a puertos de E/S a programas o tareas de menos privilegios). Cuando se accede a los puertos mediante memoria mapeada, la protección de segmentado normal y los MTRR (en procesadores que los soporten) afectan al acceso a los puertos de E/S.
Cuando se controlan dispositivos de E/S muchas veces es importante que la memoria y las operaciones de E/S se lleven a cabo exactamente en el orden en que fueron programadas. Por ejemplo, un programa si quiere escribir un comando a un puerto E/S, lee el estado del dispositivo E/S en otro puerto de E/S. Es importante que el estado retornado sea el estado del dispositivo ANTES de que reciba el comando, NO el de después. Un método recomendable para realizar esto cuando se accede a los puertos mediante memoria mapeada es usar los MTRR para hacer que no se utilice la caché en el espacio de direcciones de E/S de memoria mapeada. Otro método es introducir una de las instrucciones de serializing (como la instrucción CPUID) entre las operaciones.
Cuando el acceso es por espacio de direcciones E/S, la situación es diferente en dos sentidos: El primero, es que el procesador nunca utiliza el buffer para escrituras de E/S. Por lo tanto el orden no será alterado. El segundo es que el procesador sincroniza la ejecución de instrucciones E/S con la actividad externa del bus.
A los puertos de E/S del procesador se puede acceder de 2 formas: A través de un espacio separado de direcciones de E/S, o a través de memoria de E/S mapeada. Para acceder mediante la primera opción se recurre a las instrucciones especiales de E/S y un mecanismo especial de protección de E/S. Para acceder mediante la memoria mapeada se recurren al movimiento a través los registros de propósito general y las instrucciones string, con protección proporcionada a través de segmentación. Un beneficio de usar el acceso mediante un espacio separado de direcciones es que está garantizado el completar la escritura en los puertos de E/S antes de que se ejecute la siguiente instrucción.
Físicamente hablando, en los Pentium Pro, Pentium II, y Pentium III una transacción especial de memoria I/O en el bus del sistema indica si las líneas de acceso serán direccionadas a las direcciones de memoria o a las direcciones E/S. El espacio de direcciones de E/S consiste en un fragmento de memoria individual de 64 K direccionable a los 8 bits de los puertos de E/S, enumerados desde 0 a FFFFH (la 'H' es de hexadecimal). Las direcciones desde F8H hasta FF están reservadas, así que no se puede asignar puertos de E/S a ese rango. 2 puertos consecutivos de 8 bits cualesquiera pueden ser usados como uno de 16 bits, y 4 consecutivos como uno de 32 bits. De esta forma el procesador puede transferir datos de 8, de 16 o de 32 bits. Como en la memoria, los puertos de 16 bits deben estar alineados a direcciones pares, de modo que los 16 bits puedan ser transferidos en un ciclo de reloj, y los de 32 bits a direcciones múltiplos de 4. El procesador soporta transferencias hacia puertos no alineados, pero requiere uno o más ciclos de bus extra. El orden exacto de los ciclos de bus para acceder a puertos no alineados no está definido, y no está garantizado que sea el mismo en procesadores IA posteriores.
A los dispositivos de E/S que respondan como un componente de memoria se puede acceder a través del espacio de direcciones de memoria física del procesador. Cuando se usa el mapeado de memoria de E/S, todas las instrucciones del procesador que hagan referencia a la memoria pueden ser usadas para acceder a un puerto de E/S localizado en una dirección de memoria física. Por ejemplo, la instrucción MOV puede mover datos entre cualquier registro y un puerto de E/S mapeado en memoria.
Las instrucciones de E/S del procesador permiten el acceso a los puertos de E/S a través del espacio de direcciones de E/S (estas instrucciones no se pueden usar para acceder a puertos E/S mapeados en memoria), se dividen en 2 grupos: Los que transfieren un ítem único (sea un byte, un word, o un doubleword) entre un puerto de E/S y un registro de propósito general, y los que transfieren una cadena de ítems (cadenas de bytes, de words o de doublewords) entre un puerto E/S y la memoria.
Cuando el procesador está funcionando en modo protegido, existen mecanismos de protección para regular el acceso a los puertos de E/S. Cuando se accede a los puertos E/S mediante el espacio de direcciones de E/S, 2 mecanismos de control regulan el acceso a los puertos. El primero es el campo de nivel de privilegios de E/S en el registro EFLAGS (permite al sistema operativo o al programa establecer el nivel de privilegios necesario para ejecutar la E/S); el segundo es el permission bit map de E/S del segmento de estado de tareas (TSS) (se usa para permitir el acceso limitado a puertos de E/S a programas o tareas de menos privilegios). Cuando se accede a los puertos mediante memoria mapeada, la protección de segmentado normal y los MTRR (en procesadores que los soporten) afectan al acceso a los puertos de E/S.
Cuando se controlan dispositivos de E/S muchas veces es importante que la memoria y las operaciones de E/S se lleven a cabo exactamente en el orden en que fueron programadas. Por ejemplo, un programa si quiere escribir un comando a un puerto E/S, lee el estado del dispositivo E/S en otro puerto de E/S. Es importante que el estado retornado sea el estado del dispositivo ANTES de que reciba el comando, NO el de después. Un método recomendable para realizar esto cuando se accede a los puertos mediante memoria mapeada es usar los MTRR para hacer que no se utilice la caché en el espacio de direcciones de E/S de memoria mapeada. Otro método es introducir una de las instrucciones de serializing (como la instrucción CPUID) entre las operaciones.
Cuando el acceso es por espacio de direcciones E/S, la situación es diferente en dos sentidos: El primero, es que el procesador nunca utiliza el buffer para escrituras de E/S. Por lo tanto el orden no será alterado. El segundo es que el procesador sincroniza la ejecución de instrucciones E/S con la actividad externa del bus.
lunes, 24 de noviembre de 2008
Programando con las extensiones Streaming SIMD
Las extensiones Streaming SIMD de Intel son un conjunto de extensiones de la IA diseñados para aumentar el rendimiento de las aplicaciones avanzadas de comunicaciones o de multimedia (especialmente adecuadas para la decodificación de MPEG2, gráficas tridimensionales y reconocimiento de voz). Estas extensiones completan la tecnología MMX que ya expliqué.
Las extensiones Streaming SIMD definen un modelo de software simple y flexible. Este nuevo modelo introduce un nuevo estado visible del sistema operativo y para ello se dispone de un nuevo conjunto de registros de 128 bits añadidos. Cualquier software no hace falta que sea modificado para funcionar en un procesador con extensiones Streaming SIMD.
Estas extensiones permiten al programador desarrollar algoritmos que pueden mezclar datos en punto flotante compactados y enteros compactados, con precisión simple, usando las extensiones Streaming SIMD y las instrucciones MMX. Adicionalmente a esas instrucciones, las extensiones Streaming SIMD proporcionan otras nuevas para el control de la cacheability de la tecnología MMX y los tipos de datos de 32 bits. Estas instrucciones nuevas permiten guardar muchos datos en memoria sin tener que contaminar la cache, o también permiten precargar los datos antes de usarlos. Además de las instrucciones también proporciona 8 registros SIMD en punto flotante (de XMM0 a XMM7) a los que se puede direccionar directamente, tipos de datos compactados SIMD de 128 bits en punto flotante, y el conjunto de extensiones Streaming SIMD.
Los nuevos registros requieren soporte del sistema operativo para poder usarlos, y contienen datos compactados de 128 bits. Los registros se pueden usar para mejorar el rendimiento a la hora de calcular sobre los datos, pero no se pueden usar para direccionar a memoria. Para eso están los registros de enteros, los modos estándar de direccionamiento y los registros de propósito general. Los registros MMX están mapeados dentro de los registros de punto flotante. Para hacer la transición de operaciones MMX a operaciones en punto flotante es necesario ejecutar la instrucción EMMS. A partir de que los registros SIMD en punto flotante estén en registros separados, las instrucciones MMX y las de punto flotante se pueden mezclar con las extensiones Streaming SIMD sin excepciones de instrucción especial (como EMMS). Los valores en los registros tienen el mismo formato que una cuantía de 128 bits en memoria, y tienen 2 modos de acceso: modo de acceso de 128 bits y modo de acceso de 32 bits.
El tipo de datos principal de las extensiones Streaming SIMD es un operando compactado, en precisión simple, y en punto flotante. Son 4 doublewords (1 doubleword = 32 bits) compactados en 128 bits. También puede trabajar como 8 words, o como 16 bytes. Los bits de la derecha son los menos significativos. Las extensiones mueven desde y hacia la memoria estos tipos de datos compactados en bloques de 64 o 128 bits.
Las extensiones Streaming SIMD pueden generar 2 tipos de excepciones; no numéricas, y numéricas. Pueden generar los mismos tipos de excepciones de acceso a memoria que las instrucciones IA.
El registro de control/estado es usado para activar excepciones numéricas enmascaradas/desenmascaradas, para establecer modos de redondeo (4 métodos: hacia el más próximo, hacia abajo, hacia arriba, o truncar), para establecer el modo flush-to-zero (activando este modo, los resultados que den cero tendrán el verdadero signo de la operación, y las excepciones de precisión y underflow se activan), y para ver las banderas de estado. Los contenidos de estos registros se pueden guardar en memoria con STMXCSR (guarda el contenido del registro de estado/control SIMD en punto flotante) y FXSAVE (guarda el estado de la FPU y el estado de punto flotante SIMD) y se pueden cargar con las instrucciones LDMXCSR y FXRSTOR.
Las extensiones Streaming SIMD consisten en 70 instrucciones, agrupadas en las siguientes categorías: instrucciones de movimiento de datos, instrucciones aritméticas, instrucciones de comparación, instrucciones de conversión, instrucciones lógicas, instrucciones adicionales de enteros SIMD, instrucciones Shuffle, instrucciones de manejo de estado, y instrucciones de control de la cacheability.
Las extensiones introducen un nuevo estado en la arquitectura, y no están reñidas con los registros en punto flotante (como lo estaban las instrucciones originales MMX). Las nuevas instrucciones deben de ser usadas para guardar/restablecer el estado de un Pentium III. Se puede programar sin problemas usando a la vez las extensiones y la FPU (una aplicación puede usar la FPU para operaciones con precisión doble o extendida), o las extensiones y la MMX también sin problemas. Pero los problemas siguen si se utiliza a la vez la FPU y la MMX, porque siguen compartiendo los mismos registros.
Las extensiones Streaming SIMD definen un modelo de software simple y flexible. Este nuevo modelo introduce un nuevo estado visible del sistema operativo y para ello se dispone de un nuevo conjunto de registros de 128 bits añadidos. Cualquier software no hace falta que sea modificado para funcionar en un procesador con extensiones Streaming SIMD.
Estas extensiones permiten al programador desarrollar algoritmos que pueden mezclar datos en punto flotante compactados y enteros compactados, con precisión simple, usando las extensiones Streaming SIMD y las instrucciones MMX. Adicionalmente a esas instrucciones, las extensiones Streaming SIMD proporcionan otras nuevas para el control de la cacheability de la tecnología MMX y los tipos de datos de 32 bits. Estas instrucciones nuevas permiten guardar muchos datos en memoria sin tener que contaminar la cache, o también permiten precargar los datos antes de usarlos. Además de las instrucciones también proporciona 8 registros SIMD en punto flotante (de XMM0 a XMM7) a los que se puede direccionar directamente, tipos de datos compactados SIMD de 128 bits en punto flotante, y el conjunto de extensiones Streaming SIMD.
Los nuevos registros requieren soporte del sistema operativo para poder usarlos, y contienen datos compactados de 128 bits. Los registros se pueden usar para mejorar el rendimiento a la hora de calcular sobre los datos, pero no se pueden usar para direccionar a memoria. Para eso están los registros de enteros, los modos estándar de direccionamiento y los registros de propósito general. Los registros MMX están mapeados dentro de los registros de punto flotante. Para hacer la transición de operaciones MMX a operaciones en punto flotante es necesario ejecutar la instrucción EMMS. A partir de que los registros SIMD en punto flotante estén en registros separados, las instrucciones MMX y las de punto flotante se pueden mezclar con las extensiones Streaming SIMD sin excepciones de instrucción especial (como EMMS). Los valores en los registros tienen el mismo formato que una cuantía de 128 bits en memoria, y tienen 2 modos de acceso: modo de acceso de 128 bits y modo de acceso de 32 bits.
El tipo de datos principal de las extensiones Streaming SIMD es un operando compactado, en precisión simple, y en punto flotante. Son 4 doublewords (1 doubleword = 32 bits) compactados en 128 bits. También puede trabajar como 8 words, o como 16 bytes. Los bits de la derecha son los menos significativos. Las extensiones mueven desde y hacia la memoria estos tipos de datos compactados en bloques de 64 o 128 bits.
Las extensiones Streaming SIMD pueden generar 2 tipos de excepciones; no numéricas, y numéricas. Pueden generar los mismos tipos de excepciones de acceso a memoria que las instrucciones IA.
El registro de control/estado es usado para activar excepciones numéricas enmascaradas/desenmascaradas, para establecer modos de redondeo (4 métodos: hacia el más próximo, hacia abajo, hacia arriba, o truncar), para establecer el modo flush-to-zero (activando este modo, los resultados que den cero tendrán el verdadero signo de la operación, y las excepciones de precisión y underflow se activan), y para ver las banderas de estado. Los contenidos de estos registros se pueden guardar en memoria con STMXCSR (guarda el contenido del registro de estado/control SIMD en punto flotante) y FXSAVE (guarda el estado de la FPU y el estado de punto flotante SIMD) y se pueden cargar con las instrucciones LDMXCSR y FXRSTOR.
Las extensiones Streaming SIMD consisten en 70 instrucciones, agrupadas en las siguientes categorías: instrucciones de movimiento de datos, instrucciones aritméticas, instrucciones de comparación, instrucciones de conversión, instrucciones lógicas, instrucciones adicionales de enteros SIMD, instrucciones Shuffle, instrucciones de manejo de estado, y instrucciones de control de la cacheability.
Las extensiones introducen un nuevo estado en la arquitectura, y no están reñidas con los registros en punto flotante (como lo estaban las instrucciones originales MMX). Las nuevas instrucciones deben de ser usadas para guardar/restablecer el estado de un Pentium III. Se puede programar sin problemas usando a la vez las extensiones y la FPU (una aplicación puede usar la FPU para operaciones con precisión doble o extendida), o las extensiones y la MMX también sin problemas. Pero los problemas siguen si se utiliza a la vez la FPU y la MMX, porque siguen compartiendo los mismos registros.
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.
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.
Suscribirse a:
Entradas (Atom)