Sie sind auf Seite 1von 34

SEGMENTACIN

Introduccin a la segmentacin de Instrucciones.


La segmentacin o pipeline es una tcnica de realizacin de procesadores por la cual se solapa la ejecucin
de las instrucciones. Hoy en da es la tcnica clave para la realizacin de CPU rpidas.
La idea bsica de la segmentacin se puede extraer de una cadena de montaje de coches. Los
coches no se montan uno a uno, si no que su construccin se divide en fases sucesivas y el montaje del
coche se realiza tal como este va avanzando por estas fases. De esta forma cada fase est trabajando
simultneamente en la construccin de un coche diferente. De esta forma, la construccin de un coche
cuesta el mismo tiempo que antes, pero ahora la frecuencia con que salen los coches construidos es mucho
mayor (tantos como fases tenga su construccin).
Cada uno de estas fases se denomina segmento o etapa de segmentacin. Al igual que en los
coches, la productividad de un computador va a depender del nmero de instrucciones que acaben por
unidad de tiempo, y no de lo que le cueste a una instruccin individual.
Segmentacin para DLX.
Si queremos aplicar la tcnica de la segmentacin a la ejecucin de instrucciones, deberemos dividir
la ejecucin de las mismas en una serie de etapas. Por ejemplo, en DLX la ejecucin de una instruccin se
divide en 5 etapas:
IF: Lectura de instruccin.
ID: Decodificacin de Instruccin y lectura de operandos.
EXE: Ejecucin de la instruccin.
MEM: Acceso a memoria de datos.
REG: Acceso a banco de registros.
La realizacin de cada etapa de segmentacin es un ciclo mquina. Esta duracin est determinada
por la duracin de la etapa ms lenta. con frecuencia el ciclo mquina es un ciclo de reloj (a veces dos),
aunque el reloj puede tener mltiples fases.
El objetivo del diseador de computadores es equilibrar correctamente el diseo de cada segmento
para que todos tengan la misma duracin. Si esto es as, entonces la duracin de una instrucciones ser (si
no hay atascos):

Tiempo por instruccin en mquina no segmentada
Nmero de etapas de la segmentacin

De forma ideal, el avance en rapidez del procesador por la segmentacin se ve multiplicado por el
nmero de etapas que dispongamos. Pero en la realidad no es exactamente as, las etapas no suelen estar
perfectamente equilibradas y siempre surgen atascos en la ejecucin de las instrucciones que hacen que no
siempre se superponga su ejecucin perfectamente (se suele obtener un 10% menos de rapidez de la
prevista en el caso ideal).
La segmentacin es una tcnica no visible al programador, que consigue una reduccin en el
tiempo de ejecucin medio por instruccin. Esta tcnica que explota el paralelismo entre instrucciones
secuenciales.





En las dos figuras siguientes se puede observar como funciona la segmentacin cuando se ejecutan
varias instrucciones sobre un procesador segmentado. La figura 1 es en el caso ideal, y la figura 2 en el caso
real.


Figura 1. Segmentacin caso ideal.


Figura 2. Segmentacin caso real. Se introducen numerosos retardos en la ejecucin
de las instrucciones.

Problema: Realizar un programa que realice la multiplicacin de dos vectores de n datos y almacene el
resultado sobre un tercer vector de datos. Completar el cdigo.

; VECTORES.S
;Datos a partir de esta direccin
.data 0x2000
n: .word 8, 0
datosX: .double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8,
datosY: .double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8,
datosZ: .space 64

.text 0x100
...
Una vez realizado el programa, mostrar su ejecucin segmentada de dos formas:
1) Con la opcin forwarding desactivada.
2) Con la opcin forwarding activada.
Para este segundo caso describir como se realizan todos los adelantamiento (entre que unidades funcionales
del procesador).

Solucin:
; VECTORES.S : Z(i) = X(i) * Y(i).

