>
>

El microprocesador Pentium

Por Dario Alejandro Alpern

Introducción

El 19 de octubre de 1992, Intel anunció que la quinta generación de su línea de procesadores compatibles (cuyo código interno era el P5) llevaría el nombre Pentium en vez de 586 u 80586, como todo el mundo estaba esperando. Esta fue una estrategia de Intel para poder registrar la marca y así poder diferir el nombre de sus procesadores del de sus competidores (AMD y Cyrix principalmente).

Este microprocesador se presentó el 22 de marzo de 1993 con velocidades iniciales de 60 y 66 MHz (112 millones de instrucciones por segundo en el último caso), 3.100.000 transistores (fabricado con el proceso BICMOS (Bipolar-CMOS) de 0,8 micrones), caché interno de 8 KB para datos y 8 KB para instrucciones, verificación interna de paridad para asegurar la ejecución correcta de las instrucciones, una unidad de punto flotante mejorada, bus de datos de 64 bit para una comunicación más rápida con la memoria externa y, lo más importante, permite la ejecución de dos instrucciones simultáneamente. El chip se empaqueta en formato PGA (Pin Grid Array) de 273 pines.

Como el Pentium sigue el modelo del procesador 386/486 y añade unas pocas instrucciones adicionales pero ningún registro programable, ha sido denominado un diseño del tipo 486+. Esto no quiere decir que no hay características nuevas o mejoras que aumenten la potencia. La mejora más significativa sobre el 486 ha ocurrido en la unidad de punto flotante. Hasta ese momento, Intel no había prestado mucha atención a la computación de punto flotante, que tradicionalmente había sido el bastión de las estaciones de ingeniería. Como resultado, los coprocesadores 80287 y 80387 y los coprocesadores integrados en la línea de CPUs 486 DX se han considerado anémicos cuando se les compara con los procesadores RISC (Reduced Instruction Set Computer), que equipan dichas estaciones.

Todo esto ha cambiado con el Pentium: la unidad de punto flotante es una prioridad para Intel, ya que debe competir en el mercado de Windows NT con los procesadores RISC tales como el chip Alpha 21064 de Digital Equipment Corporation y el MIPS R4000 de Silicon Graphics. Esto puede ayudar a explicar por qué el Pentium presenta un incremento de 5 veces en el rendimiento de punto flotante cuando se le compara con el diseño del 486. En contraste, Intel sólo pudo extraer un aumento del doble para operaciones de punto fijo o enteros.

El gran aumento de rendimiento tiene su contraparte en el consumo de energía: 13 watt bajo la operación normal y 16 watt a plena potencia (3,2 amperes x 5 volt = 16 watt), lo que hace que el chip se caliente demasiado y los fabricantes de tarjetas madres (motherboards) tengan que agregar complicados sistemas de refrigeración.

Teniendo esto en cuenta, Intel puso en el mercado el 7 de marzo de 1994 la segunda generación de procesadores Pentium. Se introdujo con las velocidades de 90 y 100 MHz con tecnología de 0,6 micrones y Posteriormente se agregaron las versiones de 120, 133, 150, 160 y 200 MHz con tecnología de 0,35 micrones. En todos los casos se redujo la tensión de alimentación a 3,3 volt. Esto redujo drásticamente el consumo de electricidad (y por ende el calor que genera el circuito integrado). De esta manera el chip más rápido (el de 200 MHz) consume lo mismo que el de 66 MHz. Estos integrados vienen con 296 pines. Además la cantidad de transistores subió a 3.300.000. Esto se debe a que se agregó circuitería adicional de control de clock, un controlador de interrupciones avanzado programable (APIC) y una interfaz para procesamiento dual (facilita el desarrollo de motherboards con dos Pentium).

En octubre de 1994, un matemático reportó en Internet que la Pentium tenía un error que se presentaba cuando se usaba la unidad de punto flotante para hacer divisiones (instrucción FDIV) con determinadas combinaciones de números. Por ejemplo:

962 306 957 033 / 11 010 046 = 87 402,6282027341 (respuesta correcta)
962 306 957 033 / 11 010 046 = 87 399,5805831329 (Pentium fallada)

El defecto se propagó rápidamente y al poco tiempo el problema era conocido por gente que ni siquiera tenía computadora. Este bug se arregló en las versiones D1 y posteriores de los Pentium 60/66 MHz y en las versiones B5 y posteriores de los Pentium 75/90/100 MHz. Los Pentium con velocidades más elevadas se fabricaron posteriormente y no posee este problema.

