Carlos Bernal Serra ([email protected]) Rafa Sospedra Cardona ([email protected]) Objetivos Estudiar una arquitectura segmentada, como es el caso de P6. Conocer todas las etapas de su segmentación. Ver la aplicación del algoritmo de Tomasulo a un caso comercial. Entender los distintos tipos de predicción y cómo afectan a una arquitectura segmentada. Distinguir los diferentes tipos de memoria y sus propiedades. Exponer los distintos niveles de memoria cache y su funcionamiento. Comprender el protocolo MESI para la coherencia de caches. Ofrecer una visión global de toda la familia P6. Índice Prólogo. 5 0. Introducción. 5 1. Segmentación (Pipeline de la arquitectura Intel P6). 6 1.1. Fase de búsqueda de instrucciones. 1.2. Fase de decodificación 1.3. Fase de ejecución 1.4. Fase de retiro 6 8 9 12 2. Predicción de saltos. 12 13 14 3. Memoria. 15 4. Memoria cache. 19 5. Distintas Implementaciones de la arquitectura Intel P6. Características, tecnología, situación en el mercado y 27 2.1. Predicción dinámica. 2.2. Predicción estática. 3.1. Memoria Uncacheable (UC) 3.2. Memoria Write-Combining (WC) 3.3. Memoria Write-Through (WT) 3.4. Memoria Write-Protected (WP) 3.5. Memoria Write-Back (WB) 4.1. Características de la cache L1 de datos. 4.2. Características de la cache L1 de instrucciones. 4.3. Características de la cache L2. 4.4. Coherencia de caches. Protocolo MESI. comparativas. 5.1. Pentium II. 5.2. Celeron. 5.3. Pentium III. 6. Conclusiones. Apéndice A. Predicción de saltos. Apéndice B. Listado de conversión de IA en ops. Apéndice C. Estudio práctico del comportamiento de la cache L1 y L2. Bibliografía. Anexos. Agradecimientos. 16 16 17 18 18 19 21 22 24 27 33 35 41 42 47 49 49 49 Prólogo. Esta memoria trata sobre la estructura y funcionamiento de la arquitectura P6 de Intel. Su objetivo es presentar, tan clara y completamente como sea posible, la naturaleza y las características de la familia P6, realizando un resumen de las diversas etapas de la segmentación, haciendo mención especial a la fase de ROB, predicción de saltos, memoria cache e implementaciones. Hemos elegido esta arquitectura por dos razones. Nos parecía interesante adentrarnos en un modelo que ha servido para obtener numerosas implementaciones y ha liderado el mercado de los procesadores durante una buena cantidad de años, y porque es difícil encontrar bibliografía en castellano que documente correctamente los detalles que vamos a tratar. Además nos ha permitido resolver nuestras dudas y esperamos que pueda servir de ayuda a alguien en un futuro. Recomendamos una lectura pausada y un detenimiento imprescindible en las ilustraciones y esquemáticos que se adjuntan. 0. Introducción. Mientras que la microarquitectura del Pentium (P54, P55C) arrastraba el legado del 486, en el P6 es difícil encontrar algún rastro del Pentium. El equipo de diseñadores de Intel desechó la mayoría de las técnicas de diseño utilizadas con el 486 y el Pentium y comenzaron de nuevo. El resultado es un nuevo procesador totalmente distinto comparado con los anteriores diseños x86 de Intel. El incremento de prestaciones respecto al Pentium está totalmente relacionado con la ejecución de instrucciones “fuera de orden”. En Pentium, si una instrucción tarda varios ciclos en ejecutarse el procesador entero espera hasta que la instrucción se ejecute; en la misma situación, P6 sigue ejecutando las siguientes instrucciones mientras la instrucción parada puede continuar. Dado que existen numerosas implementaciones de la arquitectura P6 vamos a realizar una descripción detallada del Pentium Pro (el primer procesador que la incorpora) y que es la base del resto. En el 1er punto indicamos las distintas etapas de segmentación de la arquitectura, separándolas en distintas fases. Damos principal importancia a la fase de ejecución donde se puede ver con detalle los distintos elementos que permiten aplicar el algoritmo de Tomasulo. El siguiente punto describe la predicción de saltos en esta arquitectura. Totalmente unido a este punto está el Apéndice B que explica la evolución de los algoritmos de predicción y detalla el de Yeh, que implementa P6. En el apartado 3 se puede encontrar información de los distintos tipos de memoria en P6. En el punto 4 documentamos la memoria cache del Pentium Pro y el funcionamiento del protocolo MESI. El capítulo 5 sirve para ampliar la visión de la arquitectura P6 al resto de implementaciones ofreciendo los cambios de cada modelo, detalles técnicos y comparativas. 5 1. Pipeline de la arquitectura Intel P6. El Pentium Pro es el primer procesador de la arquitectura P6. Es un microprocesador superescalar segmentado en pipeline de 11 etapas. A continuación podemos ver un esquema. Pipeline del Pentium Pro. Figura 1 El pipeline de dicho procesador tiene las siguientes etapas, que podemos ver indicadas también sobre el esquema anterior. IFU1 IFU2 IFU3 DEC1 DEC2 RAT ROB DIS EX RET1 RET2 Pasamos a describir cada etapa y la evolución de las instrucciones por el pipeline. Fase de búsqueda de instrucciones (Instruction Fetch Unit). Esta fase se puede descomponer en 3 etapas, al finalizar tendremos las instrucciones de la Arquitectura Intel (IA) preparadas para ser decodificadas en µop para su posterior ejecución: • IFU1: En la primera etapa del pipeline, se cargan líneas de 32 bytes de la cache de instrucciones, en el Instruction Streaming Buffer (fig. 1). El pipeline se 6 alimenta del Instruction Streaming Buffer (IFU1) solicitándole bloques de 16 bytes. Cuando este buffer se vacía, la lógica de prefetch de esta etapa realiza una petición a la cache de instrucciones para traer los siguientes 32 bytes. Siempre se cargan bloques alineados de 32 bytes, aunque con ello se partan instrucciones. • IFU2: Como las instrucciones de la Arquitectura Intel (IA) son de un tamaño variable, se deben delimitar las fronteras de las instrucciones. En esta etapa se realizan dos acciones simultaneas: o o Etapa de fetch. Figura 2 Se delimitan las instrucciones de la IA de la línea cargada en la etapa anterior y se añaden marcas que las delimitan. Si alguna es un salto, se presenta a la BTB (Branch Target Buffer) la dirección por la que fue buscada esta instrucción, para activar el mecanismo de predicción dinámica de saltos. Mientras con se encuentre una instrucción de salto predicho como tomado (taken) o un salto incondicional el mecanismo de prebúsqueda (IFU1) sigue trayendo bytes de la misma forma lineal. • IFU3: Si es necesario, se alinean correctamente las instrucciones IA con los decodificadores de la siguiente etapa (fig. 2). Cada instrucción de la IA debe ser traducida en una o más µ-operaciones (µops), cada una de las cuales ocupa 118 bits y contienen dos fuentes y un destino. En el procesador hay tres decodificadores, al decodificador cero pueden ir instrucciones que deban ser traducidas por hasta cuatro µops, en cambio a los decodificadores 1 y 2 sólo pueden llegar instrucciones que se descompongan en una única µop. En esta etapa se hace coincidir una µop compleja con el decodificador cero dejando a los otros dos µops simples. Utilizando las marcas delimitadoras introducidas en la etapa de IFU2, en esta etapa se utiliza un registro de desplazamiento para rotar las instrucciones y alinearlas de la manera más óptima con los decodificadores. Los casos posibles son los siguientes: Composición de las próximas 3 instrucciones IA simple, simple, simple Instrucciones decodificadas 3 simple, simple, compleja 3 simple, compleja, simple 3 simple, compleja, compleja 2 7 Descripción Optimizada. No se necesita rotación en la etapa DEC1 los 3 decoders decodifiquen las IA simultáneamente Con una rotación se consigue que en la etapa DEC1 los 3 decoders decodifiquen las IA simultáneamente Con dos rotaciones se consigue que en la etapa DEC1 los 3 decoders decodifiquen las IA simultáneamente Las primeras 2 IA se rotan y pasan a los decoders 0 y 1 compleja, simple, simple 3 compleja, simple, compleja 2 compleja, compleja, simple 1 compleja, compleja, compleja 1 Optimizada. No se necesita rotación en la etapa DEC1 los 3 decoders decodifiquen las IA simultáneamente Las dos primeras instrucciones IA se pasan a los decoders 0 y 1. Sólo la primera IA se pasa al decoder 0. Sólo la primera IA se pasa al decoder 0. La traducción a µops no está bien documentada por Intel, pero se conoce al menos el número de µops a las que corresponde cada instrucción de la IA. En el apéndice B se encuentra una relación del número de µop por las que son traducidas cada instrucción de la IA. Fase de Decodificación. Se puede dividir en dos etapas que se llamarán DEC1 y DEC2. En esta fase se obtienen las µops, bien a partir de los Decodificadores o bien del MIS (Micro Instruction Sequencer). • DEC1: Se traducen las instrucciones de la IA a µops. Como máximo se pueden decodificar tres instrucciones IA, que se envían en esta etapa a los tres decodificadores. En el decodificador cero se pueden tratar instrucciones que se descompongan en no más de cuatro µops, y en los otros dos, instrucciones con una longitud no superior a 7 bytes y que se decompongan en tan sólo una µop. El mejor caso se obtiene cuando se envía una instrucción compleja al decodificador cero y dos simples a los otros dos, decodificando en esta etapa 6 µops simultáneamente. Algunas instrucciones de la IA se descomponen en más de cuatro µops y no pueden ser tratadas por el decodificador cero. Éstas pasan al Micro Instruction 8 Sequencer (MIS), que es una ROM que memoriza el código de estas µops relacionadas con las instrucciones de la IA más complejas. • DEC2: En esta etapa se realizan dos operaciones: o o La µops obtenidas en la DEC1 se pasan a una cola (buffer) de decodificación en el orden estricto del programa original. Se pasan a lo sumo seis por ciclo, con lo que esta etapa pude durar en casos especiales más de un ciclo (instrucciones que pasaron por la MIS). Segunda oportunidad de detectar un salto. Cuando las instrucciones son depositadas en el Decoded Instruction Queue. El procesador detecta la existencia de algún salto, en caso de que alguna µop sea un salto, se presenta al Backstop Predictor para realizar predicciones estáticas tratando de predecir si el salto será tomado al ejecutarse o no. En el punto 2 se aporta más información a cerca de la predicción de saltos. Fase de ejecución. En esta fase se aplica el algoritmo de Tomasulo y se envían las µops a las Reservation Station (RS) donde comenzarán a ejecutarse. Está formada por tres etapas: la etapa de RAT, ROB, DIS y EX. Comenzamos con una breve descripción de cada una de las etapas y posteriormente comentaremos con detalle su funcionamiento. • RAT (Register Alias Table an Allocator stage): El juego de registros de la IA incluye únicamente 16 registros. De ellos ocho son de coma flotante y a estos se añaden los EAX, EBX, ECX, EDX, ESI, EDI, EBP y ESP. El escaso número de registros restringen al programador a utilizar muy pocas variables de datos. Cuando estos registros se terminan y el programador necesita acceder a datos de la memoria, se ve obligado a copiar el contenido de uno de los registros a memoria para luego copiar el dato que se necesitaba desde memoria a ese registro. Como por ejemplo en el siguiente fragmento de código: mov [mem1], EAX mov EAX, [mem2] Estas secuencias de código son muy usuales en programas de x86. El procesador en estos casos no puede ejecutar las dos instrucciones simultáneamente (porque EAX debe guardarse antes de que se pueda cargar con el nuevo valor). Esto se llama comúnmente como dependencia de datos y evita que las dos instrucciones se ejecuten simultáneamente. En esta etapa se determina si las µops toman algún operando de registro. Si es así, determinan si la referencia del dato que necesitan debe tomarse efectivamente del registro de la IA, o por el contrario la referencia se cambia a una entrada en el Buffer de reordenamiento (ROB), debido a un mecanismo de renombrado de registro que sirve para eliminar falsas dependencias de datos (algoritmo de Tomasulo ). • ROB: si hay entradas libres en el Buffer de reordenamiento, hasta tres µops pueden ser pasadas de la etapa RAT al ROB por ciclo de reloj. Se pasan a este buffer en orden estricto de programación. Si hay una entrada libre en las estaciones de reserva (RS) y todos los datos que necesita la instrucción están 9 disponibles, la µop se pasa también a la RS. Una vez situadas en el ROB, las RS pueden copiar múltiples µops, hasta cinco por ciclo, y ponerlas en la cola de las unidades de ejecución apropiadas. • DIS: etapa de dispatch. Cuando queda una entrada libre en las RS y los datos de una µop están disponibles, se pasa la µop a las RS. Entonces la instrucción es ‘despachada’ o enviada a ejecución en la unidad apropiada. Como vemos, la instrucción es enviada cuando tiene sus datos disponibles y existe una unidad de ejecución libre, es decir, no se mantiene el orden programado, la ejecución se realiza fuera de orden. • EX: fase de ejecución que tiene una duración variable en función del tipo de µop, aunque muchas pueden ser ejecutadas en un sólo ciclo. La ejecución es fuera de orden (a continuación en este mismo punto se encuentra información a cerca de la ejecución). Dada la importancia de esta fase, a continuación, realizamos un estudio más exhaustivo que detalla el funcionamiento del ROB y las unidades de ejecución. El ROB es un buffer circular que puede contener hasta 40 µops, y que también contiene los 40 registros hardware. 10 Intel no ha documentado cuales son exactamente los datos almacenados en el ROB, pero es posible que el esquema del contenido de este buffer sea: Elemento Estado Dirección de memoria Micro-op Registro de Alias Descripción Una µop en el ROB puede estar en alguno de los siguientes estados: • SD: programado para ejecución (scheduled for execution). Indica que la instrucción está en una RS pero que aún no se ha enviado a ninguna unidad de ejecución (EU). • DP: indica que la µop está a la cabeza de la cola de las RS para la correspondiente EU y va a pasar a ejecución. • EX: la µop se está ejecutando en la correspondiente EU. • WB: la µop ha finalizado su ejecución y los resultados se están pasando a los registros de la ROB. Si otras µops están paradas esperando los resultados de ésta, estos se les pasan directamente. • RR: la µop está preparada para ser retirada. • RT: la µop va ha ser retirada en este ciclo. Indica la dirección de memoria de la instrucción de la IA de la que se extrajo la µop. Indica si la instrucción es un salto o no. De esta forma se sabe qué instrucciones deben chequearse para que otra pase al estado RR. Registros de 80 bits de ancho para evitar falsas dependencias de datos mediante un renombrado de registros. Las µops entran en orden al ROB; después, son enviadas a la unidad de envío/ejecución (Reservation Station, RS) sin orden. La central de reserva (RS) las envía a su ejecución y guarda los resultados de nuevo en el ROB. La RS busca en el ROB µops cuyo estado indique que la µop dispone de todos sus operandos. Si está disponible la unidad de ejecución que necesita una µop, la RS capta esa misma µop y la envía a la unidad de ejecución conveniente. Se pueden enviar hasta 5 µops en un ciclo. Si hay más de una µop disponible para una unidad de ejecución dada, la RS las envía secuencialmente desde el ROB. Se trata de un tipo de disciplina FIFO (primero en entrar, primero en salir), que favorece la ejecución en orden, aunque en este momento el flujo de instrucciones se ha reordenado tanto, debido a las dependencias y a los saltos, que se encuentra sustancialmente desordenado. Hay 5 puertos que unen la RS a las cinco unidades de ejecución. El puerto 0 se utiliza para operaciones con enteros y coma flotante, con la excepción de operaciones sencillas con enteros y la gestión de las predicciones de salto erróneas, que se asignan al puerto 1. Los puertos restantes se utilizan para cargas y almacenamientos en memoria. Cuando se completa una ejecución, se actualiza la entrada adecuada del ROB, y la unidad de ejecución queda disponible para otra µop. Por último, las µops se retiran del ROB (fase RET) en orden. Para conseguir esto, las µops se retiran empezando por las más antiguas, después de que cada µop se haya señalado como lista para ser retirada. 11 El flujo sencillo de µops a través de la unidad de envío/ejecución se ve perturbado por las equivocaciones en la predicción de saltos (existe más información a cerca de este tema en el punto 2). Si una predicción de saltos resulta fallida, habrá µops en varias etapas de procesamiento que tengan que ser retiradas del pipeline. Esto es responsabilidad de la unidad de ejecución de saltos (Jump Execution Unit, JEU). Cuando se ejecuta una bifurcación, se compara el resultado con el que pronosticaría el hardware de predicción. Si los dos no coinciden, la JEU cambia el estado de todas las µops detrás de la bifurcación, para eliminarlas de la reserva de instrucciones. El destino correcto del salto se proporciona entonces a la unidad de predicción de saltos, que regenera el pipeline completo a partir de la nueva dirección destino. Fase de retiro. La unidad de retiro (Retire Unit, RU) va procesando el buffer de reordenación para entregar los resultados de la ejecución de instrucciones. En primer lugar, la RU debe tener presentes los fallos en las predicciones de salto, y las µops que se hayan ejecutado pero para las cuales los saltos precedentes no se hayan validado. Una vez que se determina que una µop se ha ejecutado y no es vulnerable a la eliminación debido a un fallo de predicción, se marca como lista para ser retirada. Cuando se ha retirado la instrucción previa, y todas las µops de la siguiente instrucción se han marcado como listas para ser retiradas, la RU actualiza los registros de la arquitectura afectados por esta instrucción, y quita del ROB la µop. La fase de retiro consta de estas dos etapas: • RET1: En esta etapa las instrucciones se marcan como preparadas para ser retiradas (RR). Esto sucede cuando una µop en el ROB ha terminado su ejecución y todos los saltos condicionales anteriores a dicha µop, en el orden programado, han sido resueltos determinando que efectivamente debía haberse ejecutado. • RET2: es la etapa de commit. La lógica de esta etapa chequea constantemente el estado de las µop más antiguas en el ROB. Cuando todas las instrucciones de la IA anteriores han sido retiradas, entonces la siguiente instrucción IA con sus µop en estado RR puede entregar los valores de su cálculo a los registros de la IA modificando así el estado del procesador (commit). Estas µops son borradas del ROB. Hasta tres µops por ciclo pueden realizar commit. Cabe destacar que, a pesar de realizarse una ejecución fuera de orden, en esta fase se reordenan las µops. De este modo se consigue una actualización coherente de los registros de estado del sistema. 2. PREDICCIÓN DE SALTOS. La predicción de saltos es muy importante en los procesadores segmentados, como es el Pentium Pro (arquitectura P6). Una correcta predicción de saltos es fundamental para obtener un buen rendimiento. Por esto, los ingenieros de Intel (y todos en general) han realizado numerosos estudios con el fin de obtener algoritmos que proporcionen mejores resultados. En el apéndice A hemos profundizado sobre este tema, estudiando los distintos métodos de predicción y cómo han evolucionado con el paso del tiempo. 12 A continuación se informa de las consecuencias y los tipos de predicciones en el procesador Pentium Pro. Como habíamos adelantado, la reducción de rendimiento por fallos de predicción es alta. Por ello, ya en la etapa IFU2, cuando se detecta que una de las instrucciones es un salto se pasa su dirección a la BTB para realizar una predicción. La BTB sólo hace predicciones para instrucciones que ha visto ejecutarse previamente. Entonces, según esta predicción dinámica pueden suceder dos cosas: • Si el salto se predice como tomado se borra el streaming prefetch buffer y todo lo que hay en el pipeline hasta la IFU2. Se pasa la dirección destino del salto a la IFU1 y la lógica de prefetch se encarga de buscar la siguiente línea de 32 bytes que va a continuación de la dirección destino del salto, y que debe ser almacenada en el prefetch streaming buffer. En la BTB se almacena la dirección con la que se llamó al salto para poder restaurar rápidamente el pipeline, en caso de detectar un fallo en la predicción. • Si el salto se predice como no tomado no se eliminan las instrucciones que vienen detrás, que ya están en el pipeline. Tampoco se limpia el prefetch streaming buffer y la lógica de búsqueda de instrucciones sigue su curso como hasta el momento. La instrucción de salto sigue su curso por las etapas del pipeline, se introduce en el ROB y es ejecutada por la JEU (Jump Execution Unit). Debido a la ejecución fuera de orden, muchas instrucciones posteriores al salto pueden haber finalizado su ejecución cuando finaliza la del salto. Si la predicción fue correcta todo está bien y las instrucciones pueden comenzar a ser retiradas, sin embargo si la predicción fue incorrecta: • • • • • Todas las instrucciones del ROB posteriores a la del salto son eliminadas del ROB junto con los resultados de su ejecución, es como si no se hubiesen ejecutado. Todas las instrucciones posteriores al salto, que estén en las RS o en las EU son también eliminadas. Todas las instrucciones en etapas anteriores del pipeline son eliminadas. El prefetch streaming buffer es borrado. La lógica de prefetch realiza una petición de instrucciones a partir de la dirección que debía haberse tomado en el salto y que fue almacenada en la BTB. Debido a la alta penalización sufrida por un fallo en la predicción los diseñadores introdujeron dos sistemas de predicción, dinámico y estático, que pasamos a describir a continuación (más información en el apéndice A). 2.1. Predicción dinámica. El BTB (Branch Target Buffer) implementa un algoritmo de predicción dinámico de dos niveles. Se trata de una cache especial que almacena los datos necesarios para realizar predicciones sobre saltos que se han ejecutado alguna vez anteriormente. Cuando una instrucción de salto pasa por la etapa IFU2 su dirección se presenta a la BTB. La primera vez que se presenta una instrucción a la BTB se 13 produce un fallo de BTB y el salto se predice como no tomado. Una vez ejecutado el salto en la JEU (Jump Execution Unit), se crea una entrada en la BTB para dicho salto. Cada entrada en la BTB almacena los siguientes datos: • • La dirección desde la que se leyó el salto. Si el salto se tomó o no se tomó y, si se tomó, la dirección destino del salto. El tamaño y organización del BTB es específico del diseño. La implementación en el Pentium-Pro es de 4 vías, asociativa por conjuntos con 512 entradas. Es capaz de reconocer patrones de comportamiento como tomado (taken) o no tomado (not taken). El algoritmo utilizado se denomina algoritmo de Yeh (se detalla con profundidad en el apéndice A) y es de dos niveles y adaptativo. Cada entrada de la BTB tiene cuatro bits de historia para almacenar el comportamiento del salto en las ultimas cuatro veces que fue ejecutado. Este algoritmo puede ser implementado de muchas maneras, pero Intel no ha publicado qué opción ha tomado. Se estima que este algoritmo es capaz de predecir correctamente entre el 90% y el 95% de los saltos en los SPECint92 y tiene una tasa aún mejor en los SPECfp92. Las instrucciones de salto a subrutina se pueden predecir siempre correctamente como tomadas ya que son saltos incondicionales. Cuando se ejecuta, se almacena en la pila la dirección de la instrucción que sigue a la del salto a subrutina. Para volver de la subrutina se realiza otro salto incondicional a la dirección que se almacenó en la pila. Es decir, este salto se puede predecir también correctamente como tomado. Esto es cierto, pero no resuelve el problema de saber a donde se salta. Para solucionarlo se utiliza el RSB (Return Stack Buffer), cuando se ejecuta el salto a subrutina la dirección de retorno se almacena tanto en la pila como en el RSB. Cuando la etapa IFU2 detecta el retorno de subrutina lo predice como tomado y toma del RSB la dirección destino del salto. La predicción será incorrecta solamente en el caso de que en la subrutina se cambie la dirección de retorno que se almacenó en la pila. 2.2. Predicción estática. Es una predicción que se adopta generalmente cuando no hay predicción dinámica. La instrucción pasa por la lógica de predicción estática en la etapa DEC2. El árbol de decisión es el que aparece en la figura de la página siguiente. Las bifurcaciones que no tienen historia en el BTB se predicen usando un algoritmo de predicción estática, de acuerdo con las siguientes reglas: • • • En las instrucciones de bifurcación que no son relativas a IP, se predice que se producirá el salto si la bifurcación es un retorno, y que no se saltará en cualquier otro caso. En las bifurcaciones condicionales hacia atrás relativas a IP, se predice que se producirá el salto. Esta regla refleja el comportamiento típico en los bucles. En las bifurcaciones condicionales hacia delante, se predice que no se producirá el salto. 14 Árbol de decisión de predicción estática 3. MEMORIA. Los procesadores de la familia P6, incluyen una serie de registros que el software dependiente de la plataforma (ej.: BIOS) inicializa para definir las reglas de comportamiento respecto del espacio de memoria. Estos MTRRs (Memory Type and Range Registers) pueden ser accedidos mediante las instrucciones RDMSR y WRMSR. El conjunto de MTRR está dividido en registros de rango fijo y de rango variable. Los de rango fijo determinan las reglas de comportamiento dentro del primer MB de memoria. Si se habilitan, dividen en 88 regiones el primer MB de memoria (se muestra una figura en la siguiente página), asignando a cada una un tipo de memoria (ver más adelante). Los de rango variable pueden ser programados con una dirección de inicio, una de final y el tipo de memoria. Se obtiene un rango de memoria definido por el programador. Un reset deshabilita todos los MTRR borrando el registro MTRRdefType, haciendo que todo el espacio de memoria sea de tipo uncacheable (UC). Este registro puede ser modificado por el programador mediante las instrucciones RDMSR y WRMSR. El tipo de memoria indicado en el registro será el utilizado para todos los accesos no cubiertos por los MTRR. Los posibles tipos de memoria, ordenados de menor a mayor rendimiento, son: • • • • • Uncaheable, o UC Write-Combining, o WC Write-Through, o WT Write-Protected, o WP Write-Back, o WB 15 3.1. Memoria Uncacheable (UC). Las reglas que se siguen cuando se realizan accesos de lectura o escritura en un rango de memoria de tipo uncacheable son las siguientes: • • • • No se realizan consultas (lookups) a cache Las peticiones de lectura no se convierten en lecturas de líneas de memoria. Se lee el dato solicitado y se lleva directamente a quien realizó la petición. Los datos no se llevan a cache. Las escrituras a memoria se llevan primero al posted write buffer y más tarde se escriben en el bus en orden estricto. No se realizan lecturas especulativas. Este tipo de memoria es adecuada para regiones en las que se mapean los dispositivos de I/O. El rendimiento en el acceso es muy bajo debido a que no se utiliza la cache y no se realizan lecturas especulativas. 3.2. Memoria Write-Combining (WC). Las reglas que se siguen cuando se realizan accesos de lectura o escritura en un rango de memoria de tipo WC son las siguientes: • • • No se hacen consultas en cache Las peticiones de lectura no se convierten en lecturas de líneas de memoria. Se lee el dato solicitado y se lleva directamente a quien realizó la petición. Los datos no se llevan a cache. Se permiten las lecturas especulativas. 16 • • Cuando se realiza una escritura de uno o más bytes, se copian la dirección alineada 32-bytes de comienzo de la escritura y los bytes a copiar en el Write Combining Buffer (WCB). Los contenidos del WCB se llevan a memoria bajo las siguientes condiciones: o o Si se realiza alguna escritura en la memoria WC a un área de 32byte diferente y todas las entradas del WCB están ocupadas, se lleva el contenido de una de ellas a memoria, dejando dicha entrada libre para almacenar los nuevos datos. La ejecución de instrucciones del tipo, CPUID, IRET, RSM, que deben ser ejecutadas en serie, instrucciones de I/O, o una operación bloqueada hacen que el procesador lleve todo el contenido del WCB a memoria, antes de proceder con la siguiente instrucción. Cuando se lleva algo del WCB a memoria, el procesador tomará uno de los siguientes caminos: • Si la WCB está llena, el procesador realizará una única transacción de 32byte con memoria para llevar la línea completa a memoria. • Si no son válidos todos los bytes del WCB, el procesador realizará el número de escrituras de cuádruple palabra (64 bits) necesarias para actualizar la memoria. Este tipo de memoria es útil para linear video frame buffers. 3.3. Memoria Write-Through (WT). Las reglas que se siguen cuando se realizan accesos de lectura o escritura en un rango de memoria de tipo WT son las siguientes: • • • • • • • • Se hacen consultas a cache En un fallo de lectura en cache, se busca la línea entera en memoria y se trae a cache. En un éxito de lectura en cache, el dato es suministrado por la cache y no se realiza ninguna transacción en el bus. En un fallo de escritura en cache, los datos se pasan al posted write buffer para ser llevados a memoria más tarde. En un éxito de escritura en cache, la línea de cache se actualiza pero no se marca como modificada porque los datos se pasan al posted write buffer para ser llevados a memoria posteriormente. Las líneas de cache nunca se marcan como modificadas. Sólo pueden estar en los estados S o I (en el siguiente punto se comenta con profundidad el protocolo MESI) Se permiten lecturas especulativas. Una escritura actualiza la cache L1 y la memoria, pero invalida las L2 y L1 de instrucciones en un éxito. 17 3.4. Memoria Write-Protected (WP). Las reglas que se siguen cuando se realizan accesos de lectura o escritura en un rango de memoria de tipo WP son las siguientes: • Se hacen consultas a cache • En un fallo de lectura en cache, se busca la línea entera en memoria y se trae a cache. • En un éxito de lectura en cache, el dato es suministrado por la cache y no se realiza ninguna transacción en el bus. • En un fallo de escritura en cache, los datos se pasan al posted write buffer para ser llevados a memoria más tarde. • En un éxito de escritura en cache, la línea de cache no se actualiza y los datos se pasan al posted write buffer para ser llevados a memoria más tarde. • Las líneas de cache nunca se marcan como modificadas. Sólo pueden estar en los estados S o I (en el siguiente punto se comenta con profundidad el protocolo MESI). Este tipo de memoria es útil para zonas que mapean la memoria ROM (shadow RAM). Se permite llevar a cache para mejorar el rendimiento en los accesos. Pero no se modifica la cache para emular una ROM, aunque la escritura se lleva al bus y es el controlador de memoria el responsable de ignorar esta escritura. 3.5. Memoria Write-Back (WB). Las reglas que se siguen cuando se realizan accesos de lectura o escritura en un rango de memoria de tipo WB son las siguientes: • • • • • • Se hacen accesos a cache En un fallo de lectura en cache, se busca la línea entera en memoria y se trae a cache. En un éxito de lectura en cache, el dato es suministrado por la cache y no se realiza ninguna transacción en el bus. En un fallo de escritura en cache, se busca la línea de cache de memoria. Cuando la línea llega se escribe en la cache y se actualiza, marcándose como modificada. En un éxito de escritura en cache, la línea se actualiza. La línea se marca como modificada y no se realiza ninguna transacción con el bus, quedando la memoria sin actualizar. Se permiten accesos especulativos de lectura. Este tipo de memoria es el que tiene mejor rendimiento, las transacciones se hacen con la cache y se elimina un gran número de transacciones en el bus. La memoria se actualiza cuando un bloque de cache debe ser reemplazado. Idealmente, la mayor parte de la memoria principal sería de este tipo. 18 4. MEMORIA CACHE. El esquema de memoria cache que utiliza el Pentium-Pro es el siguiente: E xt erna l B u s L2 C ac he 6 4 b it d at a p ath E xt erna l bu s Inte r fac e B a ck s id e bu s Int er fa ce 6 4 b it d at a p ath Co de C ac he D at a C ac he Solamente el prefetcher es el que accede a la cache de instrucciones por lo que ésta es de sólo lectura. En cambio, las unidades de ejecución acceden a la cache L1 de datos cuando están tratando una instrucción que requiere un acceso a memoria de datos. La cache L2 unificada reside en un bus dedicado conocido como el Backside Bus. Éste sirve los fallos de la cache L1 y en el caso de producirse un fallo de cache L2, realiza una transacción con la unidad de bus externo para obtener de memoria la instrucción o el dato requeridos. La información se pasa a la cache L2 y L1. 4.1. CARACTERÍSTICAS DE LA CACHE L1 DE DATOS. En la implementación inicial, la cache de datos es de 8KB, asociativa por conjuntos de 2 vías con 128 entradas (líneas). Cada vía es de 4KB con lo que la memoria de 64GB se percibe como paginada en 16M páginas de 4KB cada una. La cache interpreta cada una de estas páginas como dividida en 128 líneas de 32 bytes. Para conseguir coherencia entre caches implementa los cuatro estados del protocolo MESI, que se detalla en el 4.4. 19 La TLB de datos se incorpora en la parte delantera de la cache de datos, y traduce los 32 bits de dirección lineal a los 36 bits de la dirección física de memoria. En realidad, por motivos de eficiencia se tratan dos tipos de paginaciones y por tanto se utilizan dos TLBs, una para páginas de memoria de 4MB y 2MB (asociativa por conjuntos de cuatro vías con ocho entradas) y otra para páginas de 4KB (asociativa por conjuntos de 4 vías con 64 entradas). Con los 36 bits de la dirección física se procede de la siguiente manera, los 5 bits menos significativos nos indican el byte dentro de la línea, los 7 siguientes el número de línea en la que se guarda y los últimos 24 se utilizan como etiqueta para comprobar si la instrucción está en alguna de las dos vías de dicha línea. La cache L1 de datos, sirve las lecturas y escrituras de datos realizadas por las unidades de ejecución y tiene las siguientes características: • • • Protección ECC (Error Correction Code). En las regiones de memoria de tipo WB, la cache L1 utiliza una política de emplazamiento en escritura (allocate on write) No bloqueante, un fallo se lleva al bus pero no impide subsiguientes accesos a cache. Con las siguientes condiciones: o o o • Los loads generados por instrucciones posteriores pueden ser servidos antes de que finalice un load previamente parado. Los loads generados por instrucciones posteriores pueden ser servidos antes de que finalice un store previamente parado, siempre que se lea de una línea diferente. Los stores generados por instrucciones posteriores no pueden ser servidos antes de que finalicen los stores previamente parados, los stores son completados siempre en orden. Puede manejar hasta 4 fallos simultáneos. Cuando ya hay cuatro accesos a cache L2 en proceso, la cache L1 no puede tratar ningún fallo más hasta que no se resuelva alguno de los accesos a L2. 20 • • • • • La cache de datos está segmentada, si los accesos tienen éxito se puede producir un resultado por ciclo. Un acceso a L1 con éxito tarda 3 ciclos en completarse. Puede manejar hasta 4 accesos segmentados simultáneos. Implementa dos puertos de datos y puede servir una petición de load, o un load y un store simultáneos, mientras su destino sean líneas diferentes o diferentes mitades de línea. Implementa un puerto de espía (snoop) para poder espiar las transacciones generadas por otros. Si se ha producido un fallo en una línea y la línea se está trayendo de la cache L2 o de la memoria, cualquier fallo subsiguiente sobre la misma línea no genera accesos extra a memoria. La cache de datos tiene dos puertos de 64 bits conectados a las unidades de ejecución de load y store. En una lectura con éxito la cache de datos puede suministrar a la unidad de ejecución de loads hasta 8 bytes por ciclo. En una escritura con éxito la cache de datos puede tomar de la unidad de ejecución de stores hasta 8 bytes por ciclo. También tiene dos puertos para recibir dos direcciones simultaneas de las unidades de ejecución, pero sólo podrá tratar las dos si son una de un load y otra de un store, situadas en distintas vías o en la misma vía pero en diferentes mitades de línea. L1 DATA CACHE Address Port One Address Port Two Inbound Data Bus (64 bits) Outbound Data Bus (64 bits) EXECUTION UNITS 4.2. CARACTERÍSTICAS DE LA CACHE L1 DE INSTRUC. En la implementación inicial, la cache de instrucciones es de 8KB, asociativa por conjuntos de 4 vías con 64 entradas. Cada vía es de 2KB con lo que la memoria de 64GB se percibe como paginada en 32M páginas de 2KB cada una. La cache interpreta cada página como dividida en 64 líneas de 32 bytes. Implementa dos de los cuatro estados MESI: S (válida) e I (inválida), debido a que es de sólo lectura. En esta cache, las instrucciones se almacenan sin almacenar las marcas de delimitación de las instrucciones de la IA32. La ITLB se incorpora en la parte delantera de la cache de instrucciones, que traduce los 32 bits de dirección lineal del prefetcher a los 36 bits de la dirección física de memoria. En realidad, por motivos de eficiencia se tratan dos tipos de paginaciones y por tanto se utilizan dos TLBs, una para páginas de memoria de 2 21 MB y 4MB (asociativa por conjuntos de cuatro vías con cuatro entradas) y otra para páginas de 4KB (asociativa por conjuntos de 4 vías con 64 entradas). Con los 36 bits de la dirección física se procede de la siguiente manera, los 5 bits menos significativos nos indican el byte dentro de la línea, los 6 siguientes el número de línea en la que se guarda y los últimos 25 se utilizan como etiqueta para comprobar si la instrucción está en alguna de las cuatro vías de dicha línea. Se utiliza un algoritmo LRU para el reemplazamiento de líneas. 4.3. CARACTERÍSTICAS DE LA CACHE L2. Se implementa una cache unificada que sirve los fallos de las caches de datos e instrucciones del primer nivel, utiliza el protocolo MESI. Las implementaciones existentes pueden tener 256KB, 512KB y hasta 1MB, todas con una estructura asociativa por conjuntos de 4 vías. El tamaño de las vías es el de la cache L2 dividido por 4, con lo que la memoria de 64GB se percibe como paginada en páginas del tamaño de las vías. La cache interpreta cada página como dividida en líneas de 32 bytes. 22 Ejemplo 256KB de cache L2 Las principales características de la cache L2 son: • • • • • • • • • Protección ECC. Es no bloqueante, un fallo lleva la petición al bus pero no bloque posteriores accesos a L2 (fallos de L1). En las áreas de memoria de tipo WB, un fallo en escritura hace que se traiga el bloque a cache (allocate on write). Si se ha producido un fallo en una línea y la línea se está trayendo de memoria, cualquier fallo subsiguiente sobre la misma línea no genera accesos extra a memoria. La línea se trae por cuádruples palabras, siempre se trae de memoria primero la cuádruple palabra crítica, que se pasa inmediatamente a la cache L1, y luego el resto. Puede manejar hasta 4 fallos simultáneos. Cuando ya hay cuatro accesos memoria en proceso y se producen nuevos fallos de L1, los éxitos de L2 se siguen sirviendo mientras que los nuevos fallos de L2 se almacenan en una cola que puede almacenar hasta doce fallos en espera de ser atendidos. Está segmentada pudiendo llegar a dar un resultado por ciclo cuando se realizan accesos exitosos simultáneos. Un acceso a L2 con éxito tarda 6 ciclos en completarse. Implementa dos puertos de espía (snoop) para espiar transacciones internas y externas. Puede manejar hasta cuatro accesos simultáneos segmentados. Debido al ancho del bus (64 bits) con la cache L1, sólo puede enviar una cuádruple palabra por ciclo. Siempre envía primero la palabra crítica para que la petición pueda servirse cuanto antes. Solo puede servir datos a una de las cache L1 a un tiempo. Se utiliza un algoritmo LRU para el reemplazamiento de líneas. Si la línea debe actualizarse en memoria se almacena en un writeback buffer para ser llevada a memoria. 23 4.4. COHERENCIA DE CACHES: SNOOP. Para conseguir coherencia de cache, la cache de datos permite un protocolo conocido como MESI (Modified/Exclusive/Shared/Invalid). MESI está diseñado para satisfacer los requisitos de coherencia de cache de un sistema multiprocesador, pero también útil en una arquitectura P6 monoprocesador. Los cuatro estados del protocolo MESI son: • • • • Estado Modificada (M): la línea es válida, ha sido modificada (diferente de la memoria principal) desde que se trajo y ningún otro procesador tiene una copia de esta línea en sus caches. La línea en memoria está anticuada. Estado Exclusiva (E): la línea es válida, sigue estando igual que en memoria y ningún otro procesador u otro iniciador de transacciones tiene una copia de esta línea. Estado Compartida (S): la línea es válida, sigue estando igual que en memoria y puede que algún otro procesador tenga una copia de esta línea en sus caches. Estado Inválida ( I ): no hay una línea válida en la cache. Para que la cache contenga siempre la última versión de los datos, espía todas las transacciones realizadas sobre el bus por otros procesadores u otros masters. El protocolo de snooping sigue los siguientes pasos: • • • • • Captura todas las transacciones generadas por otros. Si es una transacción de memoria, se presenta la dirección de memoria a las tres caches internas para ver si tiene una copia del dato. Si la línea no está en ninguna de las caches, presenta un fallo como resultado del snoop en la fase de snoop de la transacción. Si la línea está en alguna de las caches y no ha sido modificada desde que se leyó de memoria, se da como resultado del snoop un éxito (hit) al iniciador de la transacción, a menos que la transacción sea una escritura o una lectura e invalidación, en cuyo caso se indica fallo y se invalida la línea de cache. Si la línea buscada está en la cache de datos o en L2 en estado modificada, se da como resultado un éxito en línea modificada al iniciador de la transacción. 24 La cache L1 de datos tiene un puerto para espiar transacciones con memoria externas, se realizan las acciones indicadas en la tabla siguiente cuando se producen transacciones en el bus. Tipo de transacción externa realizada por otro iniciador Escritura o lectura de memoria Lectura de memoria Lectura de memoria Lectura de memoria Estado inicial de la línea en la cache de instrucciones I Escritura en memoria SoE • • Escritura en memoria M • • E S M Resultado de la espía y estado final de la línea en la cache de código • • • • • • • • • • Lectura e Invalidación de memoria SoE • Lectura e Invalidación de memoria M • • • • Indicar fallo de snoop al iniciador La línea permanece en estado I Indicar éxito de snoop al iniciador La línea cambia al estado S Indicar éxito de snoop al iniciador La línea permanece en estado S Indicar éxito de snoop en línea modificada al iniciador. Hacer una copia de la línea en el writeback buffer y escribirla inmediatamente en memoria. La línea pasa al estado S. Indicar fallo de snoop al iniciador (porque la línea se invalida por la escritura) La línea pasa al estado S. Indicar éxito de snoop en línea modificada al iniciador Descargar la línea de cache al writeback buffer e invalidar la línea (I). Escribir inmediatamente la línea del writeback buffer en memoria. Indicar fallo de snoop al iniciador (porque la línea se invalida por la escritura) La línea pasa al estado I. Indicar éxito de snoop en línea modificada al iniciador Descargar la línea de cache al writeback buffer e invalidar la línea (I). Pasar inmediatamente la línea del writeback buffer a la memoria y al iniciador. La cache L1 de instrucciones tiene un puerto para espiar transacciones con memoria. Se espían transacciones externas e internas. Cuando se realiza un acceso de escritura de datos, la dirección de memoria se pasa a las tres caches. Si resulta un éxito (hit) en la cache de instrucciones, se invalida la línea tanto en la cache como en el prefetch streaming buffer. La siguiente tabla refleja las acciones tomadas ante los diferentes eventos del bus. 25 Tipo de transacción externa realizada por otro iniciador Escritura o lectura de memoria Lectura de memoria Estado inicial de la línea en la cache de instrucciones I S • • • • • IoS • • S Escritura en memoria Lectura e Invalidación de memoria Resultado de la espía y estado final de la línea en la cache de código • Indicar fallo de snoop al iniciador La línea permanece en estado I Indicar éxito de snoop al iniciador La línea permanece en estado S Indicar fallo de snoop al iniciador (porque la línea se invalida por la escritura) La línea pasa al estado I. Si la línea está en estado I, indicar fallo de snoop y la línea permanece en estado I Si la línea está en estado S, indicar fallo de snoop y la línea pasa al estado I La cache L2 tiene un puerto para espiar transacciones con memoria. Se espían transacciones externas e internas. Cuando se realiza un acceso de escritura de datos, la dirección de memoria se pasa a las tres caches. La siguiente tabla refleja las acciones tomadas ante los diferentes eventos del bus. Tipo de transacción externa realizada por otro iniciador Cualquier tipo Estado inicial de la línea en la cache de instrucciones I Resultado de la espía y estado final de la línea en la cache de código • • • • • Lectura de memoria Lectura de memoria EoS Escritura en memoria Escritura en memoria SoE Lectura e Invalidación de memoria Lectura e Invalidación de memoria SoE • • M • M • M • • • • • 26 El resultado del snoop es fallo. La línea permanece en estado I El resultado del snoop es éxito. La línea pasa al estado S El resultado del snoop es éxito en línea modificada. La línea se pasa a la memoria y al agente que la solicitó y se pasa al estado S El resultado del snoop es fallo. La línea pasa al estado I. El resultado del snoop es éxito en línea modificada La línea se pasa a la memoria y al agente que la solicitó y se pasa al estado I El resultado del snoop es fallo. La línea pasa al estado I. El resultado del snoop es éxito en línea modificada La línea se pasa a la memoria y al agente que la solicitó y se pasa al estado I 5. Distintas Implementaciones de la arquitectura Intel P6. Características, tecnología, situación en el mercado y comparativas. La arquitectura Intel P6 ha tenido diversas implementaciones: Pentium Pro, Pentium II, Pentium III, sus respectivas versiones de gama baja (Celeron) y versiones Mobile. El Pentium Pro se ha detallado con profundidad porque es la base de toda la arquitectura P6. A continuación hacemos un estudio de la evolución de la familia P6, comentando las novedades que se van incorporando y otros aspectos de interés. 5.1. Pentium II. Klamath (Pentium II) aporta mejoras significativas a la arquitectura P6, acercándola al mercado de consumo; aunque algunas de estas mejoras no llegarán hasta la aparición del procesador Deschutes (segunda generación de Pentium II). Además, Klamath será más económico que Pentium Pro porque tiene un proceso de fabricación y un encapsulado más barato. Para abaratar costes, Pentium II cambia el módulo multichip de Pentium Pro por un encapsulado de plástico de tipo LGA conectado a través de una PCB a la cache de dos niveles. También modifica la fabricación del chip cambiando el caro proceso BiCMOS de Pentium Pro por un proceso CMOS. Los cambios en el núcleo del P6 original son sencillos pero efectivos. Añade las MMX (MultiMedia eXtensions) para aplicaciones multimedia y también mejoras en el manejo de los loads, un cuello de botella clave para el código de 16 bits de Windows 95; aunque las mejoras más importantes se obtienen incrementando de la frecuencia de reloj. Características Rediseño de la cache Para reducir costes y permitir frecuencias de reloj mayores, Intel renueva totalmente el diseño del cache. El Pentium Pro acopla una cache de instrucciones de 8K y una cache de datos de 8K con una cache de nivel dos (L2) completamente segmentada, que funciona a la velocidad de la CPU, a más de 200 MHz. El gran ancho de banda de esta cache L2 compensa las deficiencias de la cache L1. Sin embargo, para funcionar a 200 MHz tiene que estar fabricada con una SRAM de alta velocidad, cara e introducida dentro de la CPU. Intel combina la CPU de PPro y una cache L2 en un mismo encapsulado cerámico. Para Pentium II, utiliza una cache externa L2 que funciona a la mitad de la velocidad y es más económica, como indica la figura 1. Por ejemplo, un Klamath de 266 MHz puede utilizar SRAM síncrona de 133 MHz como 27 cache L2. A esta velocidad se pueden utilizar SRAMs más baratas y no se necesita incluirlas dentro del encapsulado del procesador. Para compensar la lenta cache L2, Intel incrementa cada cache L1 a 16 K, mejorando la tasa de aciertos y reduciendo el número de accesos a la cache externa. La compañía esperaba inicialmente que el rediseño compensara totalmente la diferencia de velocidad de la cache. Pero se ha observado una disminución de prestaciones en operaciones con enteros, de poca importancia; y grandes pérdidas en operaciones de coma flotante debido a la velocidad de la cache, que se compensan con el aumento de la frecuencia de reloj del procesador. Una de las ventajas en el rendimiento de la cache L2 externa viene como consecuencia del aumento de tamaño. En PPro está limitada a 512 K debido a su encapsulado de dos chips. Con L2 en una PCB, el diseño de Klamath puede soportar caches más grandes, aunque Intel no ha especificado el límite. El factor limitante es el dispositivo 82459AB del que Intel es propietario, y sin el cual no se puede ampliar las etiquetas de la RAM externa, quedando limitado el tamaño de la cache L2 a 512 K. Mejoras para el código multimedia de 16 Bits Como el P55C, el Klamath incorpora las MMX. Estas 57 nuevas instrucciones permiten procesado en paralelo para datos de 8 y 16 bits. Las ventajas que obtenemos con el procesado en paralelo mejoran en un 40% la reproducción de vídeo y en un 300% el procesado de imágenes en programas como por ejemplo Photoshop. Si hacemos una prueba con un Klamath a 233 MHz decodificando DVD (audio AC-3 y vídeo MPEG-2) obtenemos 30 cuadros por segundo totalmente por software. Como muestra la figura 2, las dos integer units del P6 original han sido modificadas para manejar las instrucciones MMX. La unidad funcional principal, que trabaja con enteros e instrucciones de coma flotante, ahora incorpora además una MMX ALU y un multiplicador como se detalla en la figura 3. La segunda unidad funcional, ahora incluye una segunda MMX ALU y un registro de desplazamiento. Como resultado, Klamath puede distribuir de forma dual la mayoría de combinaciones de las instrucciones MMX, excepto dos multiplicaciones. Como en el P55C, las unidades MMX del Klamath tienen una latencia de un ciclo, excepto para el multiplicador, que está completamente segmentado, con una latencia de tres ciclos. 28 Una de las mejoras más importantes sobre el P55C es que el tiempo de context-switching entre MMX y los modos de coma flotante prácticamente ha desaparecido. Por esto, aplicaciones que cambian frecuentemente de modo han mejorado, pero algunas 3D requerirán todavía más velocidad en el futuro. Los cambios por las instrucciones MMX no modifican toda la arquitectura P6. La CPU todavía tiene tres decodificadores que traducen las IA a ops. En cambio, para simplificar la RAT, los valores MMX están almacenados físicamente en los registros de coma flotante en lugar de register files (RRF) separados, como en el P55C. El otro cambio significativo en el núcleo es el manejo de los registros de escritura entre etapas. En el diseño original de P6, estas escrituras no se podían realizar de modo especulativo; debía vaciarse el pipeline entero antes de que pudiese haber una escritura, para asegurarse de que los valores de las instrucciones de etapas anteriores habían sido actualizados. La escritura retrasaba al micro retrasaba un total de entre 20 y 30 ciclos. El diseño de Klamath renombra los registros entre etapas cuando están escritos y el tiempo necesario para actualizar el valor se reduce. Este diseño permite que las escrituras entre etapa se realicen especulativamente; el nuevo valor pueda ser desechado si es necesario. Además, las dependencias entre los antiguos y los nuevos valores pueden coexistir en la parte out-of-order del núcleo, evitando la necesidad de vaciar el pipeline y ejecutar secuencialmente. Como resultado, Klamath puede ejecutar escrituras entre etapas sin prácticamente retraso. Aunque la escritura en los registros entre etapas nunca se realiza en aplicaciones de 32 bits, sí que es bastante frecuente en aplicaciones de 16 bits. Pentium Pro se muestra bastante limitado para la ejecución de aplicaciones de 16 bits, e incluso en Windows 95, ya que este sistema operativo hace uso de gran cantidad de éstas. Este problema ha hecho que este chip sea más popular para Windows NT que para Win95. Intel diseñó Klamath para manejar mejor este tipo de aplicaciones y hacerlo más atractivo para el consumidor. Se estima que se obtienen unas mejoras en torno al 10% en este segmento. Tecnología Klamath se fabrica con la misma tecnología CMOS de 0.28 micras y cuatro capas que el P55C. Este proceso es una variación del P854 de Intel y ofrece las mismas capas de metal que el proceso BiCMOS de 0.35 micras, utilizado para los Pentium y Pentium Pro. En conjunto, los pequeños transistores del nuevo proceso compensan la falta de los rápidos transistores bipolares. La mejora que ofrece la velocidad de reloj de Klamath sobre PPro se debe principalmente al nuevo diseño del circuito. Además, la velocidad de reloj de PPro está limitada parcialmente por la cache; con una cache más rápida, el PPro podría haber alcanzado los 233 MHz. El trabajo que hicieron los diseñadores fue excelente, introduciendo 7.5 millones de transistores en un dado que medía 203 mm2. A pesar de añadir 29 16K de cache y dos unidades MMX para compensar las pérdidas de los transistores bipolares, el tamaño de la CPU se incrementó sólo en 7 mm2 del Pentium Pro respecto al Klamath. El núcleo de P6 no fue totalmente comprimido hasta Klamath. El chip mostrado en la figura 4 utiliza el nuevo encapsulado requerido por el interfaz de la cache L2. Mientras que el encapsulado de PPro tiene 387 pines, Klamath necesita 528. Para ajustar estas conexiones de forma compacta, Intel eligió un encapsulado land-grid array (LGA), que es similar a un ball-grid array (BGA). El Klamath LGA mide 42mm de lado, sólo un 36% del área del voluminoso PPro PGA. Sin tener en cuenta el disipador metálico, el encapsulado LGA de plástico es más económico. Para una disipación adecuada del calor el disipador se puede conectar directamente a la fuente de calor, o en el caso de disponer de un singleedge cartridge (SEC) daughtercard, al metal protector de la caja. Intel revisó el núcleo de Klamath para reducir la potencia disipada parando el reloj en las unidades funcionales que no se están utilizando y utilizando técnicas similares. Situación en el mercado y comparativas Técnicamente, Klamath es la tercera versión del núcleo del P6 original porque el PPro original empezó con una tecnología de 0.5-micras BiCMOS hasta llegar a 0.35-micras BiCMOS que fue la última. Sin embargo, es similar a la segunda generación de Pentium (P54C) por varias cosas; entre otras, reduce el coste de fabricación del micro y rompe la compatibilidad con su predecesor. Para los usuarios finales, el nuevo Klamath ofrece mejoras significativas respecto al Pentium: las ya conocidas instrucciones multimedia (MMX), mayor frecuencia de reloj y mejoras para la ejecución de aplicaciones de 16-bits. Pero con todo esto todavía quedan dos espacios en los cuales el Klamath no puede posicionarse: los servidores y las estaciones de trabajo. La función de un servidor está muy condicionada por el cache y el ancho de banda de memoria del que disponga. Además el Klamath no dispone de soporte para configuraciones de cuatro procesadores, muy popular en servidores, para este tipo de sistemas PPro será todavía ampliamente utilizado. Al menos hasta la llegada del Deschutes, 2ª generación del Pentium II. Con Deschutes, Intel pone especial énfasis en el mercado de la estaciones de trabajo para terminar con el Pentium Pro. Deschutes soporta velocidades de bus de 100 MHz que se consideran suficientes para configuraciones de 4 procesadores. Además, cambia el proceso de fabricación llegando a la tecnología de 0.25-micras para poder alcanzar frecuencias de reloj de 300 MHz. 30 Todavía el chip x86 más rápido Klamath mantiene a Intel en una posición dominante en el mercado de procesadores, K6 podría ser un duro competidor. Sin embargo, K6 con su tecnología de 0.35-micras difícilmente puede superar los 233 MHz, mientras que el Klamath se ofrece con 266 MHz y posteriormente Deschutes alcanza los 300 MHz. La mejor oferta de Cyrix es el M2, con versiones a 225 MHz. El núcleo del M2 es estructuralmente inferior al núcleo del P6 y ofrece peor rendimiento para similares frecuencias de reloj. De todos modos ambos chips se quedan por detrás en aplicaciones con operaciones de coma flotante y MMX, puntos en los cuales los diseñadores de Intel han puesto especial énfasis. El Klamath no queda tan bien parado si se compara con sus hermanos RISC. Procesadores como el 21164, PA-8200 y el R10000 de 0.25-micras, suelen ofrecer sobre el 30% de mejora en operaciones con enteros, y en operaciones de coma flotante triplican los resultados obtenidos con el Klamath. Pero con estos procesadores no se puede comparar porque son muy caros y se montan tan solo en servidores y estaciones de trabajo. De todos modos con la salida al mercado de Deschutes a 300MHz (2ª generación del Pentium II) comienzan a igualarse los resultados. Éste obtiene mejores resultados en funciones con enteros que casi todos sus competidores, sólo le supera el Digital 21164 a 500 MHz, aunque en operaciones con coma flotante continúa obteniendo los peores resultados como muestra la figura 1. Estos resultados se deben a que Intel está incrementando su esfuerzo en el diseño de procesadores para estaciones de trabajo, quitándoles mercado a los fabricantes RISC. Antes Intel no anunciaba la existencia de un nuevo producto hasta que ya podía comercializarlo, esto es que ya tenía suficientes unidades para satisfacer la demanda. Ahora Intel comienza a comercializar sus últimos productos muy rápidamente con unos precios muy altos. De este modo puede satisfacer a los pocos usuarios que quieren lo último y pueden abastecer a los fabricantes de estaciones de trabajo, esto permite que se pueda adelantar a los fabricantes de RISC. Con fabricantes de estaciones de trabajo como Compaq-HP, IBM y Digital ofreciendo productos basados en P6 y WindowsNT, se espera que el mercado de estas computadoras aumente considerablemente durante los próximos años. El Deschutes es el principio de esta trayectoria, situándose en el mercado en la parte baja del sector a la espera de poder mejorar en las operaciones con coma flotante como objetivo inmediato. Una cache a la mitad de velocidad tiene consecuencias mínimas El Pentium II se coloca cómodamente en lo alto de la línea de productos de Intel. De acuerdo a los test SYSmark, el PII-233 es 9% más rápido que el PPro-200 cuando ejecuta aplicaciones de Windows NT, mientras que el PII-266 es cerca del 20% más rápido que el PPro-200, como muestra la figura 2. 31 Debido a las mejoras del nuevo chip en 16-bits, la diferencia en Windows95 es más pronunciada; incluso el PII-233 supera al PPro-200 en un 19%, mientras que el PII266 obtiene unas mejoras del 30%. La mayoría de estos incrementos de prestaciones se deben a las altas frecuencias de reloj. El Pentium II también se aprovecha de sus 512K de cache L2; el Pentium Pro fue testeado con solo 256K de cache. (Pentium Pro está disponible con un cache de 512K, pero esta versión se utiliza solo para servidores, por su elevado precio). Los Pentium II pierden un poco de rendimiento debido principalmente a que su cache de segundo nivel L2 funciona a la mitad de velocidad que el micro. El efecto de la cache más lenta es ligeramente superior en el benchmark SPECfp95, donde el Pentium II 233 MHz obtiene menos del 7% de mejora sobre el PPro-200. Sin embargo para la mayoría de aplicaciones, doblar las dos caches L1 e incrementar el tamaño de L2 compensa el decremento de velocidad de L2. En aplicaciones que utilizan las extensiones MMX es cuando el PII toma ventaja. Basándonos en el Intel Media Benchmark, el PII266 obtiene 80% de mejora sobre el PPro-200, que no implementa las MMX, y 38% mejor que un Pentium MMX (P55C). Sin embargo, como muestra la figura 3, el incremento es sustancial dependiendo del tipo de aplicación y como aprovecha las MMX. Estos datos implican que, para aplicaciones no MMX, un Pentium II rendiría ligeramente menos que un Pentium Pro con la misma frecuencia de reloj y el mismo cache externo. 32 5.2. Celeron. Intel consiguió extender la familia P6 a todos los segmentos del mercado de PC: desde los equipos más básicos hasta los más complejos, incluyendo los PCs portátiles. Covington (el primer procesador Celeron) apareció para cubrir aquellos huecos que la familia P6 todavía no había ocupado, y en los que predominaba Pentium. Este procesador es una versión a 266 MHz del CPU Deschutes estándar, pero sin el segundo nivel de cache en el módulo del procesador. En la gama alta, Intel añadió productos Pentium II a 350 y 400 MHz, basados también en Deschutes. Estos productos fueron los primeros en utilizar un bus de sistema de 100 MHz, 50% más rápido que los buses típicos. La compañía también lanzó procesadores Mobile Deschutes (para portátiles) a 233 y 266 MHz. No contentos con esto, Intel introdujo nuevas chip sets a cada una de las nuevas CPUs provocando una reestructuración en el precio del resto de procesadores. Características El objetivo de Covington es eliminar el Socket 7 El primer Celeron tenía un objetivo muy claro: eliminar Pentium/MMX, y consecuentemente el Socket 7, de la línea de productos de Intel lo más rápidamente posible. Este cambio impide a los competidores de Intel continuar explotando el Socket 7 para su provecho. Ningún otro fabricante, excepto Intel, ofrecía procesadores de Slot 1, y AMD en particular estaba contractualmente excluído de Slot 1, por lo que Intel estaba motivado para realizar este cambio. Como ocurrió con de 386SX y 486SX, Covington es un procesador potente al que limitaron para hacerlo menos atractivo. Esta técnica permitió a Intel favorecer a Pentium II mientras que ofrecía Covington a un precio lo suficientemente bajo para apartar a Pentium/MMX del mercado. Para diseñar Covington, Intel quitó la cache L2 del módulo, un cambio que empeora el rendimiento en un 43% en CPUmark32 comparado con un Pentium II a la misma frecuencia de reloj. Los diseñadores de Intel también eliminaron del módulo el atractivo encapsulado negro y simplificaron el diseño de la PCB del módulo. Esto obliga a la necesidad de unas card guides distintas para el módulo de Celeron, aunque, al igual que el Pentium II, ambos se pinchan en el mismo conector. En total, estos cambios en el módulo suponen un ahorro del 15% en el coste fabricación. Situación en el mercado y comparativas Rendimiento similar a Pentium/MMX-233 Como muestra la figura 1, el rendimiento de un Celeron-266 oscila alrededor del de Pentium/MMX-233, tanto por arriba como por abajo, dependiendo del benchmark. Esta comparación asume que el procesador Pentium tiene una cache L2. Celeron funciona peor en aplicaciones estándar de Windows 95, representadas aquí por Winstone 98; pero supera a Pentium/MMX-233 en aplicaciones que usan frecuentemente instrucciones MMX o de coma flotante, como 33 son los juegos 3D y multimedia. Esta cualidad es la que ayudará a Celeron en el mercado de consumo, donde los PCs de bajo coste son más populares. De todos modos, la carencia de cache L2 hace que el rendimiento de Celeron-266 sea mucho peor que el de un Pentium II-266 con 512 K de cache L2. De hecho, Celeron-266 es más lento que Pentium II-233 en la mayoría de benchmarks. Los posteriores productos de Celeron están basados en un nuevo chip de CPU, llamado Mendocino, que incluye una cache L2 integrada. Este diseño reduce enormemente el descenso de rendimiento respecto a Pentium II. Con un rendimiento significativamente superior que Covington, Mendocino es un producto atractivo. El peligro que corría Intel es que la falta de superioridad de Convington con respecto a Pentium/MMX podía dar una primera mala impresión para la nueva serie Celeron. La aceptación de Covington será limitada El precio inicial de Covington era ligeramente superior al de Pentium/MMX233. La diferencia de precios era mucho mayor que lo que costaría añadir una cache L2 a un sistema Pentium/MMX que le permitiera superar a un sistema Covington en la mayoría de las aplicaciones. Incluso a igualdad de precios, se puede ahorrar el dinero suficiente para cubrir el gasto de la cache L2 usando un chip set que no sea de Intel. Por lo tanto, Covington aparece para ser simplemente un accesorio inútil en la línea de productos de Intel. No es ni más rápido (en la mayoría de las aplicaciones) ni más barato que el producto al que sustituye. Los fabricantes de PCs se sentían atraídos por Covington porque les permite fabricar una línea de productos de gama baja alrededor de Celeron. Los usuarios expertos evitaron Covington, pero la mayoría de las personas no se fijan en los benchmarks. Estas personas se sienten atraídas porque se trata de un nuevo modelo de Intel, e incluso por el nombre Celeron. Otro de los factores que lo hace atractivo a los compradores es que su velocidad se reloj es superior a la de Pentium/MMX, aparentando ser más rápido. 34 Nuevo bus a 100MHz Por otra parte, Intel mejoró las prestaciones incrementando la velocidad del bus del sistema junto con la de la CPU. El cambio al bus de 100 MHz incrementa el ancho de banda a 800 Mbytes/s, mejorando el rendimiento del procesador más de lo que indicaría solo la velocidad del CPU. La figura 3 muestra que la mejora en el rendimiento, al pasar de un Pentium II-300 a otro 333 MHz, con el benchmark Winstone 98, es del 5%, a pesar del incremento del 11% en la velocidad de reloj. Si pasamos a un procesador de 350 MHz y con un bus de 100 MHz, incrementamos la frecuencia de reloj sólo un 5%, pero la mejora de prestaciones es similar: 4% con Windows 95 y 6% con Windows NT. Por lo tanto, el bus más rápido permita a Intel obtener un grado más de velocidad en su línea de productos. Benchmark Details Para los datos mostrados en la figura 1, Intel probó el Pentium/MMX con el 430TX y la cache opcional de 512K; el Celeron con el 440EX. Ambos utilizan 32M de SRAM, discos duros Seagate ST32122A EIDE, y tarjetas gráficas STB Velocity 128 PCI con 4M de SGRAM en modo 1024 x 768 x 16. Para los datos mostrados en la figura 3, Intel probó todos los Pentium II con el chip set 440BX, 32M de SRAM (64M para Winstone NT), discos duros Seagate ST34501W y tarjetas Martos Millennium II AGP con 4M de SGRAM en modo 1024 x 768 x 16. Cuando hablamos de CPUmark, nos referimos al CPUmark32 de Ziff-Davis; FPUmark es el FPU WinMark de Ziff-Davis; Norton MMX es el Norton Multimedia Benchmark de Norton Utilities 3.0; y Winstone 98 es el benchmark Business Winstone 98 de Ziff-Davis. Estos cuatro tests se relizaron bajo Windows 95. Winstone NT hace referencia al benchmark High-End Winstone 98 realizado en Windows NT. SPECint95 y SPECfp95 son las versiones básicas de la las medidas SPEC95 y estan realizadas en UnixWare 2.0. Para más información de rendimiento, consultar en la Web de Intel developer.intel.com/proas/perf. El impacto del bus de 100 MHz varía dependiendo de la aplicación. La mayor ganancia la obtenemos con programas que hacen un gran número de accesos a memoria; esto incluye programas que manipulan imágenes y otros conjuntos de datos da gran tamaño. SPECfp95, por ejemplo, mejora en un 16% cuando pasa de un Pentium II-333 a un Pentium II-350. El Pentium II-400 MHz es aún más rápido, por supuesto. Alcanza 15.8 SPECint95 y 11.4 SPECfp95. Esta mejora de rendimiento lleva asociado un coste en dólares y watts, como es de esperar. Con el nuevo bus de 100 MHz, los productos de Pentium II comenzaron utilizar múltiplos de 50 MHz, en lugar de 33 MHz. 5.3. Pentium III. Intel anunció que iba a vender Katmai bajo el nombre de Pentium III. Necesitaban un nuevo nombre para Katmai ya que iba a solaparse con Pentium II en frecuencia de reloj pero incluía nuevas instrucciones (conocidas como KNI) que ofrecían una mejora de prestaciones en ciertas aplicaciones multimedia. En lugar de extender la 35 serie Pentium II, como hicieron creando el nombre Pentium/MMX en circunstancias similares, Intel decidió simplemente incrementar el número del modelo. El nuevo nombre era fácil de recordar para los consumidores y más corto que “Pentium II Processor with KNI Technology”. Sin embargo, compradores expertos podían esperar más de un procesador con un nuevo nombre. Cuando Intel cambió de Pentium a Pentium II, el nuevo procesador significó una mejora de prestaciones, aunque tenían la misma velocidad de reloj. Un Pentium III con la misma velocidad obtenía las mismas prestaciones que un Pentium II en la gran mayoría de aplicaciones, según los benchmarks. Existen dos generaciones dentro de los Pentium III: Katmai y Coppermine. Katmai es el primer miembro de la familia Pentium III. Es, en esencia, un Pentium II con unas capacidades multimedia mejoradas. Las velocidades son 450 MHz y 500 MHz. En cuanto a Coppermine comenzó con una velocidad de 550 MHz. Este procesador se implementa en 0.18 micras y puede alcanzar 1.0 GHz, y contiene una cache L2 en chip de 256 K. Este procesador utiliza la misma segmentación, caches, bus y el mismo tipo de encapsulado que Deschutes (última generación de Pentium II). Todas las novedades del Katmai, excepto una, están enfocadas a contenidos multimedia, como se muestra en la figura 1. Entre las novedades se incluyen 70 nuevas instrucciones (alias KNI) y una nueva arquitectura en el flujo de memoria; se les llama oficialmente “Internet streaming-SIMD extensions” (Internet SSE). Las SSE son útiles para software de comunicaciones, como modems ADSL, conseguir grandes ratios de compresión de datos utilizando técnicas como 3D NURBS, que serían imposibles de ejecutar en un Pentium II. La única novedad que no está directamente relacionada con contenidos multimedia es el número de serie del procesador, que ha venido acompañado de numerosas críticas. El nuevo chip tiene potencial para superar significativamente al Deschutes en todos los contenidos multimedia. Sin embargo, para aprovechar esta capacidad ha de utilizar software diseñado expresamente para sus características. Características SIMD La arquitectura SSE es un avance multimedia más significativo que fue MMX. SSE representa una mejora sobre MMX para el procesado de vídeo, sonido, voz y gráficos 3D. Katmai implementa sólo la mitad de los 128 bits del ancho de la arquitectura SSE. Esto limita a Katmai a la mitad del potencial de la arquitectura. Setenta nuevas instrucciones Las SSE en Katmai se dividen en dos categorías: nuevas instrucciones SIMD y nuevas características del flujo de memoria. El propósito de las instrucciones 36 SIMD es incrementar el ratio de vectores que se pueden procesar. Estas instrucciones ofrecen al software la posibilidad de expresar el paralelismo que es inherente en este tipo de datos, así el hardware puede procesarlo en paralelo. SSE introduce nuevas instrucciones SIMD de enteros y coma flotante (SIMD-FP). Las de enteros son simplemente extensiones del conjunto de instrucciones MMX (newmedia instructions) que aceleran tareas multimedia importantes. Podemos encontrar un resumen en la siguiente tabla. 37 SIMD-FP: la principal novedad La característica más importante de Katmai es las instrucciones SIMD-FP. Inicialmente, se utilizan principalmente para acelerar gráficos 3D, como muestra la figura 2. Pero Intel espera que las SIMD-FP se utilicen también en datos de coma flotante para otros algoritmos de procesado de señal. Las SIMD-FP introducen un nuevo archivo de registros que contiene ocho registros de 128 bits, cada uno con la capacidad de almacenar un vector de cuatro elementos IEEE de coma flotante y precisión simple. Las SIMD-FP realizan operaciones aritméticas de elementos de dos registros devolviendo como resultado un vector de cuatro elementos en uno de los dos registros. Esta arquitectura permite llevar a cabo cuatro operaciones de coma flotante y precisión simple con una única instrucción para alcanzar la potencia de cuatro operaciones de suma o multiplicación por ciclo. Para evitar rediseñar completamente el núcleo del microprocesador, Intel introdujo las nuevas SIMD-FP en el núcleo de Deschutes, utilizando el menor silicio posible. Para conseguir esto, Intel implementó la arquitectura de 128 bits doblando el ciclo de los data-paths de 64 bits y uniendo las SIMD-FP con el multiplicador escalar de coma flotante x87 en una misma unidad, como muestra la figura 3. Para utilizar los data-path de 64 bits existentes, Katmai convierte cada SIMDFP en dos ops. Para evitar la posibilidad de que la máquina quede en un estado impreciso entre dos ops, Intel inventó el mecanismo check-next- op para que no se actualice el registro desde la primera instrucción hasta que no se asegure que la segunda op se completará sin generar ninguna excepción. El check-next- op no tiene ningún efecto sobre la ejecución segmentada pero puede atascar la retirada prolongando en un ciclo más. Esta penalización se evita cuando se inhabilitan las excepciones, que es el modo normal de funcionamiento. Para compensar parcialmente la implementación de la mitad del ancho de la arquitectura SSE, Katmai implementa el sumador SIMD-FP como una unidad aparte en el segundo puerto de salida, como muestra la figura 3. Esto permite que la mitad de un SIMD multiplique y medio SIMD independiente sume, pudiéndose 38 obtener ambos resultados a la vez, como muestra la figura 4. De esta forma se obtiene un throughput de cuatro operaciones de coma flotante por ciclo. Generalmente las sumas tienen dependencia de datos respecto a las multiplicaciones. Por lo tanto, para alcanzar el máximo throughput, el código tiene que estar estructurado expresamente. Katmai puede realizar dos instrucciones move simultáneamente. La implementación de la arquitectura SIMD-FP en Katmai añade nuevas unidades para instrucciones: shuffle y reciprocal estimates, que aumentan la carga en los puertos de salida. Katmai es 50 MHz más rápido que Deschutes. El peligro que tiene el método de Katmai es que el hardware ha implementado un modelo de paralelismo diferente al que implica la arquitectura. La arquitectura SIMD-FP completamente IEEE-754 Todas las instrucciones SIMD-FP de Pentium III se adhieren a la especificación IEEE-754. A diferencia de las FPU x87 escalares, las unidades SIMD-FP de Katmai implementan todas las excepciones en hardware, excepto underflows y resultados no normalizados. Mucho más que simple aritmética SIMD-FP Para situaciones con dependencia de datos, la arquitectura proporciona instrucciones que comparan elementos de dos vectores SIMDFP según las relaciones: igual, menor que, menor o igual que, desordenado, distinto, mayor que, o mayor o igual que. El resultado es un vector de cuatro elementos de tipo Booleano (verdadero = 0xFFFFFFFF, falso = 0x00000000) que puede ser manipulado por un conjunto de instrucciones lógicas SIMD (AND, ANDN, OR, XOR) para enmascarar elementos dentro de un vector. Memory Streaming SIMD puede incrementar fácilmente la tasa de procesado hasta un nivel por encima de la capacidad de la memoria del sistema para proporcionar datos. Cuando ocurre esto se limita el speed-up ya que las unidades de ejecución se utilizan poco o detienen. En figura 6 (a) se muestra un ejemplo en el que Intel no ha hecho nada para mejorar la utilización de la memoria. Pero Intel aumentó el throughput del sistema de memoria y del bus del P6, como muestra la figura 6 (b), con un conjunto de cambios (instrucciones de prebúsqueda, streaming stores, y write combining (WC) mejorado) que conjuntamente reciben el nombre de memory streaming. La efectividad de estas medidas dependerá del uso que haga el software de las nuevas instrucciones y de la buena estructuración del código. 39 Memory-streaming tiene problemas: no comparte los modelos encontrados en accesos aleatorios a memoria, es difícil de aplicar debido a la dinámica del entorno, y los compiladores no han sido preparados para utilizarlo. Sin embargo, las aplicaciones multimedia raramente tienen modelos de acceso aleatorio, y la prebúsqueda de Katmai puede ayudar a controlar la dinámica del entorno. Los avances rápidos que también se dan en predicción de datos, permiten a los compiladores usar la prebúsqueda de instrucciones más eficazmente. La prebúsqueda provoca retardos, libera recursos Para flujos multimedia, los load tienen defectos. Cuando se adelantan en la secuencia de código, generalmente provocan la ejecución en orden, limitando el número de instrucciones que pueden estar en curso, como muestra la figura 7 (a). Además, los load no dan ninguna pista de la situación temporal de sus datos, por lo que es imposible optimizar la cache. Las instrucciones de prebúsqueda de Katmai solucionan estos defectos. No penalizan ni modifican el estado de la arquitectura. Pueden ser desplazadas arbitrariamente y retiradas antes de que finalice el acceso a memoria, como muestra la figura 7 (b), liberando recursos y permitiendo que sean atendidas más instrucciones. Es más, la prebúsqueda de instrucciones de Katmai aconseja al hardware estimando el nivel de cache en el que debería estar situada la línea direccionada. Entre las opciones se incluyen todos los niveles de cache: L1 solamente, todos los niveles superiores a L1, y la posibilidad de ignorar la cache. Katmai también añade streaming store, que en un fallo, evita la cache y no escribe una nueva línea. Este mecanismo evita que el software “ensucie” las caches cuando se sabe que los datos almacenados no se volverán a leer otra vez. Para mejorar el rendimiento del streaming store, Katmai incrementa a cuatro el número de WC buffers, como muestra la figura 8. Realmente no añade nuevos buffers, sólo utiliza los ya existentes en Deschutes con función doble. La distribución de los WC buffer y las reglas de flujo están mejoradas para reducir la ocupación media del buffer. Katmai, automáticamente vacía el buffer tan pronto como se llena. Intel asegura que la nueva estructura WC es efectiva y muestra simulaciones en las que raras veces empeoran las prestaciones de load. P III y K6 III están bastante cerca AMD K6 III y Katmai se parecen en demasiadas cosas. SSE utiliza el formato completo de IEEE-754 que le permite utilizar aplicaciones científicas que no son posibles con 3DNow. Además, 3DNow carece de las new-media instructions SSE, que proporcionan las ya mencionadas mejoras multimedia. El nuevo registro de archivos de SSE da teóricamente una gran ventaja sobre 3DNow, aunque en la práctica se ve disminuida por el formato de instrucciones destructivo de dos operandos (ej. RD RD op RS). Esto demuestra que SSE tiene ventajas sobre 3DNow. 40 A pesar de que Katmai desaprovecha la mitad del ancho de su implementación, la principal ventaja de SSE sigue siendo su arquitectura de 128 bits. Este ancho permite duplicar el paralelismo expresado por instrucción como con 3DNow. Esto reduce el grado de complejidad del paralelismo eliminando carga en los registros, la cache de instrucciones, el instruction issue y la reorganización de recursos. Esta ventaja permite a Katmai ser mejor en la práctica, aún teniendo el mismo pico que K6 III, en cuanto a throughput. Difundir es la clave del éxito Intel introdujo Pentium III como tope de gama, y con la misma frecuencia que Pentium II, el sobreprecio de SSE es de un 4%. Intel debe atraer la atención de los diseñadores de software hacia su nueva tecnología, aprovechando su convincente potencial, para poder superar a 3DNow. También debe trasladar la arquitectura SSE a todos sus productos. Con estas técnicas, Intel trata de volver a tomar el liderazgo de la plataforma x86. 6. Conclusiones. El hecho de disponer ambos de Pentium III ha sido determinante en la elección del tema de nuestro trabajo. Después del estudio realizado, nos vemos capacitados para dar nuestro punto de vista acerca de esta arquitectura y de su evolución. El cambio revolucionario se produjo única y exclusivamente con la aparición de Pentium Pro. Los distintos modelos sucesivos son únicamente pequeñas modificaciones para mantener su posición en el mercado. El principal inconveniente que presenta P6 es que continúa cargando con algunas deficiencias de aquel 8086, con sus consecuentes limitaciones. Creemos que la realización del trabajo ha sido muy beneficiosa por múltiples motivos. Nos ha permitido conocer el funcionamiento de los procesadores que estamos utilizando continuamente y que, hasta hace poco, desconocíamos. Hemos aprendido inglés técnico, que seguro que nos será útil en un futuro. Ha servido para empezar a desenvolvernos en el ámbito de la investigación. Además, realizar conjuntamente el trabajo nos ha permitido discutir ciertos aspectos y comprender otros, cosa que habría sido imposible desde un punto de vista individual. La búsqueda de información y traducción, aun siendo en grupo, creemos que ha sido la tarea más complicada y a la que más tiempo le hemos dedicado. Hemos encontrado detalles que nos han resultado difíciles de comprender y que nos han impedido avanzar con mayor rapidez. Como conclusión final, pensamos que la realización de trabajos en grupo es la mejor forma de aprender y comprender. Rafa Sospedra Cardona ([email protected]) Carlos Bernal Serra ([email protected]) 41 APÉNDICE A. Predicción de saltos. El procesador Pentium Pro de Intel es el primero en utilizar un algoritmo de predicción de saltos basado en dos niveles para mejorar el acierto. Este algoritmo publicado por Tse-Yu Yeh y Yale Patt, tiene la potencia de mejorar el acierto mas allá del 90% sobre el nivel alcanzado por los procesadores de su época. La predicción de saltos ha sido un problema para los diseñadores de CPUs desde el principio de la segmentación (pipelining). Un procesador segmentado ha de buscar la siguiente instrucción antes de que la actual se haya ejecutado. Si la instrucción actual es un salto, el procesador debe decidir dónde buscar la siguiente instrucción, asumiendo que el salto se no se tomará (not taken) y que la dirección de la siguiente instrucción estará en la próxima dirección de memoria, o que se tomará (taken). Una elección incorrecta llevará a que el pipeline se pare hasta que se pueda rellenar con instrucciones validas; a esto se le denomina penalización por error de predicción en el salto (mispredicted branch penality). Procesadores con sólo 5 etapas tienen una penalización típica de 2 etapas. Para un diseño superescalar de 4 vías, éste puede perder 8 instrucciones por un error de predicción. Si en los programas se encuentran típicamente saltos cada 4 – 6 instrucciones, errores de precisión en el cálculo de predicciones causan profundos problemas en diseños superescalares o altamente segmentados. Los esfuerzos iniciales en la predicción de saltos utilizaban algoritmos basados simplemente en la dirección del salto. Predicción estática. Delay Slot en 486. Para procesadores escalares con una segmentación relativamente corta, la preocupación por la predicción de saltos es menor. De hecho, para procesadores con delay slot en los saltos, la penalización puede ser tan pequeña como de un ciclo. El método de “predicción” por defecto en los diseños segmentados simples consiste en asumir que los saltos nunca se toman (not taken), ejecutando siempre instrucciones secuenciales. El 486 utiliza este método porque es muy simple y barato. Taken. Sin embargo los saltos condicionales normalmente se toman (taken). La mayoría de programas tienen grandes bucles que hacen saltar muchas veces a la misma dirección. Simulaciones demuestran que los saltos condicionales se toman un 60% de las veces según el SPECint89. Así que una posible solución sería predecir que los saltos siempre se toman (taken). BTFN (Backwards Taken Forwards Not taken). Los saltos hacia detrás normalmente completan el número de iteraciones del bucle por tanto, según el número de éstas, mayor es el porcentaje de saltos tomados (taken). Los saltos hacia delante son más difíciles de predecir pero la tendencia es una mayor frecuencia de no tomados (not taken) que de tomados (taken). De este modo por simple inspección de la dirección del salto (normalmente disponible en el bit de signo del offset), un procesador puede predecir saltos hacia detrás como tomados (taken) y hacia delante como no tomados (not taken). Este 42 algoritmo de BTFN (Backwards Taken Forwards Not taken) tiene éxito en el 65% de los casos según SPECint89. MicroSparc-2 y la mayoría de procesadores PA-RISC lo utilizan. Profiling o Feedback-directed Compilation. Con un juego de instrucciones apropiado un compilador puede mejorar el acierto en la predicción de saltos. Un buen compilador puede reconocer secuencias de código como bucles. Los MIPS y Power PC implementaban unas instrucciones de salto especiales que esconden ayuda para el compilador en determinados bits. Además la técnica de Profiling o Feedback-directed Compilation se basa en que después de que el programa esté inicialmente compilado, hace un test para obtener la dirección típica de cada salto y lo recompila ajustando la predicción de saltos. Según IBM, sus compiladores obtienen un éxito de 75% en el SPECint92 utilizando esta técnica. Predicción Dinámica Los algoritmos anteriores estaban clasificados como estáticos, porque en un salto en particular siempre predecían lo mismo donde se encontrasen. Lo algoritmos que vamos a ver a continuación se llaman dinámicos porque el procesador aprende de sus propios errores y cambia las predicciones en función del comportamiento de cada salto en particular. Algoritmo de James Smith El primer algoritmo dinámico fue publicado por James Smith en 1981. Este algoritmo almacena un historial sencillo, de un solo bit, en cada salto; cuando se encuentra un salto se predice lo que nos indica el bit del historial. Esta técnica impulso el acierto a un 80%. De un modo práctico hay dos maneras de implementar esta técnica: 1) Los bits de historial se pueden guardar, por ejemplo, una vez cada 4 instrucciones. Cuando las instrucciones se buscan en la cache miramos el bit de historial. Si está activado, este grupo de instrucciones contiene un salto predicho como tomado (taken) y pasa a leer la instrucción a la que se salta. Aunque este método (utilizado por Digital’s Alpha y AMD’s K5 entre otros) proporciona predicción dinámica con coste mínimo, tiene algunos errores. Algunos grupos de instrucciones no contendrán ningún salto, desaprovechando el bit de historial. En cambio, grupos con múltiples saltos provocan interferencias, ya que el historial de un salto, sobrescribe el bit de otro grupo. 2) Los procesadores como el Pentium almacenan el bit de historial en distintas tablas de historial (BHT –Branch History Table), asignando una entrada para cada salto. El BHT mejora la precisión evitando la interferencia y los bits no usados, defectos que encontramos en el modelo anterior. Por otra parte se puede alcanzar una precisión similar con menos entradas. Sin embargo el BHT debe mantener su propio conjunto de etiquetas aumentando considerablemente la cantidad de almacenamiento requerido. La mayoría de los procesadores con BHT separada almacenan 2 bits de historial para cada entrada en lugar de uno. En este método, también desarrollado por Smith, los dos bits se pueden considerar como un contador por saturación que 43 se incrementa cuando se salta (taken) y se decrementa cuando no se salta. El bit más significativo se usa para predecir futuros saltos. Otro modo de ver esta implementación es como una máquina de estados (ver figura 1). La ventaja del método de 2 bits es que un cambio esporádico no cambiará la predicción. Por ejemplo si un salto se toma muchas veces (taken) la máquina de estados estará en ST (3) (Strongly Taken), si una vez no se salta (not taken) los bits de historial indicarán WT (2) (Wakely Taken) pero se continuará prediciendo como tomada la siguiente iteración, solamente si el salto no se toma dos o más veces consecutivamente la predicción cambiará a no tomada (not taken). Este efecto de histéresis puede elevar la precisión de la predicción hasta el 85% en SPECint92, dependiendo del tamaño y tipo de la tabla de historial utilizada. Algoritmo de dos niveles Para mejorar la precisión de predicción, los diseñadores del Intel P6 utilizaron el algoritmo de dos niveles desarrollado por Yeh y el Profesor Patt en la Universidad de Michigan. Los dos investigadores publicaron este algoritmo en 1991 y continuaron perfeccionándolo hasta que Yeh se graduó en 1993. Actualmente, Yeh está trabajando para Intel. Una forma de intentar mejorar el algoritmo de Smith consiste en incrementar el número de bits de historial. De este modo es más lento pasar de un extremo a otro (de ST a SNT, o viceversa) que en el diseño de dos bits. En cambio, el algoritmo de dos niveles busca modelos en un registro extendido de historial. Por ejemplo, supongamos que un salto ha sido tomado tres veces seguidas y, a continuación, una vez no tomado. En la próxima iteración, ¿volverá a tomarse o ahora se pasará a no tomado? Para resolver esta cuestión, el algoritmo busca el comportamiento previo de la misma secuencia para que usando el historial se pueda generar una predicción. Para implementar este algoritmo se requieren dos niveles de almacenamiento, como se muestra en la figura 2. Para cada salto, un registro del historial guarda el estado de los últimos k saltos. Este circuito es un registro de desplazamiento que representa los saltos tomados con un 1 y los no tomados con un 0. Cada salto tiene una tabla de modelos con 2k entradas. Cada entrada implementa un contador de saturación de dos bits que guarda el resultado de las iteraciones previas ocurridas cuando el registro de historial se encontraba en un determinado estado. Cuando se encuentra un salto, los contenidos de la tabla de registros se utilizan como índice dentro de la tabla de modelos, seleccionando la entrada que corresponde a la historia reciente de ese salto. Como en el algoritmo de Smith, los dos bits de cada entrada indican la predicción. Después de resolver el salto, el resultado se desplaza en el registro de historial y se utiliza para actualizar la 44 entrada correspondiente en la tabla de modelos. Para mejorar la ejecución en bucles cerrados, los diseños deben actualizar especulativamente estos campos corrigiéndolos en caso de error. Simplificación El almacenamiento de una historia para cada posible salto no es práctico, por lo tanto, solamente se guarda la historia de los más recientes. La aproximación de dos niveles requiere mucho menos almacenamiento que el diseño de dos bits: para cada salto hay una tabla de modelos de 2 x 2k, como muestra la figura 3. Una implementación con k=4 requiere 18 veces más capacidad que una simple de dos bits. Para permitir implementaciones con grandes valores de k, Yeh y Patt propusieron reducir el número de tablas de modelos, combinando múltiples saltos en cada tabla. Los saltos se pueden agrupar en conjuntos teniendo en cuenta sus direcciones u otras características. Los saltos del mismo grupo utilizan la misma tabla de modelos. En su taxonomía, Yeh y Patt llaman a esto el algoritmo de PAs, en oposición al método de PAp descrito anteriormente. Aunque la combinación de múltiples historias de salto provoca interferencias, esta pérdida se compensa con la posibilidad de implementar tablas de modelos más grandes y consecuentemente registros de historial más grandes. En cuanto a coste de hardware, los PAs ofrecen mejoras respecto a los PAp. Yeh y Patt simularon varios diseños que utilizaban 8 Kbits de almacenamiento; en este tamaño, la configuración con mayor precisión es 1024 x 6-bit de tabla de historia de saltos (k=6) con 16 tablas de modelos (cada una de 128 bits). En este caso, el BHT consume un 75% del presupuesto de almacenamiento, siendo el resto para las tablas de modelos. Taxonomía de Yeh y Patt En su informe, Yeh y Patt definieron una taxonomía de las posibles variaciones del algoritmo de dos niveles, asignando a cada una un código de tres letras. La primera indica el tipo de registro de historia (P, S o G). La segunda letra es siempre “A”, mientras que la tercera letra representa el método de selección de la tabla de modelos (p, s ó g). El algoritmo completo utiliza registro de historia por dirección (P), esto es, un registro de historia distinto para cada salto. De otro modo, todos los saltos se pueden agrupar en un único registro de historia global (G). Una propuesta intermedia, presentada por Pan, So y Rahmeh, agrupa saltos en conjuntos y cada conjunto tiene su propio registro de historia (S). Del mismo modo, las tablas de modelos se pueden organizar por direcciones (p) o por conjuntos de saltos (s). Por último, también se puede utilizar una tabla de registros global (g). Para una mayor simplificación, se puede reducir el BHT a un único registro de historia de saltos. Este recurso global guarda los resultados de los k últimos saltos, sin tener en cuenta sus direcciones. Sin embargo, la tabla de modelos puede estar organizada todavía por direcciones (GAp) o puede estar agrupada por conjuntos (GAs). Sin considerar el BHT, se puede incrementar el tamaño del registro de historia (k) y el número de tablas de modelos para un hardware fijo. Para pequeñas implementaciones como el diseño de 8 Kbits, el método PAs obtiene mejores resultados. Con un presupuesto de 128 Kbits, GAs es superior. Específicamente, un diseño GAs con un registro de historia con 11 bits y 32 tablas 45 de modelos (cada una de 2 x 211 ó 4096 bits) obtiene la mayor precisión con este presupuesto para almacenamiento. Las GAs tienen la ventaja de que utilizan menos iteraciones para obtener un historial fiable a partir de un único registro de historia. Esto puede dar al registro de historia global una ventaja en diseños reales para pequeñas implementaciones. 46 APÉNDICE B. Decodificación de Instrucciones. DEC. Se muestran las uops en las que se decodifica cada IA al pasar por la fase 47 48 Bibliografía. o o o o o o o o o o o o o o o o Tom Shanley, “Pentium Pro and Pentium II System Architecture”, 2ª edición, Addison-Wesley. J.L. Hennessy, D.A. Patterson, "Computer Architecture: A Quantitative Approach", 3ª edición, Morgan Kaufmann Publishers, 1996 William Stallings, “Organización y Arquitectura de Computadores”, 5ª edición, Prentice Hall, 2000. Intel Application Notes, 2422816. Intel Datasheet, 24276905, 24333503, 24357001, 24445209, 27326801. Intel Developers Manual, 24350201. Intel Architecture Optimization Manual, 24281603. MicroDesign Resources. “Intel’s P6 uses Decoupled Superscalar Design”. Vol. 9, No. 2, February 16,1995. MicroDesign Resources. “New Algorithm Improves Branch Prediction”. March 27,1995. MicroDesign Resources. ”Pentium Pro Debuts with Few Bugs”. December 4,1995. MicroDesign Resources.”Intel Prepares MMX CPU Wave”. December 30,1996. MicroDesign Resources. “Klamath Extends P6 Family”. February 17, 1997. MicroDesign Resources. “Pentium II Debuts at 300 MHz”. May 12, 1997. MicroDesign Resources. “P6 Reaches All Market Segments”. April 20,1998. MicroDesign Resources. “Pentium III = Pentium II + SSE”. March 8, 1999. SPEC, http://www.spec.org Anexos. Se adjunta un CD con información que hemos considerado interesante. o o o o o Intel Application Notes, 2422816. Intel Datasheet, 24276905, 24333503, 24357001, 24445209, 27326801. Intel Developers Manual, 24350201. Intel Architecture Optimization Manual, 24281603. Artículo “A Case Study of 3 Internet Benchmarks on 3 Superscalar Machines”, Yue Luo, Pattabi Seshadri, Juan Rubio, Lizy Kurian John and Alex Mericas. The University of Texas Austin. Agradecimientos. Miguel Ángel Mateo Pla sin el que no hubiésemos comenzado. Carlos Marzal Moscardó al que atribuimos el diseño de portada. Empar y Elena por las horas que han pasado sin nosotros. A nuestras madres. 49