3.1. DISEÑO DE REPERTORIO DE INSTRUCCIONES.

Anuncio
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
SEGMENTACIÓN
6.1 Introducción a la segmentación de Instrucciones.
La segmentación o pipeline es una técnica de realización de procesadores por la cual se solapa la
ejecución de las instrucciones. Hoy en día es la técnica clave para la realización de CPU rápidas.
La idea básica de la segmentación se puede extraer de una cadena de montaje de coches. Los
coches no se montan uno a uno, si no que su construcción 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 simultáneamente en la construcción de un coche diferente. De esta forma, la construcción
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 construcción).
Cada uno de estas fases se denomina segmento o etapa de segmentación. Al igual que en los
coches, la productividad de un computador va a depender del número de instrucciones que acaben
por unidad de tiempo, y no de lo que le cueste a una instrucción individual.
6.2 Segmentación para DLX.
Si queremos aplicar la técnica de la segmentación a la ejecución de instrucciones, deberemos
dividir la ejecución de las mismas en una serie de etapas. Por ejemplo, en DLX la ejecución de una
instrucción se divide en 5 etapas:
 IF:
Lectura de instrucción.

ID:
Decodificación de Instrucción y lectura de registros.

EXE:
Ejecución de la instrucción.

MEM:
Acceso a memoria de datos.