En enero de 1997 apareció una tercera generación de Pentium, que incorpora lo que Intel llama tecnología MMX (MultiMedia eXtensions) con lo que se agregan 57 instrucciones adicionales. Están disponibles en velocidades de 66/166 MHz, 66/200 MHz y 66/233 MHz (velocidad externa/interna). Las nuevas características incluyen una unidad MMX y el doble de caché. El Pentium MMX tiene 4.500.000 transistores con un proceso CMOS-silicio de 0,35 micrones mejorado que permite bajar la tensión a 2,8 volt. Externamente posee 321 pines.

Arquitectura

Vías de acceso múltiples

Lo que comenzó con la técnica del 386/486 de tener vías de acceso múltiples para la ejecución de instrucciones, se ve refinado en el Pentium ya que tiene un diseño con doble vía de acceso. El objetivo de ésta es el de procesar múltiples instrucciones simultáneamente, en varios estados de ejecución, para obtener una velocidad de ejecución general de instrucciones de una instrucción por ciclo de reloj.

El resultado final de la estructura doble vía de acceso es un diseño superescalar que tiene la habilidad de ejecutar más de una instrucción en un ciclo de reloj dado. Los procesadores escalares, como la familia del 486, tienen sólo una vía de acceso.

Se puede pensar que el microprocesador moderno con vías de acceso doble es similar a una línea de producción que recibe en un extremo materias primas sin procesar y a medio procesar y que saca el producto terminado en el otro extremo. La línea de producción con vía de acceso doble del Pentium transforma la materia prima de información y de código de software en el producto terminado. El Pentium sigue el modelo de vía de acceso del 486, ejecutando instrucciones simples con enteros en un ciclo de reloj. Sin embargo es más exacto decir que aquellas instrucciones estaban en la etapa de ejecución de la vía de acceso durante un ciclo de reloj. Siempre se requieren ciclos adicionales de reloj para buscar, decodificar la instrucción y otros procesos vitales. La secuencia de funcionamiento de la vía de datos es como sigue: prebúsqueda, decodificación 1, decodificación 2, ejecución y retroescritura.

Esto es similar a una línea de producción que produce un artículo por minuto, pero que se demora varias horas para completar cada artículo individual, y siempre habrá una multitud de unidades en diferentes etapas del ensamblado. En el caso óptimo, las instrucciones estarían alineadas en la vía de acceso de forma que, en general, ésta ejecutará aproximadamente una instrucción por ciclo de reloj.

Los aspectos superescalares del Pentium dependen de su vía de acceso doble. Los procesadores superescalares permiten que se ejecute más de una instrucción por vez. El procesador tiene dos vías de acceso de enteros, una en forma de U y otra en forma de V y automáticamente aparea las instrucciones para incrementar la proporción de instrucciones por ciclo de reloj para que sea mayor que 1. Si el tener múltiples instrucciones pasando por dos vías suena como el equivalente de un tranque en el tráfico del microprocesador, eso no es así, porque hay reglas y restricciones que evitan las colisiones y los retrasos.

Por ejemplo, los conflictos principales que tienen que ver con generar y ejecutar más de una instrucción al mismo tiempo incluyen dependencias de información (de un par de instrucciones que se emiten al mismo tiempo, la información de salida de una se necesita como entrada de otra, como por ejemplo INC AX, INC AX), dependencias de recursos (es una situación en la que ambas instrucciones que fueron emitidas al mismo tiempo compiten por el mismo recurso del microprocesador, por ejemplo, un registro específico. Hay técnicas avanzadas que permiten disminuir estas dependencias pero el Pentium no las tiene) o saltos en el código (llamadas dependencias de procedimiento).

Si se detectara una dependencia, el procesador reconoce que las instrucciones deben fluir en orden y asegura que la primera instrucción termine su ejecución antes de generar la segunda instrucción. Por ejemplo, el Pentium envía la primera instrucción por la vía U y genera la segunda y tercera instrucciones juntas, y así sucesivamente.

Las dos vías no son equivalentes, o intercambiables. La vía U ejecuta instrucciones de enteros y de punto flotante, mientras que la vía V sólo puede ejecutar instrucciones simples con enteros y la instrucción de intercambio de contenido de registros de punto flotante.

