Вы находитесь на странице: 1из 57

En este captulo vamos a ver cmo mejorar las prestaciones de la CPU mediante los

procesadores segmentados (o en pipeline), los cuales incorporan una tcnica para acelerar el
ritmo de ejecucin de las instrucciones.
En primer lugar empezaremos por comentar algunos aspectos bsicos para introducir los
conceptos en los que se apoya esta tcnica.
A continuacin nos centraremos en nuestro procesador de referencia, el MIPS64, viendo la
configuracin de las etapas que componen su cauce.
Como veremos, hay diversos factores que pueden impedir un aprovechamiento ptimo del
concepto de pipeline en la CPU. Trataremos estos factores y las tcnicas para evitarlos en la
medida de lo posible.
Por ltimo abordaremos una mejora ms del pipeline mediante el concepto de operaciones
multiciclo que reducirn las esperas o paradas generadas por las instrucciones pesadas, como
las multiplicaciones, divisiones o las operaciones en coma flotante.

Arquitectura de Computadores Segmentacin del Cauce - 1


La primera opcin que se nos ocurre para aumentar la velocidad de un procesador es aumentar la
velocidad del reloj, lo cual es muy fcil, pero claro, si los circuitos que componen las etapas de
ejecucin del procesador no soportan esa velocidad, ste se quema o deja de funcionar
correctamente.
As, para poder aumentar la velocidad del reloj, primero se deben hacer ms rpidos los circuitos
con los que se construyen los procesadores y la memoria principal. No obstante, se debe
considerar el coste que supone una mejora, y que el lmite de esta velocidad lo impone el estado
del arte actual de la tecnologa.
Otra posibilidad es organizar el hardware para poder ejecutar ms de una instruccin
simultneamente: concurrencia. La concurrencia se puede obtener en dos niveles: al nivel del
procesador y al nivel de la instruccin. La concurrencia al nivel de la CPU se obtiene disponiendo
de mltiples procesadores ejecutando simultneamente varias instrucciones. Obtener
concurrencia a nivel de la instruccin significa poder ejecutar varias instrucciones
simultneamente con una nica CPU. Este ltimo tipo de paralelismo se denomina segmentacin,
aunque suele ser ms conocido por su denominacin en ingls: pipelining.
Las arquitecturas con mltiples procesadores suelen utilizarse en mquinas de muy altas
prestaciones (y muy alto precio). Sin embargo, con arquitecturas segmentadas se consigue una
muy buena mejora del rendimiento y a un coste asequible. Por esto, es normal que todos los
microprocesadores actuales de propsito general incorporen el pipelining. Ya que es muy comn
su utilizacin en los actuales procesadores, vamos a abordar aqu esta tcnica del pipelining,
mientras que las arquitecturas multiprocesador las dejaremos para asignaturas o textos de
arquitecturas paralelas o avanzadas.

Arquitectura de Computadores Segmentacin del Cauce - 2


Ahora ya podemos abordar el concepto de pipeline. El proceso en pipeline (o segmentado) es
similar al utilizado en cualquier cadena de montaje, y el nombre pipeline (tubera) se debe al
hecho de que, como en una tubera, en la entrada se aceptan nuevos elementos (instrucciones)
antes de que los previamente aceptados salgan por la salida.
Empecemos con el ejemplo de una cadena de montaje. Supongamos una gran pastelera en la
que las tartas primero se hacen en el horno y despus se empaquetan para la venta. El proceso
de empaquetar una tarta consiste en:
1. Poner una caja vaca en la mesa.
2. Meter una tarta en la caja.
3. Cerrar y precintar la caja.
4. Poner una etiqueta en la caja.
5. Llevar la caja a un gran contenedor.
Si cada una de estas operaciones la realiza un operario en 10 segundos, parece claro que se
tarda 50 s en empaquetar una tarta y, por lo tanto, en empaquetar 10 tartas se tardara 500 s.

Arquitectura de Computadores Segmentacin del Cauce - 3


Ahora supongamos que se dispone de una cadena de empaquetado de tartas con una cinta
transportadora sobre la que trabajan cinco operarios especializados en tareas distintas. El primer
operario pone la caja-1 en la cinta transportadora, y sta avanza hasta que la caja-1 est donde el
segundo operario, que introduce una tarta dentro de la caja-1, al mismo tiempo que el primer
operario pone otra caja-2 en la cinta. La caja-1 sigue avanzando hasta el tercer operario, que la
cierra y la precinta, al mismo tiempo que el segundo operario mete otra tarta en la caja-2 y el
primer operario pone otra caja-3 en la cinta. La caja-1 sigue su camino en la cinta pasando por el
cuarto operario, que pone una etiqueta, hasta llegar al quinto operario, que la retira de la cinta.
En el momento que el quinto operario retira la caja de la cinta, hay cuatro cajas ms en la cinta. Si
cada una de estas fases de empaquetado se realiza en 10 s, a partir de ahora, cada 10 s saldr
una nueva tarta empaquetada, en lugar de hacerlo cada 50 s que se tardaba cuando no haba
cadena de empaquetado. A partir de ahora, solamente se tardar100 segundos en tener 10 tartas
empaquetadas, mientras que en el caso de cuando se tena un solo operario se tardaba 500
segundos.
Debe quedar claro que aunque ahora sale una nueva tarta empaquetada cada 10 s, la
preparacin completa de cada tarta sigue requiriendo 50 s (igual que cuando haba una sola
persona preparando las tartas).
Ha aumentado el rendimiento, pero se mantiene el tiempo de empaquetado de cada tarta.
Si calculamos el rendimiento de los dos sistemas de empaquetado de tartas, veremos que el
rendimiento en este ltimo caso se ha multiplicado por 5 (igual al nmero de etapas!).

Arquitectura de Computadores Segmentacin del Cauce - 4


Segn lo que acabamos de ver, parece que interesa dividir las fases de ejecucin de las
instrucciones en ms etapas, para as obtener un mayor rendimiento en la ejecucin.
La ejecucin de una instruccin podra descomponerse en las siguientes 5 etapas:
1. F: Alimentacin de la instruccin (fetch)
2. D: Decodificacin de la instruccin / Lectura de registros
3. E: Ejecucin (en la ALU) / Clculo de la direccin efectiva
4. M: Acceso a memoria
5. W: Escritura del resultado en registros de la CPU
Si ahora la ejecucin de una instruccin est descompuesta en 5 etapas, cada etapa puede durar
aproximadamente 1/5 de la duracin total de la ejecucin de la instruccin. Si suponemos que la
duracin de un ciclo de reloj es igual a la duracin de cada una de estas pequeas etapas,
podemos decir, en principio, que con la tcnica de la segmentacin (o pipelining) se consigue que
a cada ciclo de reloj finalice una instruccin, o lo que es lo mismo, una velocidad de instruccin
por ciclo.
Debemos tener en cuenta que:
Cada etapa dispone de los recursos hardware necesarios para realizar su cometido.
Las ejecuciones de las instrucciones se solapan.
Todas las etapas tienen la misma duracin (ciclo de reloj).
La duracin del ciclo de reloj lo fija la etapa ms lenta.

Arquitectura de Computadores Segmentacin del Cauce - 5


