5. Distintas Implementaciones de la arquitectura Intel P6

Anuncio
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
Descargar