El orden en que viajan las instrucciones por las vías dobles del Pentium nunca es distinto al orden de las instrucciones en el programa que se ejecuta. También tanto las instrucciones para la vía U como la V entran a cada etapa de la ruta en unísono. Si una instrucción en una vía termina una etapa antes de que la instrucción en la otra vía, la más adelantada espera por la otra antes de pasar a la próxima etapa.

Las instrucciones de punto flotante, comúnmente utilizadas en programas de matemática intensiva, pasan las vías de entero y son manipuladas desde la vía de punto flotante en la etapa de ejecución. En definitiva las vías de enteros y el de punto flotante operan independiente y simultáneamente.

Dependencias de procedimiento

Puede ocurrir un problema potencial con la ejecución debido a las muchas trayectorias que la secuencia de una instrucción puede tomar. La predicción de la trayectoria a tomar es el método que debe usarse aquí. El Pentium dibuja algo parecido a un mapa de carreteras de los lugares a donde es posible que se dirija la instrucción y lo usa para tratar de agilizar la ejecución de la instrucción. Intel afirma que esta característica, por sí sola, aumenta el rendimiento un 25%.

Sin predecir las trayectorias a tomar, si un procesador superescalar doble estuviera ocupado procesando instrucciones en ambas vías de acceso y se encontrara una instrucción de salto que cambiara la secuencia de ejecución de la instrucción, ambas vías y el buffer de prebúsqueda de instrucción tendrían que borrarse y cargarse con nuevas instrucciones, lo que retrasaría al procesador. Con la predicción de la trayectoria a tomar, el procesador precarga las instrucciones de una dirección de destino que haya sido pronosticada de un juego alterno de buffers. Esto le da al procesador una ventaja para reducir los conflictos y las demoras. El resultado es una mejor utilización de los recursos del procesador.

Hay dos tipos de instrucciones de salto: condicional e incondicional. Un salto incondicional siempre lleva el flujo de la instrucción a una nueva dirección de destino y siempre se ejecuta. Una situación más incómoda es el salto condicional donde se puede o no desviar el flujo del programa de acuerdo a los resultados de una comparación o código de condición y puede incluir varios tipos de instrucciones.

Cuando no se ejecuta un salto condicional, el programa sigue ejecutando la próxima instrucción de la secuencia. Muchos programas tienen de un 10% a un 20% de instrucciones de salto condicional y hasta un 10% de saltos incondicionales. El porcentaje de veces que se ejecuta un salto condicional varía de programa a programa, pero es de un promedio de un 50%. Las instrucciones de lazo o de repetición hace que se tomen decisiones frecuentemente, hasta el 90% del tiempo en algunos casos. Un buen sistema de predicción de decisiones escogerá las trayectorias correctas más del 80% del tiempo.

Físicamente, la unidad de predicción de decisiones (BPU) está situada al lado de la vía de acceso, y revisa con anticipación el código de la instrucción para determinar las conexiones de las decisiones. El orden es algo así: La BPU inspecciona las instrucciones en la etapa de prebúsqueda, y si la lógica de predicción de decisiones predice que se va a realizar el salto, se le indica inmediatamente a la unidad de prebúsqueda (PU) que comience a buscar instrucciones de la dirección de destino de la dirección que se predijo. De forma alterna, si se determinó que no se iba a tomar la decisión, no se perturba la secuencia original de prebúsqueda. Si la trayectoria pronosticada resulta ser errónea, se vacía la vía de acceso y los buffers alternos de prebúsqueda, y se recomienza la prebúsqueda desde la trayectoria correcta. Se paga una penalidad de tres o cuatro ciclos de reloj por predecir una trayectoria de forma errónea.

El Pentium usa un buffer de decisión de destino (BTB) como su mecanismo. El BTB incluye tres elementos por cada entrada: la dirección de la instrucción de salto, la dirección de destino de la instrucción y los bits de historia. Se usa una tabla de hasta 256 entradas para predecir los resultados de las decisiones. El flujo está basado, y se administra directamente desde la vía U. Se usa la dirección de la vía U para la dirección de la instrucción de decisión del BTB, aún si la decisión está realmente en la vía V. Hay dos bits de historia que informan si se tomó la decisión anterior o no. El resultado es un procesador que corre con suavidad y que a menudo sabe lo que hará antes de completar la tarea.