En este histograma podemos ver la comparacin entre dos procesadores de similares
caractersticas y que su gran diferencia consiste en estar o no estar segmentados. Utilizaremos el
procesador del ejemplo que hemos visto en la pgina anterior, en el que supondremos que el ciclo
de reloj es 1 ns.
El ciclo de reloj es igual para ambos casos (1 ns), ya que partimos de dos procesadores con
similares caractersticas.
El tiempo de ejecucin de la instruccin (si todas las instrucciones pasan por todas las etapas)
tambin es igual en ambos casos (5 ciclos).
En cuanto al rendimiento, el procesador no segmentado ejecuta una instruccin, que tarda 5
ciclos, y hasta que no termina, no comienza la ejecucin de otra instruccin, por lo que termina
una instruccin cada 5 ciclos, o sea, que se consigue un rendimiento de 1 instruccin cada 5
ciclos. En cambio, en el caso del procesador segmentado, cuando una instruccin arranca, al ciclo
siguiente se arranca la siguiente instruccin y, de esta manera, cuando la primera instruccin
termina, al ciclo siguiente termina la segunda. De esta manera, tenemos que a cada ciclo finaliza
una instruccin, consiguiente un rendimiento de una instruccin por ciclo o, como vemos en el
grfico, de 5 instrucciones cada 5 ciclos.

Arquitectura de Computadores Segmentacin del Cauce - 6


Como habamos visto anteriormente, la aceleracin o speed up, es el cociente entre el tiempo
medio que transcurre entre la finalizacin de las instrucciones en el procesador no segmentado y
en el segmentado.
En el procesador segmentado, en condiciones ideales, a cada ciclo finaliza la ejecucin de una
instruccin, consiguiendo un nmero medio de ciclos por instruccin (CPI) igual a 1.
No debemos olvidar que en un procesador segmentado (una vez que est lleno el cauce y en
condiciones ideales), en un momento dado hay tantas instrucciones en ejecucin como etapas
tiene; no obstante, cada etapa se est ocupando de una funcin distinta de cada instruccin.

Arquitectura de Computadores Segmentacin del Cauce - 7


Veamos la mejora de aceleracin que se experimenta al segmentar un procesador convencional,
cuando ejecuta un programa que consta del 40% de instrucciones aritmticas, un 20% de
instrucciones de salto y otro 40% de instrucciones de acceso a operandos en memoria principal.
Las instrucciones aritmticas del procesador no segmentado requieren 4 ciclos, mientras que las
de salto y acceso a memoria consumen 5 ciclos de reloj.
El procesador segmentado consta de 5 etapas, y el ciclo de reloj es 1 ns.
El tiempo medio de ejecucin de una instruccin en el procesador NO segmentado se obtiene
mediante la suma de los tiempos de ejecucin de cada tipo de instruccin por sus frecuencias de
aparicin en los programas, obteniendo as, un valor medio de 4,6 ns.
En el caso del procesador segmentado, tenemos que cada etapa requiere 1 ciclo de reloj (1 ns).
As tenemos que cada instruccin tardar en ejecutarse un total de 5 ns, pero, en realidad, cada 1
ns finalizar una instruccin.
De esta manera, la mejora en rendimiento (speed up) que se experimenta es el cociente entre el
tiempo medio que transcurre entre la finalizacin de las instrucciones en el procesador no
segmentado y el segmentado, consiguiendo as, una mejora del 4,6. Esto significa que, para
programas con esta distribucin de frecuencias en sus instrucciones, el procesador segmentado
es 4,6 veces ms rpido que el convencional.

Arquitectura de Computadores Segmentacin del Cauce - 8


Arquitectura de Computadores Segmentacin del Cauce - 9
Una vez vistos los conceptos bsicos del pipeline, vamos a concretarlo en una versin simplificada
de la arquitectura MIPS64.
Vamos a considerar una versin bsica de 5 etapas, en la que la Unidad Aritmtico-Lgica
solamente va a operar con datos enteros.
El tiempo de ejecucin de cada etapa va a ser un ciclo.
Ahora iremos mostrando en las siguientes pginas la descripcin de cada una de las 5 etapas de
este pipeline simplificado de MIPS64.

Arquitectura de Computadores Segmentacin del Cauce - 10


En esta primera etapa se extrae o alimenta una instruccin de memoria, de la direccin indicada
en el registro Contador de Programa PC (Program Counter), y se almacena en el registro de
instruccin IR (Instruction Register).
A continuacin se calcula la direccin de la siguiente instruccin en secuencia (su direccin en
memoria), aadindole al PC el tamao de la instruccin alimentada. En nuestro caso, todas las
instrucciones son de longitud constante, 4 bytes. La direccin calculada se lleva al registro PC.
La instruccin queda en el registro IR de donde se ir extrayendo informacin en las sucesivas
etapas.

Arquitectura de Computadores Segmentacin del Cauce - 11


Aqu se realizan 4 funciones:
Decodificacin de la instruccin alimentada, es decir, se averigua cul es la operacin que se debe
realizar.
En paralelo se lee el contenido de los registros indicados como operandos en la instruccin, y se
guardan en los registros temporales A y B.
Si la instruccin contiene un campo de 16 bits con un valor inmediato, se le hace una extensin de signo
a 32 bits y se guarda en el registro Inm.
Si la instruccin es de bifurcacin, la ALU hace dos cosas:
o Primero aade al PC el desplazamiento correspondiente al valor inmediato que se indica en la
instruccin de salto (desplazado 2 bits a la izquierda, o sea, multiplicado por 4) llevando el resultado a
la entrada del multiplexor de la etapa F. (En la instruccin de salto, el desplazamiento del salto se
indica como un mltiplo de 4, pues como todas las instrucciones ocupan 4 bytes, siempre estn en
una direccin mltiplo de 4).
o A continuacin se comprueba si el registro A tiene el valor 0, y el resultado de la comparacin se
dirige a la entrada de control del multiplexor de la etapa de Fetch. La salida de este multiplexor
proporciona la direccin de la siguiente instruccin que se va a ejecutar, bien la siguiente en
secuencia (esto ya lo habr hecho en el ciclo anterior), o bien la de la direccin indicada en la
instruccin de salto.
Es posible que, segn la operacin a realizar, algunas de estas acciones no tenga sentido realizarlas; por lo
que si la operacin no requiere alguno de los registros ledos, el valor inmediato o la direccin de salto
calculada, simplemente no se utiliza. En cualquier caso, no se pierde tiempo al hacerlo, ya que estas
acciones se realizan en paralelo, al mismo tiempo que la decodificacin.

Arquitectura de Computadores Segmentacin del Cauce - 12


Esta es la etapa de la Unidad Aritmtico-Lgica (ALU), donde se realiza una de estas tres posibles
funciones, dependiendo del tipo de instruccin:
Instruccin con registros (A op B ALUoutput). La ALU realiza la operacin indicada por el
cdigo de funcin u operacin, utilizando los valores de los registros temporales A y B. El
resultado se deja en el registro temporal ALUoutput.
Instruccin registro-Inmediato (A op Inm ALUoutput). La ALU realiza la operacin
indicada por el cdigo de funcin u operacin, utilizando los valores del registro temporal A y el
valor del registro Inm (que contiene el valor inmediato de la instruccin). El resultado se deja en
el registro temporal ALUoutput.
Referencia a memoria (A+Inm ALUoutput). La ALU suma estos operandos para formar
una direccin absoluta de memoria. El resultado se deja en el registro ALUoutput.
Estas tres funciones distintas pueden estar en la misma etapa (aunque solo se ejecuta una de
ellas en cada instruccin) ya que nunca se requiere que se haga ms de una de estas
operaciones sobre la misma instruccin.

Arquitectura de Computadores Segmentacin del Cauce - 13