;Datos a partir de esta direccin
.data 0x2000
n: .word 8, 0
datosX: .double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8
datosY: .double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8
datosZ: .space 64

.text 0x100
addi R1, R0, 0
lw R8, n

eti: LD F0, datosX(R1)
LD F2, datosY(R1)

ADDD F4, F0, F2
SUBI R8, R8, 1
SD datosZ(R1), F4

ADDI R1, R1, 8
BNEZ R8, eti
trap 0
on ello se consigue que si una instruccin utiliza un registro como fuente y la instruccin anterior lo
tiene como destino de una operacin, entonces la segunda instruccin utilizar como valor del registro fuente
la salida de la ALU. As, aunque el valor no se grabe en el registro conflictivo hasta 2 ciclos despus, la
segunda instruccin ya habr hecho uso de su valor.
Como hemos visto, en la segmentacin de DLX, no solo la instruccin siguiente puede necesitar un
valor de un registro todava no actualizado, tambin las tres siguientes instrucciones pueden necesitar este
valor, que hasta el final del cuarto segmento (el de WB) no estar correctamente almacenado.
En la figura 3.10 anterior se muestra un ejemplo de como una instruccin utiliza como registro
destino R1 y las siguientes 4 instrucciones lo tienen como registro fuente. El resultado deber ser adelantado
para las dos siguientes instrucciones. (figura 6.7).

La primera instruccin ADD inicializa el valor del registro R1.
Las cuatro instrucciones restante lo utilizan.
El valor de R1 se desva para ser utilizado por las dos restantes: SUB, AND y OR.
La instruccin OR y la XOR cuando necesitan R1, la instruccin ADD ya a realizado la escritura en el
banco de Registros.
Recordar: tener en cuenta que el segmento ID accede a dos registros del banco de registros, y a su
vez, al solaparse con el segmento WB este debe realizar una escritura sobre otro registro. Esto es
complicado y se resuelve haciendo que las escrituras se realicen durante la primera mitad del ciclo de reloj y
las lecturas durante la segunda mitad.

El la pgina siguiente se muestra como se realizaran los adelantamientos de datos para estos dos secuencias
de instrucciones:

FIGURE 3.11: adelantamiento de ALU a memoria
y de memoria a memoria.
FIGURE 3.12: adelantamiento de memoria a
unidad aritmtica: !!?.
ADD R1, R2, R3
LW R4, 0(R1)
SW 12(R1), R4
LW R1, 0(R2)
SUB R4, R1, R5
AND R6, R1, R7
OR R8, R1, R9

El primer ejemplo de adelantamiento se realiza sin problemas, pero no ocurre lo mismo en el adelantamiento
de memoria a ALU:
Este es el nico caso en que el procesador de DLX necesitar introducir un retraso (o burbuja) para
conseguir que el programa se ejecute correctamente. (esto mismo lo veremos tambin ms adelante en los
apuntes).





El segundo riesgo lo analizaremos con ms detalle cuando introduzcamos las instrucciones multiciclo. Pero
ahora vamos a realizar un pequeo estudio, considerando lo que ocurrira si todas las instrucciones tuviesen
un ciclo de reloj en ejecucin salvo las instrucciones de multiplicacin y divisin que tienen 2 ciclos.



Aqu se plantean varias alternativas que habr que analizar:

Duplicar la unidad de ejecucin de la Mult/Div (Ex-M), o segmentarla.
Separar (si se puede) las dos instrucciones de multiplicar. (Ins-Mult-Ins-Mult). A esto se le llama
planificar el cdigo.

Se pide analizar estas dos opciones y decidir cual es la ms conveniente.


Ejemplo 1: Sea un procesador segmentado en 5 etapas con una duracin de (50, 50, 60, 50, 50) nseg. de
duracin para cada una de las etapas. Es decir, cuando ejecuta una instruccin de forma no segmentada,
tarda 260 nseg en ejecutarla.
Si este mismo procesador lo diseamos de forma segmentada, deberemos aadir 5 nseg. a cada etapa
debido al retardo de los biestables que almacenan la informacin entre etapas.
Ver el esquema siguiente:

La pregunta es, cuando ejecutamos N=10 instrucciones, que aceleracin y que eficiencia se consiguen?

86 . 2
910
2600
)) 1 10 ( 5 ( * 65
10 * 260
)) 1 ( ( *
*
= =
+
=
+
= =
n k
n
T
T
n Aceleraci
seg
ins
Segmentado
do NoSegmenta



71 . 0
14
10
)) 1 10 ( 5 (
10
)) 1 ( (
= =
+
=
+
=
n k
n
Eficiencia


4
65
260
)) 1 ( ( *
*
lim lim = = =
+
= =

seg
ins
seg
ins
n n
n k
n
n Aceleraci nMaxima Aceleraci



Realizar los clculos de la Aceleracin y la Eficiencia para cuando procesamos N = 4 y N = 32
instrucciones. (Importante: Usar siempre las formulas de este ejemplo).

.

En las dos figuras siguientes se puede observar como funciona la segmentacin cuando se ejecutan
varias instrucciones sobre un procesador segmentado. La figura 1 es en el caso ideal, y la figura 2 en el caso
real.


Figura 1. Segmentacin caso ideal.


Figura 2. Segmentacin caso real. Se introducen numerosos retardos en la ejecucin
de las instrucciones.

Diseo de la Unidad Segmentada.
Camino de datos. Muestra, como ya sabemos de cursos anteriores, como funciona el procesador de DLX
cuando est ejecutando una instruccin por ciclo. Es un ejemplo de cmo se propagan los datos a travs
del procesador.


Ejercicio: Completar el siguiente esquema.


Control para la segmentacin.

La ejecucin de instrucciones en un procesador segmentado requiere que en cada uno de los segmentos
seamos capaces de almacenar toda la informacin de la instruccin que se est ejecutando en ese segmento.
Por ejemplo, si ejecutamos una instruccin de salto, en el primer segmento leeremos el cdigo de la
instruccin e incrementaremos el PC almacenndolo en un registro NPC. Este valor puede que lo
necesitemos en el ciclo de EXE, y si no se va trasladando de segmento a segmento, ocurrir que al siguiente
ciclo de reloj, al leer una nueva instruccin, borraremos este valor y ya no podr ser utilizado despus.


Por este y otros motivos similares, en los registros intermedios del procesador segmentado para DLX, se
almacena toda la informacin necesaria de la instruccin que se est ejecutando en ese segmento, y cuando
pasamos al segmento siguiente, esta informacin si se va a utilizar en algn segmento posterior, se traslada
tambin copindose en los registros que hay entre segmentos.
En la figura 6.19 observamos la forma que ha de tener el procesador segmentado para que la segmentacin
funciones correctamente.


Observar:
Propagacin del valor del NPC.
Propagacin del cdigo del registro destino hasta ltimo segmento.
Propagacin de resultado de la ALU: ALUOutput.
Como se actualiza el valor del contador de programa, usando una puerta AND.
Lneas de entrada del Banco de Registros.
Lneas de entrada de Memoria de Datos.
Una ALU para datos y otra para direcciones de saltos.







Ahora todo junto. Se muestra tanto el camino de datos como el camino de control para la realizacin
segmentada de instrucciones de DLX. (figura 6.30). Esta transparencia debe ser analizada con detalle.
6.3 Los riesgos de la segmentacin.
Todo lo visto hasta ahora esta muy bien, pero no siempre se pueden superponer la ejecucin de las
instrucciones como se ha visto en los ejemplos anteriores. Hay situaciones llamadas riesgos (hazards)
que lo impiden, y que se pueden clasificar en tres clases:
Riesgos estructurales. Producidos por conflictos en la utilizacin del hardware. Impiden que dos
instrucciones se solapen en determinados segmentos.
Riesgos por dependencias de datos. Es cuando los datos que necesita una instruccin para
ejecutarse son inicializados por instrucciones anteriores que aun no han finalizado.
Riesgos de control. Suceden cuando hay un cambio brusco en el valor del PC producido por una
salto u otras instrucciones.
Cuando se detecta un riesgo, puede ser necesario detener la segmentacin (no siempre). Pero
detener el procesador en una mquina no segmentada es fcil, basta terminar la instruccin en curso. En una
mquina segmentada hay varias instrucciones en curso, y por ello un detencin supone, en la mayora de los
casos, que algunas de las instrucciones en curso deben ejecutarse hasta finalizar, otras se retardan y otras si
pueden detenerse en un instante dado.
Por lo general, cuando una instruccin se detiene, las instrucciones anteriores finalizan normalmente
y las posteriores sufren un retardo en su ejecucin. Durante el tiempo de retardo, no se leen ms
instrucciones.
Vamos a pasar a estudiar en este apartado 1.5. los tres tipo de riesgos: estructurales, de dependencia de
datos y los de Control, aunque en el temario estos ltimos riesgos figuren como un apartado nuevo (el 1.6.).
Riesgos estructurales.
En una mquina segmentada deben de poderse solapar cualquier combinacin de instrucciones. Si no es as,
se dice que la mquina posee riesgos estructurales. Una mquina sin riesgos estructurales siempre tendr
un CPI ms alto que si no los tuviera.
Para evitar estos riesgos en muchos casos tenemos que duplicar recursos. Por ejemplo, si tenemos
un nico puerto de acceso a memoria, si una instruccin en un determinado segmento debe acceder a
memoria para leer o escribir, en ese segmento no se podr leer ninguna instruccin, por lo cual el inicio de
una nueva instruccin se tendr que retrasar un ciclo de reloj. En la figura siguiente se ilustra este caso,
aunque se ve mejor en la transparencia de la hoja siguiente (Fig. 3.6 y 3.7).

Ciclos de Reloj
Instruccin 1 2 3 4 5 6 7 8 9
Carga IF ID EX MEM WB
Instruccin i+1 IF ID EX MEM WB
Instruccin i+2 IF ID EX MEM WB
Instruccin i+3
detencin
IF ID EX MEM WB
Instruccin i+4 IF ID EX MEM

Sin embargo hay mquinas que se disean con riegos estructurales, el motivo es sencillo: Para
reducir el coste en la produccin. Est claro que si un determinado riesgo estructural no se presenta muy a
menudo, puede que no valga la pena evitarlo, y simplemente introducimos un retardo en el funcionamiento.
En este caso, el riesgo es tan notorio por el elevado nmero de veces que ocurre que vale la pena realizar el
procesador con dos puertos de acceso, uno para lectura de datos y otro para lectura de instrucciones.





Tambin hay que destacar que aparecen dos tipos de riesgos ms:
El riesgo estructural que se introduce al acceder al banco de registros.
El riesgo estructural que se produce cuando tenemos instrucciones cuya ejecucin dura ms de un
ciclo de reloj.

El primero en los riesgos se soluciona realizando un banco de registros de forma que el acceso de escritura
y de lectura se realicen en un mismo ciclo de reloj, pero en flancos distintos. Adems, es mejor que primero
sea la escritura y luego la lectura, pues evitaremos un posible riesgo por dependencia de datos.







El segundo riesgo lo analizaremos con ms detalle cuando introduzcamos las instrucciones multiciclo. Pero
ahora vamos a realizar un pequeo estudio, considerando lo que ocurrira si todas las instrucciones tuviesen
un ciclo de reloj en ejecucin salvo las instrucciones de multiplicacin y divisin que tienen 2 ciclos.



Aqu se plantean varias alternativas que habr que analizar:

Duplicar la unidad de ejecucin de la Mult/Div (Ex-M), o segmentarla.
Separar (si se puede) las dos instrucciones de multiplicar. (Ins-Mult-Ins-Mult). A esto se le llama
planificar el cdigo.

Se pide analizar estas dos opciones y decidir cual es la ms conveniente.




Caso 1: Segmentacin Inicial.


Caso 2: Duplicamos unidad aritmtica de Mult/Div. Tenemos una burbuja o ciclo de espera en la ejecucin
de estas 4 instrucciones.



Caso 3: No duplicamos unidad aritmtica pero Si planificamos Cdigo. Seguimos teniendo una burbuja o
ciclo de espera en la ejecucin de estas 4 instrucciones.

Riesgos por dependencia de datos.
Los riesgos por dependencia de datos surgen cuando una instruccin escribe un resultado en un
determinado registro (durante el ltimo segmento) y alguna de las instrucciones siguientes hacen uso del
valor de este registro antes de que se produzca dicha escritura.
Se ve mucho mejor con el ejemplo; sea las siguientes dos instrucciones:

ADD R1,R2,R3
SUB R4,R1,R5

La instruccin SUB tiene como registro fuente R1, y la instruccin anterior ADD guarda el resultado
de una suma en este mismo registro. Si ejecutsemos de forma segmentada estas dos instrucciones
tendramos:

Ciclos de Reloj
Instruccin 1 2 3 4 5 6
ADD IF ID EX MEM WB_en_R1
SUB IF ID_leo_R1 EX MEM WB

Si no introdujramos un retardo entre estas dos instrucciones, la instruccin SUB manejara un valor
de R1 no correcto. Esto es inaceptable en un procesador.

Ciclos de Reloj


Instruccin 1 2 3 4 5 6 7 8 9
ADD IF ID EX MEM WB_R1
nop - - - - -
nop - - - - -
SUB IF ID_R1 EX MEM WB

El problema planteado aqu se resuelve con una sencilla tcnica llamada segn autores de la siguiente
forma:

Adelantamiento, forwarding, desvo, bypassing o cortocircuito.

El funcionamiento hardware de esta tcnica es sencillo: las distintas unidades funcionales se
adelantan los datos entre ellas sin necesidad que estos datos estn escritos en el Banco de Registros, para
de aqu se ledos.
En las transparencias de la pgina siguiente (FIGURE 3.9 y FIGURE 3.10) se muestra el funcionamiento
de esta tcnica de formalmente.




Con ello se consigue que si una instruccin utiliza un registro como fuente y la instruccin anterior lo
tiene como destino de una operacin, entonces la segunda instruccin utilizar como valor del registro fuente
la salida de la ALU. As, aunque el valor no se grabe en el registro conflictivo hasta 2 ciclos despus, la
segunda instruccin ya habr hecho uso de su valor.
Como hemos visto, en la segmentacin de DLX, no solo la instruccin siguiente puede necesitar un
valor de un registro todava no actualizado, tambin las tres siguientes instrucciones pueden necesitar este
valor, que hasta el final del cuarto segmento (el de WB) no estar correctamente almacenado.
En la figura 3.10 anterior se muestra un ejemplo de como una instruccin utiliza como registro
destino R1 y las siguientes 4 instrucciones lo tienen como registro fuente. El resultado deber ser adelantado
para las dos siguientes instrucciones. (figura 6.7).

La primera instruccin ADD inicializa el valor del registro R1.
Las cuatro instrucciones restante lo utilizan.
El valor de R1 se desva para ser utilizado por las dos restantes: SUB, AND y OR.
La instruccin OR y la XOR cuando necesitan R1, la instruccin ADD ya a realizado la escritura en el
banco de Registros.
Recordar: tener en cuenta que el segmento ID accede a dos registros del banco de registros, y a su
vez, al solaparse con el segmento WB este debe realizar una escritura sobre otro registro. Esto es
complicado y se resuelve haciendo que las escrituras se realicen durante la primera mitad del ciclo de reloj y
las lecturas durante la segunda mitad.

El la pgina siguiente se muestra como se realizaran los adelantamientos de datos para estos dos secuencias
de instrucciones:

FIGURE 3.11: adelantamiento de ALU a memoria
y de memoria a memoria.
FIGURE 3.12: adelantamiento de memoria a
unidad aritmtica: !!?.
ADD R1, R2, R3
LW R4, 0(R1)
SW 12(R1), R4
LW R1, 0(R2)
SUB R4, R1, R5
AND R6, R1, R7
OR R8, R1, R9

El primer ejemplo de adelantamiento se realiza sin problemas, pero no ocurre lo mismo en el adelantamiento
de memoria a ALU:
Este es el nico caso en que el procesador de DLX necesitar introducir un retraso (o burbuja) para
conseguir que el programa se ejecute correctamente. (esto mismo lo veremos tambin ms adelante en los
apuntes).







Bus de escritura
de resultados
Cada nivel de destino requiere de un cerrojo (biestable D activado por nivel) y un par de
comparadores para examinar si instrucciones adyacentes, comparten un destino y una fuente. En la figura
siguiente se muestra una ALU con esta estructura.


















La ALU con sus unidades de desvo.

Como puede observarse, se necesitan dos buffers para almacenar los resultados de la ALU. Los
resultados de la ALU pueden ser entradas de la propia ALU va la utilizacin de dos multiplexores, tal como
aparece en la figura.
El control de estos multiplexores se puede realizar de dos formas:
Por la propia Unidad de control.
Por una lgica local asociada al desvo.
En cualquiera de los dos casos, se deber examinar si alguna de las dos instrucciones anteriores
escribi en un registro utilizado como fuente en la instruccin actual. En cuyo caso el multiplexor deber
seleccionar es registro de resultado (salida de ALU) apropiado en lugar del bus.
Como la ALU opera en una nica etapa de la segmentacin, no se requiere ningn retardo por
combinacin de cualquier conjunto de instrucciones que operen sobre esta ALU de punto fijo.


Fichero de
Registros
Mux
Mux
ALU
R4
R1
Caminos de
desvio
Buffers de resultados
de la ALU
Tambin aparecera un riesgo cuando tuvisemos dos instrucciones que pretendieran leer y escribir
sobre una misma posicin de memoria. En nuestro caso, para DLX este riego no existe pues los accesos a
memoria se mantienen siempre en orden; este riego no se puede dar.

Los fallos de acceso a cache podran tambin desordenar las referencias a memoria si se permitiera
que el procesador siguiese trabajando con instrucciones posteriores. Pero en DLX, cuando esto ocurre,
detenemos la segmentacin por completo, haciendo que la ejecucin de la instruccin que causo fallo se
prolongue todos los ciclos de reloj que haga falta.
En ocasiones puede ser necesario adelantar el resultado de una unidad funcional a otra unidad
funcional. Por ejemplo, analicemos las siguientes instrucciones:
ADD R1,R2,R3
SW 25(R1),R1
El resultado de la suma almacenado en R1, cuando esta a la salida de la ALU ya se puede utilizar
para el clculo de la siguiente instruccin, y a su vez este valor ser adelantado al MDR (Registro de Datos
de Memoria) para que sea almacenado en una direccin de memoria el contenido del registro R1.

Clasificacin:
Pero en cualquier procesador segmentado genrico, los riesgos por dependencia de datos se pueden
clasificar en tres tipos, atendiendo al orden de acceso de lectura y escritura de las instrucciones. Sean dos
intrucciones, primero i y luego j; entonces la clasificain podria ser esta:

RAW (Read After Write): una instruccin j intenta leer antes de que la instruccin i realice la
excritura. El resultado es que se lee un valor no correcto (ya hemos visto ejemplos antes).
WAR (Write After Read): una instruccin j escribe un valor antes de que la instruccin i lo lea.
Esto en DLX no ocurre, pues las lecturas se realizan antes en ID y las escrituras despues en WB.
Ocurre cuando hay instrucciones que escriben anticipadamente el resultado, como por ejemplo
cuando se autoincrementa un registro en en calculo de una direccin.
WAW (Write After Write). Es cuando las dos instrucciones, tanto i como j, realizan una escritura
por ejemplo en un registro; pero la instruccin j lo realiza antes que la i por hacerlo en segmentos
anteriores. Ocurre en segmentaciones que escriben en ms de una etapa.

Como es de imaginar, RAR no supone un riesgo.




Observar el detalle de cmo funciona la unidad de deteccin de riesgos: En el ciclo 3 de reloj se est
ejecutando la instruccin SUB R2, R1, R3 que inicializa el registro R2. Cuando esta instruccin pasa en
el ciclo 4 al segmento MEM, entrar en EXE la instruccin ADD R4, R2, R5 que necesitar recibir de
forma adelantada el contenido de R2, pues el valor ledo en el banco de registros no es el correcto.


Ejemplo 2: En esta figura 6.3 del Tomo 2 de Estructura y diseo de Computadores (Ed. Revert) Se
puede observar como se realiza la ejecucin de una instruccin de DLX de forma no segmentada.
Se observa como al ejecutarse de forma segmentada, se necesita definir un nico tiempo de segmento, por
lo cual elegimos el segmento de mayor duracin.


Generalmente, cuando tenemos una instruccin del tipo A = B + C hay una probabilidad bastante alta de
que se produzca una detencin debido a la carga del segundo dato. Sin embargo podemos evitar con
facilidad que se produzca un retraso en el almacenamiento del resultado, si adelantamos la salida de la ALU
al registro MDR.

Para comprender mejor lo expuesto, analicemos el cdigo ensamblador que generara la anterior
instruccin de alto nivel:


Ciclos de Reloj
Instruccin 1 2 3 4 5 6 7 8 9
LW R1,B IF ID EX MEM WB
LW R2,C IF ID EX MEM WB
ADD R3,R1,R2 IF ID detencin EX MEM WB
SW A,R3 IF detencin ID EX MEM WB

El valor del MDR es adelantado para ADD. Para SUB y para AND ya se lee bien del banco de
registros en el segmento ID de ambas instrucciones.

Lo que hemos tenido que realizar es una espera en la segmentacin que se conoce como
burbuja (bubble) o detencin de cauce (pipeline stall)
El proceso que permite que una instruccin se desplace desde la etapa de decodificacin de la
instruccin (ID) a la de ejecucin (EX) se le llama
emisin de la instruccin (instruction issue)
y la instruccin sobre la que se ha realizado este proceso se dice que ha sido emitida (issued).
Para la segmentacin de enteros sobre DLX (sin punto flotante) todos los riesgos por dependencias
de datos pueden ser comprobados durante la fase ID. Con ello se consigue reducir la complejidad del
hardware, pues nunca una detencin de una instruccin interferir en el estado de la mquina, ya que los
parmetros caractersticos de la misma solo pueden ser modificados en los ltimos 3 segmentos.


Para detectar estos riesgos inevitables, necesitamos aadir hardware de deteccin de riesgos en el segmento
ID de nuestro procesador:


De forma que se mirar si la instruccin que est en EXE tiene previsto escribir en memoria, a continuacin
si va a escribir en memoria se analizar en registro destino de la instruccin para luego compararlo con los
dos registros fuente de la instruccin que se est decodificando en ID.
Si se cumple que hay coincidencia con alguno de los dos registros fuente, se introducir una nop en la
ejecucin segmentada, simulando una especie de burbuja como hemos visto antes.




Problema: Sea un procesador segmentado en el cual el 20% de las instrucciones son de carga. Adems,
despues de una instruccin de carga, en el 50% de los casos hay una instruccin que accede al dato
cargado. Ello determina que en la ejecucin segmentada de las instrucciones ser necesario introducir un
retardo de 1 ciclo de reloj.
Cuan ms rpido (en este caso ms lento) es el procesador real aqu presentado respecto a uno
ideal (sin retardos y con CPI = 1).

Solucin: Para saber la rapidez deberemos hacer el cociente entre los CPI (Insturcciones Por Ciclo), es
decir:
rapidez = CPI
real
/ CPI
ideal


El CPI
ideal
es 1.

El CPI
real
lo podemos saber de la siguiente forma:

1) El 20% de las instrucciones son de carga y de ellas el 50% produce retardo, es decir, el 10% de las
instrucciones produce retardo.
2) En plena segmentacin, si de cada 10 intrucciones tengo un retardo, entonces estas 10 instrucciones
tardarn 11 ciclos de reloj.