Ejecución de punto flotante en el Pentium

Se ha reconstruido por completo la unidad de punto flotante (FPU), a partir de la de los 386 y 486 y ahora tiene algunas de las características de los RISC. Hay ocho etapas de vía y las cinco primeras se comparten con la unidad de enteros. La unidad cumple con la norma IEEE-754, usa algoritmos más rápidos y aprovecha la arquitectura con vías para lograr mejoras de rendimiento de entre 4 y 10 veces, dependiendo de la optimización del compilador.

Ahorro de energía

El Pentium usa un modo de administración de sistema (SMM) similar al que usa el 486 SL, que permite que los ingenieros diseñen un sistema con bajo consumo. La interrupción de administración del sistema activa el SMM por debajo del nivel del sistema operativo o de la aplicación. Se guarda toda la información sobre el estado de los registros para después restaurarla, y se ejecuta el código de manejador de SMM desde un espacio de direcciones totalmente separado, llamado RAM de administración del sistema (SMRAM). Se sale del SMM ejecutando una instrucción especial (RSM). Esto lleva al CPU de nuevo al mismo punto en que estaba cuando se llamó al SMM.

Algunos procesadores (100 MHz o más lentos) presentan problemas en este modo.

Nuevas instrucciones del microprocesador Pentium

Son las siguientes:

CMPXCHG8B reg, mem64 (Compare and Exchange 8 Bytes): Compara el valor de 64 bits ubicado en EDX:EAX con un valor de 64 bits situado en memoria. Si son iguales, el valor en memoria se reemplaza por el contenido de ECX:EBX y el indicador ZF se pone a uno. En caso contrario, el valor en memoria se carga en EDX:EAX y el indicador ZF se pone a cero.

CPUID (CPU Identification): Le informa al software acerca del modelo de microprocesador en que está ejecutando. Un valor cargado en EAX antes de ejecutar esta instrucción indica qué información deberá retornar CPUID. Si EAX = 0, se cargará en dicho registro el máximo valor de EAX que se podrá utilizar en CPUID (para el Pentium este valor es 1). Además, en la salida aparece la cadena de identificación del fabricante contenido en EBX, ECX y EDX. EBX contiene los primeros cuatro caracteres, EDX los siguientes cuatro, y ECX los últimos cuatro. Para los procesadores Intel la cadena es "GenuineIntel". Luego de la ejecución de CPUID con EAX = 1, EAX[3:0] contiene la identificación de la revisión del microprocesador, EAX[7:4] contiene el modelo (el primer modelo está indicado como 0001b) y EAX[11:8] contiene la familia (5 para el Pentium). EAX[31:12], EBX y ECX están reservados. El procesador pone el registro de características en EDX a 1BFh, indicando las características que soporta el Pentium. Un bit puesto a uno indica que esa característica está soportada. La instrucción no afecta los indicadores.

RDMSR (Read from Model-Specific Register): El valor en ECX especifica uno de los registros de 64 bits específicos del modelo del procesador. El contenido de ese registro se carga en EDX:EAX. EDX se carga con los 32 bits más significativos, mientras que EAX se carga con los 32 bits menos significativos.

RDTSC (Read from Time Stamp Counter): Copia el contenido del contador de tiempo (TSC) en EDX:EAX (el Pentium mantiene un contador de 64 bits que se incrementa por cada ciclo de reloj). Cuando el nivel de privilegio actual es cero el estado del bit TSD en el registro de control CR4 no afecta la operación de esta instrucción. En los anillos 1, 2 ó 3, el TSC se puede leer sólo si el bit TSD de CR4 vale cero.

RSM (Resume from System Management Mode): El estado del procesador se restaura utilizando la copia que se creó al entrar al modo de manejo del sistema (SMM). Sin embargo, los contenidos de los registros específicos del modelo no se afectan. El procesador sale del SMM y retorna el control a la aplicación o sistema operativo interrumpido. Si el procesador detecta alguna información inválida, entra en el estado de apagado (shutdown).

WRMSR (Write to Model-Specific Register): El valor en ECX especifica uno de los registros de 64 bits específicos del modelo del procesador. El contenido de EDX:EAX se carga en ese registro. EDX debe contener los 32 bits más significativos, mientras que EAX debe contener los 32 bits menos significativos.