Referencia a memoria. Dependiendo de si se trata de una instruccin de carga o de
almacenamiento, se realiza una de estas acciones:
Si es una carga, el dato trado de memoria se deja en el registro temporal LMD.
Si se trata de un almacenamiento, el dato del registro temporal B se escribe en memoria. En
cualquier caso, la direccin de memoria utilizada es la calculada en el ciclo (etapa) anterior y
que se dej en ALUoutput.

Arquitectura de Computadores Segmentacin del Cauce - 14


En esta etapa se escribe un valor en alguno de los registros generales (si la instruccin lo
requiere), bien si el valor viene de una posicin de memoria (valor en registro temporal LMD) o se
trata del resultado de una operacin en la ALU.

Arquitectura de Computadores Segmentacin del Cauce - 15


A modo de resumen, aqu tenemos un esquema general de las etapas de MIPS64
1. F (Alimentacin de instruccin Instruction Fetch). Se extrae una instruccin de la direccin de
memoria indicada por el Contador de Programa (PC) y se incrementa ste en 4, para que
apunte a la direccin de la siguiente instruccin.
2. D (Decodificacin de Instruccin / Lectura de registros). Se decodifica la instruccin extrada y
se lee el contenido de los registros indicados como operandos en la instruccin. Si es una
instruccin de salto, se calcula la direccin de destino incrementando el PC con el
desplazamiento indicado en la instruccin. En cualquier caso, la decodificacin se realiza en
paralelo con la lectura de los registros.
3. E (Ejecucin/Clculo de la direccin efectiva). Aqu, dependiendo del tipo de instruccin, se
realiza una de estas funciones:
Ejecucin de una operacin en la ALU (Unidad Aritmtico-Lgica), si es una instruccin
aritmtica, lgica, desplazamiento
Clculo de direccin efectiva (registro base + desplazamiento), si es un salto o carga/
almacenamiento.
4. M (Acceso a memoria). Si la instruccin es de acceso a memoria, para lectura o escritura
(carga/almacenamiento), se realiza en esta fase, utilizando para ello el valor del registro ledo
en la fase D (si es una escritura en memoria) y la direccin de memoria calculada en la fase E.
5. W (Escritura en registros). Si el resultado de la instruccin, o lectura de memoria, tiene como
destino un registro, se escribe en ste en esta fase.

Arquitectura de Computadores Segmentacin del Cauce - 16


En esta figura se muestra el pipeline de la arquitectura de MIPS que se ha comentado en las
pginas anteriores, y se puede ver cmo fluye una instruccin a travs del cauce.
Se trata de un pipeline simplificado para la ejecucin de estas pocas operaciones:
Load/Store
Operaciones con enteros
Salto condicional "si igual a cero
Como puede verse, al final de cada etapa, los valores obtenidos en ella deben guardarse para
poder acceder a ellos desde una etapa posterior; por ello, se salvan en unos registros temporales:
IR, A, B, Inm, ALUoutput, LMD.
Se puede apreciar que algunos registros estn ubicados en las etapas en las que se lee su
contenido, pero su escritura o actualizacin se produce en otras etapas. As, el registro PC est
situado en la etapa de extraccin de la instruccin (F), pero, en realidad, se escribe desde la etapa
D. Los registros generales estn ubicados en la etapa D, pero se escriben durante la etapa W.
Obsrvese que cuando la instruccin de salto se encuentra en la etapa D, sera deseable que en
la etapa F se pudiera alimentar ya la siguiente instruccin. Con este cauce, la siguiente instruccin
se alimenta un ciclo despus de la etapa D, por lo que solamente se pierde un ciclo en los saltos.

Arquitectura de Computadores Segmentacin del Cauce - 17


En la figura de arriba se muestran algunas de las caractersticas del pipeline bsico de la
arquitectura MIPS64.

Arquitectura de Computadores Segmentacin del Cauce - 18


Arquitectura de Computadores Segmentacin del Cauce - 19
Una vez elegido el nmero ptimo de etapas, para que el factor de aceleracin sea igual al
nmero de etapas se requiere que todas las etapas del pipeline siempre estn llenas de
instrucciones tiles, y que nada retrase el avance de las instrucciones a travs del pipeline.
Por desgracia, no es fcil mantener siempre ocupadas todas las etapas del pipeline. Hay tres
causas que lo impiden:
Motivos estructurales.
Dependencias de operandos.
Instrucciones de bifurcacin.
En las siguientes transparencias las comentaremos con cierto detalle.

Arquitectura de Computadores Segmentacin del Cauce - 20


Como ya veremos, se tiende a que la ejecucin de cada etapa se realice en un ciclo de reloj. Pues
bien, cuando una etapa no es capaz de realizar su cometido en un ciclo de reloj, el pipeline
se detiene hasta que dicha etapa finaliza su trabajo. Hay varias causas estructurales (arquitectura
del pipeline) que pueden hacer que el pipeline se detenga.
Por ejemplo, puede ocurrir que no todas las etapas sean de la misma duracin, con lo que
alguna etapa de corta duracin debera esperar a que acabe la siguiente que es ms larga. Esto
har que la duracin efectiva de cada etapa sea igual a la duracin de la etapa ms larga.
Normalmente los procesadores actuales tienden a un alto nmero de etapas, con lo que
automticamente tienden a igualarse los tiempos.
Otra cosa que tambin puede ocurrir es que desde varias etapas se quiera acceder a memoria
simultneamente (por ejemplo en la etapa de alimentacin de instruccin y en la escritura del
resultado). Y, claro, si una etapa se detiene para esperar a poder realizar el acceso a memoria, el
pipeline se para.
Tambin tenemos que considerar que no todas las instrucciones hacen las mismas cosas, por
lo que requieren tiempos distintos de CPU. Pasemos a la siguiente pgina para tratar este caso
con ms detalle.

Arquitectura de Computadores Segmentacin del Cauce - 21


No todas las instrucciones hacen las mismas cosas y requieren el mismo tiempo de CPU.
Unas pueden necesitar ms tiempo en la etapa de ejecucin (por ejemplo, la carga o escritura de
un registro requiere menos trabajo de ALU que una divisin en coma flotante), mientras que otras
pueden necesitar ms tiempo para obtener los operandos o escribir el resultado (si estn en
memoria principal se tarda ms que si estn en registros).
En el ejemplo de arriba vemos que la instruccin I2 no puede completar la fase de ejecucin en el
ciclo 4, necesitando para ello tambin los ciclos 5 y 6. Esto hace que en el 5 ciclo no pueda
alimentarse la instruccin I5 por estar ocupada la etapa de extraccin de instruccin, debiendo
esperar sta al ciclo 7 para poder continuar extrayendo instrucciones. Obsrvese que como
consecuencia del sobretiempo de E2, al trmino de los ciclos 6 y 7 no finaliza ninguna instruccin
(lo cual va en perjuicio del rendimiento).
Puede suceder incluso que alguna de las etapas ni siquiera necesite ejecutarse. Por ejemplo,
en un procesador cuya ltima etapa se dedique a escribir en memoria principal, la carga de un
registro no requerir dicha ltima etapa. No obstante todas las instrucciones pasan por todas las
etapas, aunque, para algunas instrucciones, en alguna de ellas puede ocurrir que no se realice
ningn trabajo.

Arquitectura de Computadores Segmentacin del Cauce - 22