3) El CPI
real
se calcula por cociente entre entas cantidades:

CPI
real
= 11/10=1,1

4) Por lo tanto tenemos:

rapidez = (CPI
real
/ CPI
ideal
) % = (1,1/1) = 11%

la mquina ideal es un 10% ms rpida.


Problema: Realizar un programa que realice la multiplicacin de dos vectores de n datos y almacene el
resultado sobre un tercer vector de datos. Completar el cdigo.

; VECTORES.S
;Datos a partir de esta direccin
.data 0x2000
n: .word 8, 0
datosX: .double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8,
datosY: .double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8,
datosZ: .space 64

.text 0x100
...
Una vez realizado el programa, mostrar su ejecucin segmentada de dos formas:
1) Con la opcin forwarding desactivada.
2) Con la opcin forwarding activada.
Para este segundo caso describir como se realizan todos los adelantamiento (entre que unidades funcionales
del procesador).

Solucin:
; VECTORES.S : Z(i) = X(i) * Y(i).

;Datos a partir de esta direccin
.data 0x2000
n: .word 8, 0
datosX: .double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8
datosY: .double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8
datosZ: .space 64

.text 0x100
addi R1, R0, 0
lw R8, n

eti: LD F0, datosX(R1)
LD F2, datosY(R1)

ADDD F4, F0, F2
SUBI R8, R8, 1
SD datosZ(R1), F4