REG:
Acceso a banco de registros.
La realización de cada etapa de segmentación es un ciclo máquina. Esta duración está
determinada por la duración de la etapa más lenta. Con frecuencia el ciclo máquina es un ciclo de
reloj (a veces dos), aunque el reloj puede tener múltiples fases.
El objetivo del diseñador de computadores es equilibrar correctamente el diseño de cada
segmento para que todos tengan la misma duración. Si esto es así, entonces la duración de una
instrucción será (si no hay atascos):
Tiempo por instrucción en máquina no segmentada
Número de etapas de la segmentación
De forma ideal, el avance en rapidez del procesador por la segmentación se ve multiplicado
por el número 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 ejecución de las instrucciones
que hacen que no siempre se superponga su ejecución perfectamente (se suele obtener un 10% menos
de rapidez de la prevista en el caso ideal).
La segmentación es una técnica no visible al programador, que consigue una reducción en
el tiempo de ejecución medio por instrucción. Esta técnica que explota el paralelismo entre
instrucciones secuenciales.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
La segmentación es una técnica de diseño de procesadores que se viene empleando desde la tercera
generación de computadores. En la figura siguiente podemos ver como se han diseñado los
procesadores en cada generación.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
En las dos figuras siguientes se puede observar cómo funciona la segmentación 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. Segmentación caso ideal.
Figura 2. Segmentación caso real. Se introducen numerosos retardos en la ejecución
de las instrucciones.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Ejemplo 1: Sea un procesador segmentado en 5 etapas con una duración de (50, 50, 60, 50, 50) nseg
de duración para cada una de las etapas. Es decir, cuando ejecuta una instrucción de forma no
segmentada, tarda 260 nseg en ejecutarla.
Si este mismo procesador lo diseñamos de forma segmentada, deberemos añadir 5 nseg. a cada etapa
debido al retardo de los biestables que almacenan la información entre etapas.
Ver el esquema siguiente:
La pregunta es, cuando ejecutamos N=10 instrucciones, ¿qué aceleración y que eficiencia se
consiguen?
Aceleración
TNoSegmentado
*n
(n 1))
seg * ( k
ins
TSegmentado
Eficiencia
AceleraciónMaxima
lim n
(k
n
(n 1))
Aceleración
260 *10
65 * (5 (10 1))
10
(5 (10 1))
lim n
10
14
2.86
0.71
*n
(n 1))
seg * ( k
ins
2600
910
ins
seg
260
65
4
Realizar los cálculos de la Aceleración y la Eficiencia para cuando procesamos N = 4 y N = 32
instrucciones. (Importante: Usar siempre las formulas de este ejemplo).
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Ejemplo 2: En esta figura 6.3 del Tomo 2 de “Estructura y diseño de Computadores” (Ed. Reverté)
Se puede observar cómo se realiza la ejecución de una instrucción 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 duración.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Antes de pasar a ver como definimos con detalle las operaciones a realizar en cada uno de los
segmentos de ejecución segmentada de DLX, debemos recordar cuales son los tres formatos de
instrucciones de que dispone.
También necesitamos recordar la estructura del procesador DLX con ejecución monociclo, pues en
esta estructura nos basaremos para definir el procesador segmentado.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Ahora, ya estamos preparados para empezar a diseñar nuestro procesador Segmentado.
Lo primero que haremos será colocar los registros intermedios que nos permitirán almacenar datos y
señales de control de cada una de las instrucciones que entran en el cauce segmentado.
En la figura siguiente se muestra el esquema inicial del procesador DLX segmentado (ya lo
complicaremos después).
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Definición de Segmentación para DLX.
Vamos a partir de un repertorio de instrucciones conocido como es el DLX, pero sin operaciones en
coma flotante. La ejecución de todas sus instrucciones puede descomponerse en 5 pasos básicos,
cada uno de los cuales tiene un duración de 1 o más ciclos de reloj. Veamos por partes cada paso:
1. IF-Paso de búsquea de instrucción: Se pasa el valor del Contador de Programa (PC) al Registro
de Acceso a Memoria (MAR). Se lee de memoria la siguiente instrucción y se carga en el RI.
MAR  PC ;
IR  Mem[MAR
2. ID-Paso de búsqueda del registro/decodificación de instrucción. Se decodifica la instrucción
leída y se accede a los registros indicados. Se incrementa el PC para que apunte a la siguiente
instrucción.
A  Rsl ;
B  Rs2;
PC  PC+4
Como la posición de los registros fuente para DLX siempre es la misma, entonces estos
valores pueden ser leídos a la vez que decodificamos la instrucción en curso.
3. EX-Paso de dirección efectiva /ejecución. La ALU podrá operar con los operandos del paso
anterior para realizar una de estas tres funciones.
i) Referencia a memoria: La ALU suma los operandos para formar la dirección efectiva y se
carga en el MDR.
MAR  A+(IR16)16##IR16..31;
MDR  Rd
ii) Instrucción ALU: La ALU realiza la instrucción especificada por el código de operación
sobre los registros Rs1 y Rs2 o Rs1 y un valor inmediato.
ALU-salida  (A op B) ó (A op ((IR16)16##IR16..31))
iii) Salto/bifurcación: La ALU suma el PC al valor inmediato de signo extendido (de 16 bits
para saltos y 26 para bifurcaciones) y así calcula la dirección de salto.
ALU-salida  PC + ((IR16)16##IR16..31)) ;
cond  (A op 0)
Para saltos condicionales se examina un registro que ha sido leído en un paso anterior para saber si la
dirección calculada se coloca en el PC.
La arquitectura de carga/almacenamiento de DLX supone que el cálculo de una dirección efectiva y
la ejecución de una instrucción en la ALU se pueden superponer, pues ninguna instrucción aritmética
necesita calcular una dirección para acceder a un operando.
4. MEM-Paso de completar salto/acceso a memoria: las únicas instrucciones DLX activas en este
paso son las de acceso a memoria y los saltos.
i) Referencia a memoria: Accede a memoria para leer o escribir un dato.
MDR  Mem[MAR
ó
Mem[MAR  MDR
ii) Salto: El valor de PC es sustituido por la dirección de salto.
if (cond) : PC  ALU-salida
5. WB-Paso de postescritura (write-back): Escribe resultado en registro, tanto si proviene de
memoria como de la ALU.
Rd  ALU-salida ó MDR
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Como resultado de poder subdividir cada instrucción en 5 segmentos (todos de 1 ciclo de
reloj), podemos leer una instrucción en cada ciclo de reloj. Y así, aunque la ejecución de cada
instrucción requiera 5 ciclos de reloj, el resultado es que cada ciclo de reloj (si no pasa nada) finaliza
una instrucción diferente. Recordar lo visto en la figura 1:
El resultado más evidente es que la segmentación aumenta el número de instrucciones emitidas y
finalizadas sobre una CPU por unidad de tiempo, pero sin reducir (antes al revés) la duración de
ejecución de una instrucción. Por ello, cara al programador, sus programas se ejecutan más rápidos.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Diseño de la Unidad Segmentada.
Camino de datos. Muestra, como ya sabemos de cursos anteriores, como funciona el procesador de
DLX cuando está ejecutando una instrucción por ciclo (es decir, es un repaso de materia ya vista en
primero, en EC I). Es un ejemplo de cómo se propagan los datos a través del procesador.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Ejercicio: Aunque es un repaso de lo visto en cursos anteriores, completar el siguiente esquema.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Control para la segmentación.
La ejecución de instrucciones en un procesador segmentado requiere que en cada uno de los
segmentos seamos capaces de almacenar toda la información de la instrucción que se está ejecutando
en ese segmento.
Por ejemplo, si ejecutamos una instrucción de salto, en el primer segmento leeremos el código de la
instrucción e incrementaremos el PC almacenándolo 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 instrucción, borraremos este valor y ya no podrá ser
utilizado después.
Por este y otros motivos similares, en los registros intermedios del procesador segmentado para
DLX, se almacena toda la información necesaria de la instrucción que se está ejecutando en ese
segmento, y cuando pasamos al segmento siguiente, esta información si se va a utilizar en algún
segmento posterior, se traslada también copiándose 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
segmentación funciones correctamente.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Observar:
Propagación del valor del NPC.
Propagación del código del registro destino hasta último segmento.
Propagación de resultado de la ALU: ALUOutput.
Como se actualiza el valor del contador de programa, usando una puerta AND.
Líneas de entrada del Banco de Registros.
Líneas 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 realización
segmentada de instrucciones de DLX. (figura 6.30). Esta transparencia debe ser analizada con
detalle.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
6.3 Los riesgos de la segmentación.
Todo lo visto hasta ahora está muy bien, pero no siempre se pueden superponer la ejecución 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 utilización del hardware. Impiden que
dos instrucciones se solapen en determinados segmentos.
 Riesgos por dependencias de datos. Es cuando los datos que necesita una instrucción 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 segmentación (no siempre). Pero
detener el procesador en una máquina no segmentada es fácil, basta terminar la instrucción en curso.
En una máquina segmentada hay varias instrucciones en curso, y por ello un detención supone, en la
mayoría 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 instrucción se detiene, las instrucciones anteriores finalizan
normalmente y las posteriores sufren un retardo en su ejecución. Durante el tiempo de retardo, no se
leen más 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 máquina segmentada deben de poderse solapar cualquier combinación de instrucciones. Si no
es así, se dice que la máquina posee riesgos estructurales. Una máquina sin riesgos estructurales
siempre tendrá un CPI más 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 instrucción en un determinado segmento debe
acceder a memoria para leer o escribir, en ese segmento no se podrá leer ninguna instrucción, por lo
cual el inicio de una nueva instrucción 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).
Instrucción
Carga
Instrucción i+1
Instrucción i+2
Instrucción i+3
Instrucción i+4
1
IF
2
ID
IF
Ciclos
3
EX
ID
IF
de
4
MEM
EX
ID
Reloj
5
WB
MEM
EX
detención IF
6
7
WB
MEM WB
ID
EX
IF
ID
8
9
MEM WB
EX
MEM
Sin embargo hay máquinas que se diseñan con riegos estructurales, el motivo es sencillo:
Para reducir el coste en la producción. 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 número 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.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
También hay que destacar que aparecen dos tipos de riesgos más:
El riesgo estructural que se introduce al acceder al banco de registros.
El riesgo estructural que se produce cuando tenemos instrucciones cuya ejecución dura más
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. Además, es
mejor que primero sea la escritura y luego la lectura, pues evitaremos un posible riesgo por
dependencia de datos.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
El segundo riesgo lo analizaremos con más detalle cuando introduzcamos las instrucciones
multiciclo. Pero ahora vamos a realizar un pequeño estudio, considerando lo que ocurriría si todas las
instrucciones tuviesen un ciclo de reloj en ejecución salvo las instrucciones de multiplicación y
división que tienen 2 ciclos.
Aquí se plantean varias alternativas que habrá que analizar:


Duplicar la unidad de ejecución 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 código.
Se pide analizar estas dos opciones y decidir cuál es la más conveniente.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Caso 1: Segmentación Inicial.
Caso 2: Duplicamos unidad aritmética de Mult/Div. Tenemos una burbuja o ciclo de espera en la
ejecución de estas 4 instrucciones.
Caso 3: No duplicamos unidad aritmética pero Si planificamos Código. Seguimos teniendo una
burbuja o ciclo de espera en la ejecución de estas 4 instrucciones.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Riesgos por dependencia de datos.
Los riesgos por dependencia de datos surgen cuando una instrucción escribe un resultado en un
determinado registro (durante el último segmento) y alguna de las instrucciones siguientes hace 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
SUB
R1, R2, R3
R4, R1, R5
La instrucción SUB tiene como registro fuente R1, y la instrucción anterior ADD guarda el
resultado de una suma en este mismo registro. Si ejecutásemos de forma segmentada estas dos
instrucciones tendríamos:
Instrucción
1
2
Ciclos de Reloj
3
4
ADD
SUB
IF
ID
IF
EX
ID_leo_R1
MEM
EX
5
6
WB_en_R1
MEM
WB
Si no introdujéramos un retardo entre estas dos instrucciones, la instrucción SUB manejaría
un valor de R1 no correcto. Esto es inaceptable en un procesador.
Instrucción
1
ADD
nop
IF
nop
SUB
Ciclos
2
de
3
Reloj
4
5
ID
-
EX
-
MEM
-
WB_R1
-
-
-
-
-
-
IF
ID_R1
EX
MEM
6
7
8
9
WB
El problema planteado aquí se resuelve con una sencilla técnica llamada según autores de la
siguiente forma:
Adelantamiento, “forwarding”, desvío, “bypassing” o cortocircuito.
El funcionamiento hardware de esta técnica es sencillo: las distintas unidades funcionales se
adelantan los datos entre ellas sin necesidad que estos datos estén escritos en el Banco de Registros,
para de aquí se leídos.
En las transparencias de la página siguiente (FIGURE 3.9 y FIGURE 3.10) se muestra el
funcionamiento de esta técnica de formalmente.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Vicente Arnau Llombart
Ampliación de Estructura de Computadores. Curso 2010-2011
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Con ello se consigue que si una instrucción utiliza un registro como fuente y la instrucción
anterior lo tiene como destino de una operación, entonces la segunda instrucción 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 después, la segunda instrucción ya habrá hecho uso de su valor.
Como hemos visto, en la segmentación de DLX, no solo la instrucción siguiente puede
necesitar un valor de un registro todavía no actualizado, también 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 cómo una instrucción 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 instrucción ADD inicializa el valor del registro R1.
Las cuatro instrucciones restantes lo utilizan.
El valor de R1 se desvía para ser utilizado por las dos restantes: SUB, AND y OR.
La instrucción OR y la XOR cuando necesitan R1, la instrucción 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.
En la página siguiente se muestra como se realizarían los adelantamientos de datos para estas dos
secuencias de instrucciones:
FIGURE 3.11: adelantamiento de ALU
memoria y de memoria a memoria.
ADD R1, R2, R3
LW R4, 0(R1)
SW 12(R1), R4
a FIGURE 3.12: adelantamiento de memoria a
unidad aritmética: ¿!!?.
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 también más adelante
en los apuntes).
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Vicente Arnau Llombart
Ampliación de Estructura de Computadores. Curso 2010-2011
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
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.
Fichero de
Registros
Mux
Mux
Caminos de
desvio
ALU
Bus de escritura
de resultados
R4
Buffers de resultados
de la ALU
R1
La ALU con sus unidades de desvío.
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 vía la utilización 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 lógica local asociada al desvío.
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 instrucción 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 segmentación, no se requiere ningún retardo por
combinación de cualquier conjunto de instrucciones que operen sobre esta ALU de punto fijo.
También aparecería un riesgo cuando tuviésemos dos instrucciones que pretendieran leer y
escribir sobre una misma posición 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.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Los fallos de acceso a cache podrían también desordenar las referencias a memoria si se
permitiera que el procesador siguiese trabajando con instrucciones posteriores. Pero en DLX, cuando
esto ocurre, detenemos la segmentación por completo, haciendo que la ejecución de la instrucción
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 está a la salida de la ALU ya se puede
utilizar para el cálculo de la siguiente instrucción, y a su vez este valor será adelantado al MDR
(Registro de Datos de Memoria) para que sea almacenado en una dirección de memoria el contenido
del registro R1.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Clasificación:
Pero en cualquier procesador segmentado genérico, 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 instrucciones, primero i y luego j; entonces la clasificación podría ser esta:



RAW (Read After Write): una instrucción j intenta leer antes de que la instrucción i realice
la escritura. El resultado es que se lee un valor no correcto (ya hemos visto ejemplos antes).
WAR (Write After Read): una instrucción j escribe un valor antes de que la instrucción i lo
lea. Esto en DLX no ocurre, pues las lecturas se realizan antes en ID y las escrituras después
en WB. Ocurre cuando hay instrucciones que escriben anticipadamente el resultado, como
por ejemplo cuando se autoincrementa un registro en cálculo de una dirección.
WAW (Write After Write). Es cuando las dos instrucciones, tanto i como j, realizan una
escritura por ejemplo en un registro; pero la instrucción j lo realiza antes que la i por hacerlo
en segmentos anteriores. Ocurre en segmentaciones que escriben en más de una etapa.
Como es de imaginar, RAR no supone un riesgo.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Observar el detalle de cómo funciona la unidad de detección de riesgos: En el ciclo 3 de reloj se está
ejecutando la instrucción “SUB R2, R1, R3” que inicializa el registro R2. Cuando esta instrucción
pasa en el ciclo 4 al segmento MEM, entrará en EXE la instrucción “ADD R4, R2, R5” que
necesitará recibir de forma adelantada el contenido de R2, pues el valor leído en el banco de registros
no es el correcto.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Inevitables:
Pero no todos los riesgos son inevitables. Cuando leemos un dato de memoria y lo cargamos en un
registro, el registro no estará correctamente accesible hasta después del ciclo de acceso a memoria.
Analicemos por ejemplo la siguiente secuencia de código:
LW
ADD
SUB
AND
R1,32(R6)
R4,R1,R7
R5,R1,R8
R6,R1,R7
La primera instrucción LW no posee el dato hasta que finaliza el 4º segmento, en el cual
grabara en R1 el dato leído.
Y la instrucción siguiente ADD necesita leer R1 durante su 2º periodo (en ID), por lo tanto,
deberá introducirse 2 ciclos de espera en la ejecución segmentada de estas instrucciones.
Además SUB también requerirá un ciclo de espera pues no podrá leer en ID correctamente el
valor del registro R1. Para la instrucción AND ya no habrá problemas.
Instrucción
1
2
Ciclos de
3
4
LW R1,32(R6)
IF
ID
EX
MEM
WB
IF
ID
EX
MEM WB
IF
ID
EX
MEM WB
IF
ID
EX
MEM WB
IF
ID
EX
ADD R4,R1,R7
SUB R5,R1,R8
AND R6,R1,R7
nop
Reloj
5
6
7
8
9
MEM WB
Pero podemos acortar el tiempo de detención si hacemos que la ALU lea directamente desde
el MDR. Es también un adelantamiento de los datos, con lo cual el multiplexor de entrada de la ALU
ya no tendrá 3 sino 4 entradas a seleccionar. Con ello ya solo será necesario, para este caso,
introducir un ciclo de espera, como muestra la figura siguiente.
Reloj
3
4
5
WB
Instrucción
1
LW R1,32(R6)
IF ID
EX
MEM
ADD R4,R1,R7
IF
ID
IF
SUB R5,R1,R8
AND R6,R1,R7
nop
2
Ciclos de
6
7
8
9
detención EX
MEM
WB
detención ID
EX
MEM
WB
detención IF
ID
EX
MEM WB
IF
ID
EX
MEM
10
WB
Generalmente, cuando tenemos una instrucción del tipo A = B + C hay una probabilidad bastante
alta de que se produzca una detención debido a la carga del segundo dato. Sin embargo podemos
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
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 código ensamblador que generaría la
anterior instrucción de alto nivel:
Instrucción
1
2
Ciclos de
3
4
LW R1,B
IF
ID
EX
MEM
WB
IF
ID
EX
MEM
IF
ID
detención EX
MEM WB
IF
detención ID
EX
LW R2,C
ADD R3,R1,R2
SW A,R3
Reloj
5
6
7
8
9
WB
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 segmentación que se conoce como
burbuja (“bubble”) o detención de cauce (“pipeline stall”)
El proceso que permite que una instrucción se desplace desde la etapa de decodificación de la
instrucción (ID) a la de ejecución (EX) se le llama
emisión de la instrucción (“instruction issue”)
y la instrucción sobre la que se ha realizado este proceso se dice que ha sido emitida (“issued”).
Para la segmentación 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 detención de una instrucción interferirá en el estado de la
máquina, ya que los parámetros característicos de la misma solo pueden ser modificados en los
últimos 3 segmentos.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Vicente Arnau Llombart
Ampliación de Estructura de Computadores. Curso 2010-2011
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Para detectar estos riesgos inevitables, necesitamos añadir hardware de detección de riesgos en el
segmento ID de nuestro procesador:
De forma que se mirará si la instrucción que está en EXE tiene previsto escribir en memoria, a
continuación si va a escribir en memoria se analizará en registro destino de la instrucción para luego
compararlo con los dos registros fuente de la instrucción 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 ejecución segmentada, simulando una especie de “burbuja” como hemos visto antes.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Problema: Sea un procesador segmentado en el cual el 20% de las instrucciones son de carga.
Además, después de una instrucción de carga, en el 50% de los casos hay una instrucción que accede
al dato cargado. Ello determina que en la ejecución segmentada de las instrucciones será necesario
introducir un retardo de 1 ciclo de reloj.
Cuan más rápido (en este caso más lento) es el procesador real aquí presentado respecto a uno
ideal (sin retardos y con CPI = 1).
Solución: Para saber la rapidez deberemos hacer el cociente entre los CPI (Instrucciones Por Ciclo),
es decir:
Rapidez = CPIreal / CPIideal
El CPIideal es 1.
El CPIreal 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 segmentación, si de cada 10 instrucciones tengo un retardo, entonces estas 10
instrucciones tardarán 11 ciclos de reloj.
3) El CPIreal se calcula por cociente entre estas cantidades:
CPIreal = 11/10=1,1
4) Por lo tanto tenemos:
Rapidez = (CPIreal / CPIideal ) % = (1,1/1) = 11%
la máquina ideal es un 10% más rápida.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Problema: Realizar un programa que realice la multiplicación de dos vectores de n datos y almacene
el resultado sobre un tercer vector de datos. Completar el código.
;
VECTORES.S
n:
datosX:
datosY:
datosZ:
;Datos a partir de esta dirección
.data 0x2000
.word 8, 0
.double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, …
.double 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, …
.space 64
.text 0x100
...
Una vez realizado el programa, mostrar su ejecución segmentada de dos formas:
1) Con la opción forwarding desactivada.
2) Con la opción forwarding activada.
Para este segundo caso describir como se realizan todos los adelantamiento (entre que unidades
funcionales del procesador).
Solución:
;
VECTORES.S :
Z(i) = X(i) * Y(i).
;Datos a partir de esta dirección
.data 0x2000
n:
.word
datosX:
.double
datosY:
.double
datosZ:
.space
eti:
8, 0
1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8
1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8
64
.text
addi
lw
0x100
R1, R0, 0
R8, n
LD
LD
F0, datosX(R1)
F2, datosY(R1)
ADDD
SUBI
SD
F4, F0, F2
R8, R8, 1
datosZ(R1), F4
ADDI
BNEZ
trap
R1, R1, 8
R8, eti
0
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Segmentación SIN FORWARDING:
Segmentación CON FORWARDING:
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Planificamos el código para eliminar completamente los riesgos por dependencias de
datos:
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Planificación de la emisión de instrucciones.
A nivel hardware ya hemos evitado casi todos los riesgos por dependencia de datos, pero cabe
una solución 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
técnica de compilación que evita esto se conoce como:
planificación de la segmentación o planificación de instrucciones
Si el software nos evita completamente este riesgo, podríamos evitar utilizar el hardware de control
para evitar este tipo de riesgos. La idea es buena, ya que existen máquinas en las cuales, la
responsabilidad de detectar y evitar este tipo de riesgos esta en manos del software completamente.
Pregunta: ¿Pero que ocurría cuando el compilador no podía evitar de ninguna forma este
tipo de riesgos?
Respuesta: No le quedaba más remedio que utilizar una instrucción tipo NOP después de
la carga para evitar el problema.
Esta inclusión no influía en el tiempo de ejecución del programa, pero si en la longitud del
código generado.
De todas formas, tanto si el hardware detecta el interbloqueo y detiene la segmentación como
si no, el rendimiento mejora si el compilador planifica la ejecución de las instrucciones.
En la figura (6.13) de la página siguiente se observa como mejora el rendimiento de del
procesador si el compilador previamente planifica la ejecución de las instrucciones.
Porcentaje de las cargas que causan detención con la segmentación de DLX.
Vicente Arnau Llombart
26/11/2010
Ingeniería Informática.
Ampliación de Estructura de Computadores. Curso 2010-2011
Comentarios: . . . . . . . . . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . .
. . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . .
. . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . .
. . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . .
. . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . .
. . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . . . . . . . . .. . . . . . .. . . . . . .
Vicente Arnau Llombart
26/11/2010
Descargar