Si desde dos etapas se accede a un mismo recurso, una de las etapas tendr que detener su
ejecucin y esperar a que quede libre el recurso necesario.
Por ejemplo, en las etapas de Fectch y Ejecucin puede ser necesario un acceso simultneo a la
ALU para realizar una operacin aritmtica, como el incremento que debe hacer al PC para
actualizarlo (en F) o la suma que se requiere para realizar el clculo de la direccin efectiva de un
operando (en E). Esto se soluciona fcilmente mediante dos sumadores distintos.
Por otra parte, tambin se puede requerir un acceso simultneo a memoria desde las etapas F y
M; para extraer la siguiente instruccin a ejecutar y para leer o escribir un operando o resultado en
memoria.

Arquitectura de Computadores Segmentacin del Cauce - 23


Para mejorar el acceso simultneo a algunos recursos, como los registros, el ciclo se divide en
dos subciclos, de tal manera que dos etapas pueden coincidir en el recurso en el mismo ciclo. Por
ejemplo, la etapa W podra escribir en un registro en el primer subciclo, y otra instruccin podra
leer su contenido en el segundo subciclo, desde la etapa D (lectura de registros).

Arquitectura de Computadores Segmentacin del Cauce - 24


Las dependencias de datos se producen cuando dos instrucciones comparten un dato (operando
o resultado).
Hay tres tipos de dependencias de datos:
Verdadera dependencia de datos RAW (Read After Write)
Antidependencia WAR (Write After Read)
Dependencia de salida WAW (Write After Write)
Los distintos tipos de dependencias pueden dan lugar a otros tantos tipos de riesgos de
datos (RAW, WAR y WAW).
Realmente, la nica dependencia verdadera de datos es la que da lugar a riesgo de tipo RAW, que
viene dada por la propia lgica del programa; los otros dos tipos son dependencias de nombre y
dependen de las caractersticas del cauce.
Ms adelante trataremos las dependencias de nombre, pero ahora vamos a ocuparnos de la
verdadera dependencia de datos (RAW).
La situacin es la siguiente: Una instruccin Ij actualiza el valor de una variable, pero una
instruccin posterior, Ik, realiza una lectura de esa variable antes de que Ij haya terminado la
operacin escribiendo la variable compartida.
Veamos, en las siguientes pginas ejemplos concretos de esta dependencia de datos y varias
soluciones propuestas.

Arquitectura de Computadores Segmentacin del Cauce - 25


En el programa del ejemplo, la dependencia que se denomina lectura despus de
escritura (Read After Write, o RAW) puede producirse entre las instrucciones I2 e I3 si la
instruccin dmul lee el contenido de R1 (en el segundo subciclo de t4) antes de que el resultado
de la suma anterior (en el primer subciclo de t6) se cargue en l. Obviamente, la operacin dmul
no se ejecutar con los operandos esperados por el programador, por lo que el resultado del
programa ser incorrecto.
Hay dos opciones bsicas para resolver este problema de dependencia de datos; uno es mediante
la prevencin: evitando que pueda llegarse a esta situacin de dependencia; el otro es mediante
la deteccin y resolucin, es decir, no preocupndose de evitarlo, pero s de detectarlo en caso
de que se produzca y solucionarlo de alguna manera. Vemoslas en detalle.

Arquitectura de Computadores Segmentacin del Cauce - 26


La dependencia de datos: Prevencin.
El problema de la dependencia de datos entre una instruccin I1 y otra instruccin I2 que le sigue
puede prevenirse retrasando la ejecucin de I2 un nmero K de etapas hasta que desaparezca el
problema de que I2 lea un operando que I1 no ha escrito todava. Este retraso puede conseguirse
insertando un nmero K de instrucciones entre I1 e I2. Esto significa que el compilador tiene que
reordenar el programa para encontrar K instrucciones que puedan ejecutarse despus de I1 y
antes de I2 sin que por ello vare la estructura lgica del programa.

Ejemplo 1: En la figura tenemos el ejemplo de un programa en el que hay una dependencia


entre las instrucciones I2 e I3 a causa del registro R1. Como vemos, en este programa el
compilador puede detectar la dependencia de datos y reorganizar las instrucciones para
retardar el acceso al registro R1 hasta que est actualizado. Debe quedar claro que esta
reorganizacin solamente puede hacerse si se mantiene la semntica original del programa.
Por lo que hemos visto en el ejemplo de la pgina anterior, para evitar la dependencia de I3
respecto a I2, se requiere que I3 comience su ejecucin tres ciclos despus de que lo haga I2.
(Suponemos que en el primer subciclo de t6, se escribe el resultado de daddi en R1, y en el
segundo subciclo, se lee el operando R1 de dmul).
Como se puede apreciar, esto se ha conseguido con la reorganizacin que ha realizado el
compilador, intercambiando el orden I2 por I1 e I3 por I4.

Arquitectura de Computadores Segmentacin del Cauce - 27


Si el compilador no puede reorganizar el cdigo para encontrar estas K instrucciones que
decamos arriba, sin modificar la lgica del programa, debe insertar operaciones NOP (No
Operacin) entre las operaciones dependientes.

Ejemplo 2: En el ejemplo inferior tenemos el fragmento de un programa en el que tambin hay


dependencias entre las instrucciones I1, I2 e I3. En este caso vemos que las instrucciones de
este fragmento no se pueden reordenar sin alterar la lgica del programa, por lo que el
compilador inserta las instrucciones NOP necesarias para evitar la ejecucin errnea de
instrucciones por las dependencias de datos.

La ventaja de la solucin basada en la prevencin es que no se requiere hardware adicional, pero


a expensas de un compilador ms complejo y una prdida de tiempo si es necesario insertar
instrucciones NOP (cuando no se puede reordenar el programa para insertar instrucciones tiles).

Arquitectura de Computadores Segmentacin del Cauce - 28


La dependencia de datos: Deteccin y resolucin.
Este mtodo requiere un hardware adicional en la CPU, pues se deben detectar las dependencias
de datos durante la ejecucin y resolver estas dependencias. Detectarlas significa que debe darse
cuenta de que en un momento dado hay dos instrucciones arrancadas I1 e I2, tal que I2 depende
de un resultado establecido por I1. El dispositivo hardware que detecta estas dependencias se
denomina interlock. Resolver las dependencias significa hacer algo para retrasar la ejecucin de I2
o para acelerar, en la medida de lo posible, la entrega a I2 del resultado que produce I1.
Veamos dos posibilidades de resolucin (no excluyentes) para cuando se detecta una
dependencia de datos entre dos etapas del pipeline.

Detener el pipeline. La aproximacin ms sencilla para evitar los problemas de dependencias


de datos con ayuda del hardware es detener la actividad en las etapas necesarias del pipeline
hasta que desaparezca la dependencia, es decir, hasta que se pueda ejecutar correctamente la
instruccin dependiente. En el ejemplo de la figura, esto significa detener las instrucciones que
siguen a la instruccin daddi desde el ciclo 4 hasta que el registro R1 pueda leerse
debidamente actualizado en segundo subciclo de t6.
Con esta estrategia, primero se detecta la dependencia y despus se detiene el pipeline a partir
de la instruccin dependiente hasta que desaparece la dependencia.
Obsrvese que la detencin de n ciclos del cauce tiene el mismo efecto que la insercin de n
instrucciones NOP.

Arquitectura de Computadores Segmentacin del Cauce - 29