ADDI R1, R1, 8
BNEZ R8, eti
trap 0

Segmentacin SIN FORWARDING:


Segmentacin CON FORWARDING:



Planificamos el cdigo para eliminar completamente los riesgos por dependencias de datos:







Planificacin de la emisin de instrucciones.
A nivel hardware ya hemos evitado casi todos los riesgos por dependencia de datos, pero cabe una
solucin software al problema de las detenciones. El compilador puede reorganizar la secuencia de
instrucciones para evitar que se produzcan este tipo de detenciones por dependencias de datos. La tcnica
de compilacin que evita esto se conoce como:
planificacin de la segmentacin o planificacin de instrucciones
Si el software nos evita completamente este riesgo, podramos evitar utilizar el hardware de control para
evitar este tipo de riesgos. La idea es buena, ya que existen mquinas en las cuales, la responsabilidad de
detectar y evitar este tipo de riesgos esta en manos del software completamente.
Pregunta: Pero que ocurra cuando el compilador no poda evitar de ninguna forma este tipo
de riesgos?
Respuesta: No le quedaba ms remedio que utilizar una instruccin tipo NOP despus de la
carga para evitar el problema.

Esta inclusin no influa en el tiempo de ejecucin del programa, pero si en la longitud del cdigo
generado.
De todas formas, tanto si el hardware detecta el interbloqueo y detiene la segmentacin como si no,
el rendimiento mejora si el compilador planifica la ejecucin de las instrucciones.

En la figura (6.13) de la pgina siguiente se observa como mejora el rendimiento de del procesador
si el compilador previamente planifica la ejecucin de las instrucciones.




Porcentaje de las cargas que causan detencin con la segmentacin de DLX.






Segmentacin SIN FORWARDING:


Segmentacin CON FORWARDING:

Das könnte Ihnen auch gefallen