El otro modo de resolver las dependencias de datos mediante Deteccin y Resolucin es
acelerando, en la medida de lo posible, la entrega a una instruccin I2 del resultado que produce
una instruccin previa I1. Vemoslo en detalle:
Anticipacin (data forwarding). En una dependencia de datos RAW, puede suceder que una
instruccin I2 necesite un operando en la etapa D (decodificacin y obtencin de operandos) que
debe producirlo en el mismo ciclo la instruccin I1 en su etapa E (ejecucin). Esto obligara a
detener la instruccin I2 hasta que I1 escriba el resultado en su etapa W, y entonces pueda
continuar I2 en su etapa D y leer el resultado que produjo I1.
Este retraso puede evitarse redirigiendo (forwarding) el resultado de la etapa E de la instruccin I1
directamente a la entrada de la etapa E de la instruccin I2, obteniendo el mismo efecto que se
obtendra en la ejecucin de la etapa D de I2.
En la figura se muestra el esquema de la ejecucin de 3 instrucciones, donde la I2 tiene una
dependencia de datos de I1 (por R1), e I3 la tiene a su vez de I2 (por R2).
Para evitar la lectura incorrecta de datos o las paradas del cauce, se puede dirigir el resultado de
la etapa E de I1 directamente a la entrada de la etapa E de I2. Igualmente, tambin se puede dirigir
el resultado de la etapa E de I2 directamente a la entrada de la etapa E de I3.
En este caso se consigue evitar totalmente la detencin del pipeline, pero hay otras situaciones
en las que esto no es posible.

Arquitectura de Computadores Segmentacin del Cauce - 30


Aqu tenemos otro caso de dependencias mltiples que se intentan resolver con anticipacin,
pero en la situacin de la instruccin de carga I1, su resultado (R1), no se consigue hasta el final
de la etapa M (la de acceso a memoria), por lo que hay que detener I2 en su etapa D para dar
tiempo a que I1 ejecute su etapa M y, en el ciclo siguiente, la instruccin de suma pueda obtener el
valor actualizado de R1 a la entrada de su etapa de ejecucin .
Como vemos, en las instrucciones de carga no se consigue evitar por completo la parada del
cauce (se requiere una parada de un ciclo), pero si no hubiera adelantamiento, se necesitara una
parada de 2 ciclos adicionales ciclos en la etapa F de la suma, pues habra que esperar a que se
completara la etapa W de la instruccin de carga para dar paso a la etapa D (obtencin de
operandos) de la suma.

Arquitectura de Computadores Segmentacin del Cauce - 31


Como se ha mostrado en las pginas anteriores, hay ms de una secuencia de instrucciones que
conduce a distintas situaciones de adelantamientos.
Aqu mostramos algunas situaciones de adelantamientos en MIPS, en cuyo caso, los
adelantamientos siempre se producen desde el final de la etapa de ejecucin E (casos 1, 2 y 3) o
desde el final de una lectura en memoria (casos 4, 5 y 6) para cargar un registro.
El adelantamiento se produce hacia la etapa de la instruccin en la que se requiere el dato de
entrada.
En los casos 3 y 5, el adelantamiento se produce hacia la etapa D, ya que es la encargada de
comprobar la condicin de salto.
En el caso 5, lo cierto es que no se consigue ninguna ventaja con un adelantamiento, pues en el
mismo ciclo en el que la etapa M de la instruccin de carga puede adelantarle R1 a la instruccin
de bifurcacin en su etapa D, se ejecuta la etapa W de la instruccin de carga, escribiendo R1 en
el primer subciclo, y la instruccin de bifurcacin puede leerlo en el segundo subciclo de su etapa
D.

Arquitectura de Computadores Segmentacin del Cauce - 32


Ya hemos comentado que uno de los principales problemas en el diseo de un pipeline consiste
en asegurar el mantenimiento de un flujo constante de instrucciones alimentando sus diversas
etapas para as poder mantener tambin constante el ritmo de ejecucin de instrucciones
(idealmente, una por ciclo).
El flujo normal de ejecucin de un programa es secuencial, por lo que las instrucciones que se van
alimentando y ejecutando estn en direcciones consecutivas de memoria. Por desgracia, las
instrucciones de bifurcacin (que suelen representar alrededor del 20% de las instrucciones
ejecutadas) pueden romper el flujo constante de instrucciones alimentadas.
Cuando se alimenta una instruccin en la CPU, lo primero que se suele hacer en la etapa Fetch es
incrementar el registro Contador de Programa (PC) para conocer la direccin de la siguiente
instruccin a ejecutar y extraerla en el siguiente ciclo de reloj. Pero si se trata de una instruccin
de salto condicional, hay que esperar a una etapa posterior para que se pueda saber si se cumple
o no la condicin de salto, por lo que la etapa de alimentacin de instruccin no sabe de dnde
seguir alimentando instrucciones.
Tenemos un problema con los saltos!

Arquitectura de Computadores Segmentacin del Cauce - 33


Una instruccin de bifurcacin condicional hace que la direccin de la siguiente instruccin a
ejecutar no se conozca en la etapa F, por lo que esta etapa de alimentacin no puede extraer la
siguiente instruccin a una bifurcacin hasta que sta llegue a la etapa en la que ya se conoce la
direccin de la siguiente instruccin a ejecutar. Por esto, a continuacin de la alimentacin de la
instruccin de bifurcacin, las etapas F, D se van quedando vacas al no saber qu instruccin
alimentar.
A estas etapas vacas que aparecen se las denomina huecos de retardo (delay slots).
En algunos sistemas, las bifurcaciones incondicionales pueden detectarse en la fase de
alimentacin o extraccin (fetch) si se le aade un poco hardware a esta primera etapa. Este
hardware de ayuda tambin extrae la direccin de salto, con lo que se puede proseguir la
extraccin de instrucciones de la direccin del salto.
Sin embargo, en el caso de las bifurcaciones condicionales no se puede hacer esto, pues
puede ocurrir que la condicin del salto se establezca precisamente en la instruccin anterior, con
lo que no hay ms remedio que esperar a que la bifurcacin llegue a la etapa de comprobacin de
la condicin de salto y establezca la direccin de la siguiente instruccin a ejecutar. Esto quiere
decir que se debe detener la alimentacin de instrucciones al pipeline hasta que en la etapa que
corresponda se averige la direccin de la siguiente instruccin a ejecutar.
Afortunadamente, hay diversas tcnicas que pueden evitar o minimizar el impacto de las
instrucciones de bifurcacin, tales como la bifurcacin retardada, la prediccin del salto y
algunas ms. Veamos estas dos primeras tcnicas.

Arquitectura de Computadores Segmentacin del Cauce - 34


El problema de los saltos: Bifurcacin retardada.
Ya hemos visto que cuando entra una instruccin de salto en el pipeline, se producen h huecos
de retardo por lo que hay que esperar h ciclos hasta que llega la siguiente instruccin de la
secuencia a ejecutar. Estara bien que estos huecos se pudieran rellenar con instrucciones que
siempre se deban ejecutar, independientemente de si se toma la bifurcacin o no. Pero claro, si
estas instrucciones estn en memoria inmediatamente despus de la instruccin de bifurcacin,
segn lo que sabemos hasta ahora, no se ejecutarn si la instruccin de bifurcacin decide saltar.
Para conseguir que se ejecuten siempre las h instrucciones que siguen a una bifurcacin, en los
procesadores que tienen bifurcaciones retardadas, las instrucciones de salto no tienen efecto
hasta h instrucciones despus de su ejecucin, por lo que independientemente del resultado de la
ejecucin de la bifurcacin, siempre se ejecutan las h instrucciones siguientes. De esta manera no
se producen los huecos de retardo.

Arquitectura de Computadores Segmentacin del Cauce - 35


Supongamos la serie de instrucciones que se muestra aqu arriba, en la que I6 es la instruccin de
salto condicional a la instruccin I11. En una CPU sin saltos retardados, la secuencia de
instrucciones ejecutadas cuando la bifurcacin no tiene lugar es: I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11,
I12, ... Mientras que cuando s se produce la bifurcacin, la secuencia es: I1, I2, I3, I4, I5, I6, I11, I12, ...
Si a este mismo procesador (con un hueco de retardo en las bifurcaciones) se le ponen
bifurcaciones retardadas, la secuencia de instrucciones ejecutadas cuando se produce la
bifurcacin es: I1, I2, I3, I4, I5, I6, I7, I11, I12, ... Es decir I7, se ejecuta siempre, haya o no bifurcacin.
Esto es as porque el efecto de la bifurcacin se retarda un ciclo de reloj, es decir, despus de
alimentar una instruccin de salto, se siguen extrayendo y ejecutando las instrucciones siguientes,
segn su orden en la memoria, durante un ciclo ms de reloj. Despus, se establece en el
contador de programa la direccin indicada en la instruccin de salto, con lo que la 2 instruccin
despus de la de salto, ser ya la correspondiente a la de la direccin indicada en dicha
instruccin de salto.

Arquitectura de Computadores Segmentacin del Cauce - 36


Aqu tenemos un ejemplo, en un ensamblador hipottico, en el que para un programa dado (el de
la izquierda), se muestran en la parte derecha las dos posibilidades de ejecucin en un
procesador con un hueco de retardo en los saltos: tanto cuando no se toma la bifurcacin, como
cuando s se toma.

Arquitectura de Computadores Segmentacin del Cauce - 37


A partir de un fragmento de cdigo escrito para un procesador sin saltos retardados, si se va a ejecutar en
una CPU con saltos con un hueco de retardo, sabiendo lo que sucede en los procesadores con
bifurcaciones retardadas (tarda un ciclo ms en bifurcar realmente), vamos a intentar reordenar nuestro
fragmento de cdigo para que su ejecucin se produzca con la misma semntica que la esperada en un
procesador sin saltos retardados.
As, despus de la instruccin de salto vamos a poner una de las instrucciones que hay antes de la de
salto, es decir, una instruccin que queremos que se ejecute siempre (se produzca el salto o no).
As, suponiendo que no se altera la semntica del programa, podramos mover la instruccin I4 y ponerla
justo a continuacin de I6 (la bifurcacin condicional), quedando entonces la secuencia de instrucciones en
memoria as:
I1, I2, I3, I5, I6, I4, I7, I8, I9, I10, I11, I12, ...
Ahora vamos a ejecutar este programa en nuestro procesador con bifurcaciones retardadas de un ciclo.
Cuando no se produce la bifurcacin, la secuencia de instrucciones que se ejecuta es:
I1 I2 I3 I5 I6 I4 I7 I8 I9 I10 I11 I12 ...
Si la bifurcacin tiene lugar, las instrucciones se ejecutarn en este orden:
I1 I2 I3 I5 I6 I4 I11 I12 ...
Si no hubiese bifurcacin retardada, al alimentar una instruccin de salto condicional habra que detener la
alimentacin de instrucciones hasta que la instruccin de salto pasase por la etapa de decodificacin (hasta
saber cul es la siguiente instruccin a ejecutar). Con bifurcacin retardada se aprovechan ese ciclo
perdido en alimentar y ejecutar una instruccin que se desea ejecutar incondicionalmente antes de que la
instruccin de bifurcacin tenga lugar (se salte o no).

Arquitectura de Computadores Segmentacin del Cauce - 38


Esta tcnica de los saltos retardados requiere la colaboracin del compilador, que debe saber
cmo reorganizar el cdigo para rellenar los huecos de retardo con instrucciones tiles (de la
misma manera que se haca con las dependencias de datos).
Si el compilador no encuentra una manera de reordenar el cdigo sin afectar a su semntica, debe
insertar tantas operaciones NOP con huecos de retardo como sean necesarias para las
bifurcaciones de ese procesador.

Arquitectura de Computadores Segmentacin del Cauce - 39


El problema de los saltos: Prediccin del salto.
Otra tcnica para reducir el problema de las bifurcaciones consiste en intentar predecir si una
instruccin de bifurcacin saltar o no. Por ejemplo, una bifurcacin al final de un bucle salta al
comienzo de ste todas las veces excepto la ltima. Segn esto, sera ventajoso que cuando el
procesador se encuentra una instruccin de salto suponga que el salto s se va a efectuar
realmente, y cuando la etapa de alimentacin detecte una bifurcacin, empiece a extraer
instrucciones de la direccin de destino del salto. Si una vez que se ejecuta la instruccin de
bifurcacin, resulta que efectivamente se salta, la ejecucin contina normalmente, pues las
instrucciones de la direccin del salto son las que ya se estn alimentando. Si por el contrario
resulta que no se realiza el salto, se debe vaciar el pipeline (desechar todas las instrucciones
errneamente alimentadas) y empezar a alimentar las instrucciones que siguen en secuencia.

Arquitectura de Computadores Segmentacin del Cauce - 40


Si ahora suponemos que el control del bucle se realiza mediante una instruccin al comienzo del
mismo, ahora lo normal ser suponer que la bifurcacin no se tomar hasta la ltima pasada del
bucle. Es decir, hay veces que conviene suponer una cosa y otras veces otra.
Esto que hemos visto se denomina ejecucin especulativa, pues las instrucciones pueden
empezar a ejecutarse antes de que el procesador sepa que las instrucciones alimentadas son las
realmente correctas. Supongamos que se predice que el salto tendr lugar, por lo que se
empiezan a alimentar instrucciones y a pasarlas a las siguientes etapas del pipeline antes de que
la instruccin de bifurcacin finalice su etapa de ejecucin. Y si al ejecutar la bifurcacin no se
realiza el salto! Nos encontramos que algunas instrucciones ya se han empezado a ejecutar en
las etapas anteriores!
Con ejecucin especulativa se debe tener cuidado de que en las etapas anteriores a la de
ejecucin no se modifiquen registros o posiciones de memoria hasta que no se confirme que la
prediccin realizada ha sido la acertada.

Arquitectura de Computadores Segmentacin del Cauce - 41


La repeticin de la bifurcacin que se toma en el bucle la puede detectar el compilador y
establecer la prediccin mediante un cierto cdigo de operacin en la bifurcacin, lo que quiere
decir que, en ejecucin, siempre que se alimente esa instruccin de bifurcacin se har la misma
prediccin. Por esto, se la conoce como prediccin esttica.
La prediccin se puede mejorar si se realiza dinmicamente, para lo cual el hardware del
procesador debe establecer la posibilidad de que haya o no salto cada vez que se encuentre una
cierta instruccin de bifurcacin. Para ello, en la CPU se debe llevar la cuenta de los resultados de
las ltimas ejecuciones de cada bifurcacin. Ciertos estudios estadsticos dicen que conservando
solamente el resultado de la ltima ejecucin (con un bit) ya se obtiene una gran probabilidad de
acierto (del orden del 90%) y con la historia de las cuatro ltimas ejecuciones (dos bits) se mejora
ligeramente; manteniendo una historia mayor, la mejora es despreciable.

Arquitectura de Computadores Segmentacin del Cauce - 42


Como hemos visto, la prediccin ante un salto puede ser saltar o no saltar, para decidir por
dnde contina extrayendo instrucciones.
Para la arquitectura MIPS, con una porcin de cdigo concreta y con los mismos datos, vamos a
ver lo que sucede cuando la prediccin es no saltar y, posteriormente, cuando es saltar.
Prediccin NO SALTAR: Despus de alimentar la instruccin de salto, se contina con la
Decodificacin, pero hasta el final de esta etapa no se sabr si habr que saltar o no. Como la
prediccin es no saltar, en la etapa F se alimenta la siguiente instruccin en memoria. Al final de
la etapa D se ve que se ha cometido un fallo en la prediccin, por lo que habr que eliminar la
instruccin daddi del cauce y empezar a extraer y ejecutar la instruccin de destino del salto. Se
ha perdido un ciclo de tiempo.
Prediccin SALTAR: Igual que antes, despus de alimentar la instruccin de salto, se contina
con la Decodificacin. Como la prediccin es saltar, en este ciclo se querra extraer la siguiente
instruccin de la direccin del salto, pero como hasta el final de la Decodificacin tampoco se
conoce la direccin del salto, en este ciclo no se puede extraer ninguna instruccin, y hay que
esperar al final de la Decodificacin para poder alimentar la instruccin de destino del salto.
Como vemos, en MIPS, ante una condicin que establezca que se debe saltar, se pierde un ciclo
tanto con una prediccin de saltar como de no saltar. Por el contrario, si la condicin se
evaluara como falsa (no saltar), con la prediccin de NO SALTAR, s se podra seguir alimentando
instrucciones de la siguiente direccin de memoria.
Por lo que hemos visto, en MIPS 64 no tiene ninguna utilidad predecir Tomar el salto, por lo que
su prediccin es NO SALTAR.

Arquitectura de Computadores Segmentacin del Cauce - 43


Las instrucciones de sumas y restas en aritmtica entera pueden pasar por la etapa de ejecucin
realizando su cometido en un solo ciclo, pero hay otras operaciones, como la multiplicacin, la
divisin o, en general, las instrucciones con datos de coma flotante, que no pueden ejecutar la
operacin de la etapa E en un solo ciclo.
En este captulo vamos a ver posibles soluciones a esta cuestin y tambin los problemas que van
a surgir.

Arquitectura de Computadores Segmentacin del Cauce - 44


La arquitectura de MIPS64 que hemos visto hasta ahora solamente contempla la aritmtica con
enteros, pero los procesadores deben soportar tambin operaciones en coma flotante.
Las operaciones en coma flotante requieren bastante ms tiempo en ejecutarse que las de la
aritmtica entera, pueden durar desde un par de ciclos, como la negacin; hasta ms de un
centenar, como la raz cuadrada.
Para adaptar esto a nuestro pipeline, una opcin sera alargar el tiempo del ciclo de reloj hasta el
necesario para ejecutar las instrucciones de coma flotante, pero esto no sera prctico, porque
estaramos ralentizando la ejecucin del resto de las instrucciones, hacindolas tan lentas como
las de coma flotante.
Otra posibilidad podra consistir en mantener la duracin del tiempo de ciclo de los enteros y
repetir la etapa de Ejecucin tantas veces como fuera necesario como para ejecutar cada
instruccin de coma flotante. Esto tambin tendra la pega de que la ejecucin de una instruccin
de coma flotante parara el cauce hasta su terminacin.
Este ltimo problema se puede solucionar si dotamos al cauce de mltiples unidades funcionales
en la etapa E: una para enteros, otras para multiplicacin, divisin, para aritmtica en coma
flotante, etc. Vemoslo en la siguiente pgina

Arquitectura de Computadores Segmentacin del Cauce - 45


Nuestro nuevo cauce podra tener las siguientes unidades funcionales:
Una unidad principal de enteros, cargas y almacenamientos, y gestin de bifurcaciones.
Sumas y restas y conversiones en coma flotante (requiere 4 ciclos).
Multiplicador de enteros y coma flotante (se ejecuta en 7 ciclos).
Divisin de enteros y coma flotante (requiere 24 ciclos).
Ahora, disponiendo de varias unidades funcionales, si comienza a ejecutarse una operacin de
coma flotante, no impedira que inmediatamente a continuacin pase a ejecutarse una instruccin
de suma de enteros.
Pero seguimos teniendo un problema. Si a una operacin en multiplicacin en coma flotante (que
es de larga duracin) le sigue otra ms, tambin de multiplicacin en coma flotante, esta ltima
tendr que esperar a que termine completamente la primera para comenzar su ejecucin, es decir,
que quedar detenida durante 7 ciclos hasta comenzar su ejecucin .
Esta es la situacin que tenamos antes de inventar el pipeline!
Veamos en la pgina siguiente cmo se resuelve este problema.

Arquitectura de Computadores Segmentacin del Cauce - 46


La solucin a este problema es obvia: hay que segmentar las unidades de coma flotante en
mltiples etapas, cada una de un ciclo de duracin. As, un ciclo despus del comienzo de la
ejecucin de una instruccin de multiplicacin en la unidad de coma flotante, ya se podra arrancar
la siguiente instruccin, aunque tambin fuera de multiplicacin en coma flotante.
Como vemos en el grfico de nuestro ejemplo, las instrucciones que se ejecuten en la unidad de
enteros, E, solamente requieren un ciclo; las sumas en coma flotantes se ejecutaran en 4 ciclos; y
las multiplicaciones, en 7.
En nuestro MIPS, la unidad funcional de las divisiones no est segmentada, y requiere 24 ciclos
de reloj para ejecutarse. Ya que esta ltima unidad funcional no est segmentada, se pueden
producir riesgos estructurales si hay dos divisiones consecutivas o cercanas en el tiempo.

Arquitectura de Computadores Segmentacin del Cauce - 47


Ya que las unidades funcionales multiciclo duran ms, hay mayores riesgos, estructurales y de
datos. Comencemos viendo los riesgos estructurales.
El caso de la divisin es muy claro. Dadas dos instrucciones de divisin consecutivas, la segunda
no puede arrancarse un ciclo despus de la primera, pues su unidad funcional no est
segmentada, por lo que antes de emitir la segunda divisin (pasarla a su etapa de ejecucin),
debe esperar en D a que finalice la etapa E de la divisin anterior.

Arquitectura de Computadores Segmentacin del Cauce - 48


Ya que algunas instrucciones duran ms ciclos que otras, en un momento dado puede haber
varias instrucciones en el cauce que lleguen a un punto en el que intenten ejecutar la misma etapa
al mismo tiempo.
Este es el caso del ejemplo de arriba, en el que tres instrucciones compiten por la etapas M y W.
Obsrvese que aunque las 3 instrucciones llegan al mismo tiempo a la etapa M, solamente la
instruccin de carga la utiliza realmente (las otras dos utilizan registros), por lo que el acceso a
memoria no supone un riesgo estructural.
En cambio, s compiten realmente por utilizar W, la etapa de escritura de registros, pues todas
ellas generan un resultado cuyo destino es un registro.
Veamos cmo se soluciona este conflicto en la pgina siguiente.

Arquitectura de Computadores Segmentacin del Cauce - 49


Ante el problema estructural de la competencia por un recurso, se podra disponer de un conjunto
de registros generales con ms de un puerto de escritura, pero esto no suele hacerse, pues estas
situaciones solamente se producen en muy raras ocasiones.
Normalmente, la solucin adoptada consiste en detectar la situacin del riesgo estructural
(competencia por el recurso), detener las instrucciones que compiten y dejarlas continuar en
secuencia, de una en una.
Lo razonable es dejar continuar la instruccin de mayor latencia (la que genera mayor retardo),
pues mientras no avance, es la que tiene ms probabilidades de causar ms riesgos de datos a
otras instrucciones. El resto de las instrucciones que compiten por entrar en la etapa W, pueden
quedar detenidas en la etapa M, a la espera de que W quede libre. En el caso de MIPS, estas
instrucciones quedan detenidas en la etapa D, que es donde se comprueban los riesgos
estructurales.

Arquitectura de Computadores Segmentacin del Cauce - 50


Ya habamos visto los problemas que se pueden producir debidos a dependencias entre
operaciones cercanas en el tiempo. Ahora, estos problemas se pueden complicar con las
operaciones multiciclo y, adems, veremos que aparecen nuevos tipos de riesgos de datos. Las
dependencias entre instrucciones pueden ser de datos y de nombre.
Las dependencias de datos son las que existen entre dos instrucciones que comparten datos.
Las dependencias de nombre se producen cuando dos instrucciones utilizan el mismo registro o
direccin de memoria (comparten el nombre), pero realmente no hay flujo de datos entre tales
instrucciones (no comparten el dato). Hay dos tipos de dependencias de nombre:
antidependencias y dependencias de salida.
Los distintos tipos de dependencias pueden dan lugar a otros tantos tipos de riesgos de
datos (RAW, WAR y WAW). La verdadera dependencia de datos (RAW) viene dada por la propia
lgica del programa, mientras que las otras dos pueden producirse dependiendo de las
caractersticas del cauce del procesador.
Verdadera dependencia de datos RAW (Read After Write)
Dependencia de salida WAW (Write After Write)
Antidependencia WAR (Write After Read)

En los cauces con operaciones multiciclo, adems de que las dependencias RAW se pueden
producir ms fcilmente, tambin aparecen los otros dos tipos de dependencias.

Arquitectura de Computadores Segmentacin del Cauce - 51


Los riesgos RAW de las dependencias entre instrucciones ya los tenamos en los cauces
convencionales, pero ahora, con las operaciones multiciclo, se van a producir con mayor facilidad.
En el ejemplo de arriba, las dos operaciones de suma y almacenamiento de enteros pueden
ejecutarse sin ningn problema pese a que tienen la dependencia de R1, ya que, como ya
sabemos, aunque la escritura y la lectura de R1 coinciden en el mismo ciclo, la suma puede
escribir el resultado en R1 en el primer subciclo, y el almacenamiento puede leer R1 en el
segundo subciclo.
En el caso de que estas operaciones fueran con datos en coma flotante, las cosas cambian. La
etapa de ejecucin de la suma ahora requiere ms tiempo, por lo que es multiciclo; as que dura 3
ciclos ms que con los enteros. Ahora nos encontramos que cuando la operacin de
almacenamiento llega a la etapa D para leer el operando R1, la suma todava no ha llegado a la
etapa W de escritura del resultado en R1.
Ante este escenario, la solucin de MIPS es parar la instruccin de almacenamiento en la etapa D,
hasta que el operando R1 quede actualizado en la etapa W de la suma.

Arquitectura de Computadores Segmentacin del Cauce - 52


En el pipeline que habamos visto hasta hace poco, cuando solamente operbamos con enteros,
varias instrucciones se ejecutaban simultneamente en el cauce, e iban finalizando en el mismo
orden en el que comenzaban.
Con la incorporacin de la coma flotante y la necesidad de incluir unidades funcionales multiciclo,
nos encontramos con el escenario de la parte inferior de la figura, en el que las instrucciones no
finalizan en el mismo orden en el que se emiten!
La multiplicacin en coma flotante es una operacin multiciclo muy larga, por lo que finaliza
despus de su sucesora, una suma, tambin en coma flotante, pero 2 ciclos ms corta. La suma
en coma flotante tambin es unos ciclos ms larga que la carga y el almacenamiento que le
siguen, por lo que, igualmente, tambin finaliza ms tarde que stas.
Esto va a generar unas nuevas formas de dependencias de datos que veremos en las siguientes
pginas.

Arquitectura de Computadores Segmentacin del Cauce - 53


La dependencia de salida (Write After Write) se produce cuando una instruccin i y una instruccin
j escriben su resultado en el mismo registro o direccin de memoria. Se debe preservar el orden
de ejecucin entre las dos instrucciones para asegurar que el valor que se escribe finalmente es el
que corresponde a la instruccin j.
En el fragmento de programa de arriba, vemos que debido a la gran latencia de la multiplicacin,
sta finaliza despus de la suma, an empezando sta posteriormente. As, el valor que al final
queda escrito en el registro F1 es el que deja la multiplicacin, lo cual es incorrecto.
Obsrvese que este efecto solamente se produce cuando el resultado de la multiplicacin se
escribe (en F1) sin que ninguna instruccin lo utilice posteriormente como operando de entrada.
As, si entre la multiplicacin y la suma hubiese una resta, por ejemplo, que tomase el resultado de
la multiplicacin como dato de entrada, ya no se producira el problema pues al impedir el riesgo
RAW entre la multiplicacin y la resta, se evita tambin el riesgo WAW entre la multiplicacin y la
suma.
Obsrvese que la suma no puede entrar en la etapa D hasta que la resta pasa a la etapa de
ejecucin.

Arquitectura de Computadores Segmentacin del Cauce - 54


En general, hay dos soluciones para los riesgos de datos de tipo WAW:
1. Desechar el resultado de la multiplicacin, puesto que no se va a utilizar por ninguna
instruccin. O lo que es ms fcil, sustituir la instruccin de multiplicacin por una NOP (no
Operacin).
2. Detener la emisin de la suma (la instruccin posterior), hasta que la multiplicacin (la anterior)
entre en la etapa de Memoria. De esta manera se asegura que la instruccin posterior no
escribir el registro de destino antes que la anterior instruccin. Esta es la solucin de MIPS a
los riesgos WAW.

No olvidemos tampoco, que este tipo de problemas solo se pueden producir con programas en los
que hay secuencias de instrucciones sin sentido, es decir, instrucciones que producen resultados
que no son utilizados por ninguna instruccin posterior.

Arquitectura de Computadores Segmentacin del Cauce - 55


Los riesgos debidos a las antidependencias (WAR) entre dos instrucciones i y j se producen
cuando la instruccin j escribe un registro o posicin de memoria que la instruccin i utiliza como
operando de entrada.
En el ejemplo de arriba (en un procesador hipottico), si debido a una ejecucin fuera de orden, la
resta se ejecuta antes que la suma, el operando de entrada F8 de la suma, no sera el correcto,
pues tomara el valor producido como resultado de la resta, lo cual no era lo pretendido en el
programa original.
Estos problemas se producen en las arquitecturas con planificacin dinmica, que conllevan
ejecucin fuera de orden. Tambin podra producirse en pipelines en los que, por algn motivo, se
produzcan lecturas en etapas finales y escrituras al comienzo del cauce.

Arquitectura de Computadores Segmentacin del Cauce - 56


Los riesgos WAR no se producen en nuestro procesador MIPS, ya que utiliza un cauce esttico,
es decir, que se respeta el orden de emisin o arranque de las instrucciones.
Obsrvese que aunque la finalizacin de las instrucciones s puede producirse fuera de orden, la
emisin o arranque s se realiza en orden. Adems, los operandos se leen enseguida, en la etapa
D, y las escrituras en registros se producen al final, en W.
En este ejemplo, la instruccin de suma deja el resultado en F2, que lo utiliza la instruccin
anterior como operando de entrada. Aunque la suma finaliza antes que la multiplicacin, no afecta
a la ejecucin correcta, porque la multiplicacin toma le valor de F2 en su etapa D, mucho antes
de la etapa W de la suma.

Arquitectura de Computadores Segmentacin del Cauce - 57

Вам также может понравиться