Está en la página 1de 6

ARQUITECTURA DE SISTEMAS PARALELOS.

3º INGENIERÍA TECNICA EN INFORMÁTICA DE SISTEMAS.


PRÁCTICA 6 (curso 03/04)
SEGMENTACION EN EL PROCESADOR DLX
OBJETIVOS.

En esta práctica manejaremos un simulador (WinDLX, de libre distribución que se puede descargar en la dirección
http://icaro.eii.us.es/software/windlx_i.exe ) del procesador didáctico encadenado (segmentado) DLX, con dos objetivos:
 Familiarizarse con el juego de instrucciones de un procesador RISC típico, como es el DLX.
 Trabajar con el encadenamiento básico del mismo.
Hay que tener en cuenta que el juego de instrucciones de los procesadores RISC está orientado a la sencillez
para que el encadenamiento sea muy efectivo, de ahí que las instrucciones de que suele disponer son muy simples
aunque ortogonales, y en esto difieren de las de los procesadores CISC (ej. familia x86 o 68000) a la que seguramente el
alumno esté acostumbrado. En esta práctica se pretende estudiar el comportamiento de un procesador segmentado,
comprobar el efecto de los bloqueos de datos y control sobre las prestaciones así como evaluar algunas técnicas para
reducir estos bloqueos.

INTRODUCCION.

Características de la Arquitectura DLX. Aunque en clase de teoría se ha estudiado la arquitectura interna del
procesador DLX, para la realización de esta práctica y el manejo de instrucciones sólo nos hace falta saber del DLX:
 Contiene 32 registros de 32 bits (R0 a R31) de propósito general (General Purpose Register, GPR), es decir
todos sirven para todo (son ortogonales). Las únicas excepciones son el registro R0 que siempre contiene el
valor cero, y el R31, que sirve para guardar la dirección de retorno en las JAL (Jump and Link , equivalentes a
las llamadas a subrutinas CALL). Existen otros registros especiales y de coma flotante (FP) que no se estudian
en esta práctica.
 Todas las instrucciones ocupan una palabra de 32 bits exactamente y deben estar alineadas en memoria (ocupar
direcciones múltiplo de 4). O sea una instrucción no puede empezar en la dirección 20003 y acabar en la
20006; debe ocupar de la 20000 a la 20003 o bien de la 20004 a la 20007.

Juego de instrucciones . En el anexo 1 se tiene una tabla resumen de las instrucciones del DLX y una breve
explicación del juego de instrucciones, del cual a continuación explicamos los detalles más importantes.
Todas las instrucciones (donde tenga sentido) son de tres operandos, es decir, se efectúa la operación sobre dos
operandos fuente (situados a la derecha en la notación DLX) y el resultado lo almacenan en el registro destino (el de la
izquierda). Por ejemplo:
ALUoper R1, R2, R3 ; R1 <— R2 oper R3 ; R2 y R3 son fuente, R1 destino.

Modos de direccionamiento. Aún más reducido que el conjunto de instrucciones son los modos de
direccionamiento. DLX sólo permite dos (y con ellos debemos componérnoslas para escribir cualquier código):
 Inmediato. Una constante de 16 bits actúa como segundo operando fuente. Por ejemplo: ALUoper R1,R2,#d16,
; R1 <— R2 oper d16 ; R2 y d16 son fuente, R1 destino. d16 es un constante de 16 bits. Sólo se puede usar
en instrucciones ALU, y no en las de transferencia de datos. La almohadilla # puede suprimirse.
 Registro base más desplazamiento. Sólo se usa en las de transferencia de datos, y nunca en las ALU las cuales
sólo pueden usar registros o valores inmediatos como operandos. Por ejemplo, si usamos el paréntesis como
notación del direccionamiento y el corchete como dirección de memoria, una instrucción de carga sería: Load
R1, d16(R3) ; R1<— [R3+d16], donde R3 es el registro base en esta instrucción y d16 una constante con
signo de 16 bits. Evidentemente un tercer operando no tiene sentido en estas instrucc iones de transferencia de
datos. Un almacenamiento sería: Store d16(R4), R5 ; [R4+d16] <— R5. Dado que el registro R0 contiene
siempre el valor 0, si se usa R0 como registro base se está accediendo a los primeros 32Kb de la memoria o a
los últimos 32KB (si el desplazamiento fuera negativo). Si se toma d16 como 0 se tiene un direccionamiento
indexado simple.
El resto de operaciones debe realizarse directamente sobre registros.

Instrucciones ALU. Como se dijo antes son de tres operandos y además son todas registro -registro, es decir todo
operando es un registro, y ningún operando puede estar en memoria. Nótese la regularidad de ellas: toda operación
simple tiene otras tres variantes (siempre que lo permita). Por ejemplo para la suma con signo ADD, existe:
1. Suma sin signo ADDU.
2. Suma con signo y con direccionamiento inmediato (valor de 16 bits) ADDI
3. Suma sin signo y con direccionamiento inmediato (valor de 16 bits) ADDUI
Evidentemente en una operación lógica (OR, XOR, AND) no tiene sentido el signo. En una multiplicación o
división por razones de implementación no existe el direccionamiento inmediato.

1
Finalmente existen unas instrucciones que valoran o inicializan a cierto o falso (en inglés “set”) un registro destino
comparando los dos fuente, están pensadas para instrucciones condicionales, por ejemplo SET if GREATER OR
EQUAL (Inicializa comparando si es mayor o igual): SGE R13, R21, R22 ; R13 <— (R21 >= R22). Existen las
siguientes:
 LT, if LESS THAN, si menor que
 GT, if GREATER THAN, si mayor que
 LE, if LESS OR EQUAL, si menor o igual que
 GE, if GREATER OR EQUAL, si mayor o igual que
 EQ, if EQUAL, si es igual que
 NE, if NOT EQUAL, si no es igual que

Transferencia de datos (Ld/St). Son muy simples ya que sólo pueden usar el direccionamiento antes mencionado.
También tienen variantes en función de si se lee (Load) un dato con o sin signo, y de si se lee/escribe una palabra de 32
bits (Word), una media palabra de 16 bits (Half word ) o un Byte. Por ejemplo LHU lee de memoria 16 bits sin signo
(Unsigned Half): LHU R7, -23(R0) ; R7 <— (extensión a 32 bits sin signo de la media palabra de [R0-23]) (recuerde
que R0 siempre contiene 0).
Una característica habitual en todos los RISC y que también se tiene en DLX es la ausencia de la instrucción
genérica de movimiento de datos MOV. Dada la simplicidad del acceso a memoria de éstos no se permite ningún tipo
de movimiento entre datos de memoria (habría que suplirlo con varios Ld/St), pero tamp oco existe el MOV entre
registros, ni tampoco de un valor inmediato a un registro. Estas últimas instrucciones se sustituyen por cualquier
operación que no afecte al registro fuente, por ejemplo:
MOV R3, R4 se convierte en ADD R3, R4, R0 ; ya que R0 siempre vale 0.
O bien MOV R3, R4 se convierte en ADDI R3, R4, 0.
MOV R3, d16 se convierte en ADDI R3, R0, d16 ; ya que R0 siempre vale 0.
Aunque parece que esto va a llevar a una pérdida de tiempo, por tener que realizar una operación de suma donde no
haría falta hacerla, se verá cuando se estudie la arquitectura del DLX que no implica ningún retraso o pérdida de
rendimiento. Tan sólo se ha requerido la adición de una instrucción para cargar valor inmediato de 16 bits sobre la parte
alta (16 bits MSB) de un registro de 32 bits; por ejemplo, MOV R9, d32 no existe por razones de formato de
instrucciones, y debe convertirse en:
LHI R9, d16 (altos)
ADDUI R9, R0, d16 (bajos)

ALGUNAS CONSIDERACIONES SOBRE WINDLX

WinDLX es un simulador de fácil manejo (basado en ventanas y menús simples) que emula completamente el
DLX, tanto en la cadena de ejecución, como en los contenidos de la memoria, del fiche ro de registros, y de los registros
temporales de la cadena. Además permite modificar varios parámetros de las unidades aritméticas de ejecución. Por
tanto requiere de seis ventanas para detallar toda la información (las tres primeras son las más importantes):
 Register Window. Esta ventana enseña el contenido de los registros de usuario (R0-R31 y los de FP F0-F31 y
D0-D30) y los temporales. De estos últimos, en esta práctica sólo vamos a trabajar con:
 PC, contiene la dirección de la próxima instrucción a cargar, que siempre será múltiplo de cuatro, dado
que toda instrucción DLX ocupa una palabra de 32 bits. Cada ciclo de reloj se incrementará en 4 y por
tanto capturará una instrucción nueva.
 IMAR. Contiene la dirección con la que se accede a la memoria para cargar una instrucción (por eso
siempre valdrá 4 menos que el PC, excepto en los saltos).
 IR. Contiene la instrucción que se ha capturado, o sea el código de operación (opcode) de 32 bits. El
significado de cada uno de los bits o campos de tal opcode se estudiará en teoría, pero responde a un
modelo muy simple, ya que se trata de un procesador puramente RISC.
 A y B. Son dos registros temporales que cargan el valor de los operandos fuente-registros de una
instrucción (si ésta solamente tiene un operando fuente en registro, sólo A o B contendrán un valor real).
 ALU y ALUHI. Están a la salida de la ALU entera, de forma que se contenido es el resultado de la
operación aritmético-lógica. ALUHI es la parte alta (16 bits MSB).
 DMAR. Contiene la dirección con la que se accede a la memoria para acceder a un dato en una instrucción
Ld/St.

 Clock Cycle Diagram Window. Muestra la cadena de ejecución de las instrucciones para cada ciclo de reloj. Al
ser DLX un procesador encadenado (“pipeline”, segmentado o encauzado), se ejecutan varias instrucciones a la
vez y en cadena. Como el DLX subdivide cada instrucción en 5 etapas o fases (cuyo estudio profundo se
estudia en la teoría, sólo vamos a comentar que para instrucciones enteras éstas se llaman IF--ID--EX--MEM--
WB), se están ejecutando 5 instrucciones a la vez, cada una de ellas en fases distintas, como se ve en la
siguiente figura. La ejecución en cadena complica la visualización del contenido de los registros como se
explica más adelante. A su vez, haciendo “doble clic” con el ratón sobre una instrucción sale información
completa de la ejecución de esa instrucción.
2
 Code Window. Muestra información detallada (dirección de memoria, opcode y mnemotécnico) sobre el
código que se ha cargado. También cada instrucción aparece en un color distinto según la etapa o fase en la
que esté, como se ve en la siguiente figura (no se aprecia bien en la fotocopia en blanco y negro). También
haciendo “doble clic” con el ratón sobre una instrucción sale información completa de la ejecución de esa
instrucción.

Las siguientes ventanas tiene menos importancia:


 Pipeline Window. Muestra un gráfico de la cadena de ejecución del DLX, dado que algunos parámetros de tal
cadena se pueden configurar. Aparecen las 5 fases antedichas además de la cadena de ejecución para
operaciones de coma flotante FP.
 Statistics Window. Da una información detallada de las estadísticas de ejecución del programa cargado.
 Breakpoints Window. Muestra los puntos de ruptura que el usuario ha establecido en el programa.

La característica más sorprendente en un procesador encadenado y que hace que la depuración y simulación del
código sea difícil de seguir es, como dijimos antes, que se ejecutan varias (cinco) instrucciones a la vez. Por tanto el
contenido en un ciclo de reloj de los registros se corresponde con una de las cinco instrucciones en curso, en función de
la etapa en la que estén. Así para ver los valores de los registros en la ventana Register Window, hay que saber en qué
fase está cada instrucción.
De los distintos menús que tiene WinDLX el único interesante para nosotros es la configuración. Se debe configurar
inicialmente como se muestra en la figura siguiente, para que las direcciones no sean simbólicas, la cuenta de ciclos sea
absoluta y el “forwading” (bypass o desvío ) esté deshabilitado (se estudiará esto más adelante). También se dispone de
un menú para la memoria, que permite visualizar su contenido, cambiarlo y ver los símbolos del código.

3
El alumno debe, por tanto, antes de asistir al laboratorio:
 Estudiar las características principales del ensamblador del DLX.
 Haber asimilado los conceptos sobre las ventanas del WinDLX.

NOTA : para cargar un nuevo programa en el WinDLX hay que seleccionar “File” | “Load Code or Data”. En la ventana
que aparece se debe seleccionar con el cursor el archivo .s y a continuación presionar el botón “select”. Finalmente
pulsar “load”. Por otro lado los directorios con nombres de más de 8 caracteres no son aceptados por el WinDLX .
Por lo tanto asegúrese de que su fichero .s está tiene un path o ruta en donde no haya directorios con estas
características.

REALIZACIÓN DE LA PRÁCTICA.

En la práctica se estudiarán sobre todo las dependencias de datos. Este tipo de dependencias surge cuando dos
instrucciones próximas en el código utilizan datos comunes, y la segmentación hace que el orden de lectura o escritura
de esos datos difiera del que lógicamente tendrían en la ejecución secuencial de las instrucciones. Aparecen tres tipos de
dependencias de datos:

1. Dependencia real (RAW - lectura después de escritura). Una instrucción usa como datos de entrada los resultados
de una instrucción anterior por lo que debe esperar a que ésta se ejecute.

Ejemplo:

2. Antidependencia (WAR - escritura después de lectura). Caso contrario a la dependencia real. Una instrucción
posterior modifica los datos de una instrucción anterior. Este problema no aparece en nuestro caso ya que las
lecturas se hacen antes (en ID) y todas las escrituras después (en WB). Este riesgo se presenta cuando hay
instrucciones que escriben anticipadamente los resultados en el curso de la instrucción, e instrucciones que leen un
dato después que otra posterior realice una escritura.

3. Dependencia de salida (WAW - escritura después de escritura). Las escrituras se están realizando en un orden
incorrecto, dejando en el destino el valor escrito por la instrucción i en lugar del escrito por la instrucción j (j>i).

Para eliminar las dependencias de datos tenemos dos técnicas. Una sería software y consistiría en reordenar el
código o introducir NOP’s para evitar los conflictos (para las WAR y WAW, se puede renombrar registros por
software). La segunda técnica sería hardware y consiste en utilizar distintos desvíos o bypass. Esta técnica también se
denomina forwarding (adelantamiento). En el DLX las tres técnicas que se usan son realimentar la ALU con los datos
contenidos en ALUOutput al final de la etapa de EXE, realimentar la ALUOutput al final de la etapa MEM, y por
último, realimentar la salida de la memoria (LMD) al final de la etapa MEM.

El procedimiento para probar un código consiste en escribir el código en un fichero de texto con extensión .s,
cargarlo y ejecutarlo de la siguiente forma (comprobar que antes de la ejecución todos los registros están a cero, si no es
así resetear el DLX).
Los pasos para una ejecución simulada son:

4
 Cargar el fichero .S con la opción “File, Load Code”. Todo fichero que se quiera cargar ha de seleccionarse
previamente en la ventana “Selected Files”. Corregir errores si los hubo tras la carga; vienen expresados en función
de la línea donde se produjo).
 Ejecutar paso a paso el código (tecla F7). Han de tenerse abiertas al menos las ventanas Clock Cycle Diagram,
Register y Code, para ver la evolución de la cadena. Si ha de comprobarse alguna escritura en memoria deberíamos
visualizarlo en la opción “Memory, Display (tecla F6)”. (La dirección por defecto del código empieza en 0x0000
0100, apuntado por $TEXT, y la de los datos en 0x0000 1000, apuntado por $DATA).
 Se puede resetear el DLX simulado, por ejemplo para volver a comenzar la ejecución, usando la opc ión “File, Reset
DLX”.
 En el caso de necesitar avanzar varios ciclos, usar la tecla F8, opción “Execute, Multiple cycles”.

Ejercicio 1.

Dado el siguiente código en DLX:

add r4, r0, r0


bucle: lw r1,0(r4)
addi r1,r1,2
sw 0(r4),r1
lw r2,4(r4)
addi r2,r2,2
sw 4(r4),r2
lw r3,8(r4)
addi r3,r3,2
sw 8(r4),r3
addi r4, r4, 12
seq r5, r4, 60
beqz r5, bucle
nop
nop

trap 0 ; instrucción para finalizar la ejecución.

Escriba dicho código y ejecutelo en el simulador WinDLX (tenga en cuenta que la opción
Configuration|Enable Forwarding debe de estar deshabilitada).

a) ¿Cuántos bloqueos se producen?. ¿De qué tipo son?. Observe en particular las instrucciones seq y beqz.
b) ¿Cuál es la duración (en ciclos) del programa? Nota: Para medir el tiempo de ejecución en ciclos del
programa contaremos hasta la etapa WB (incluida) de la última instrucción útil, considerando que la
instrucción Trap 0 no es útil.
c) ¿Qué valores toman R1, R2, R3, R4, y R5 y las direcciones de memoria afectadas?.

Ejercicio 2.

A continuación reordenaremos el código para eliminar el máximo número de bloqueos teniendo en cuenta lo
siguiente:
- No se pueden añadir instrucciones de ningún tipo, ni siquiera NOP’s.
- No se pueden quitar instrucciones, no sobra ninguna.
- Al final de la ejecución los valores de los registros así como las direcciones de memoria afectados tienen
que ser los mismos que al final de la ejecución del programa sin reordenación.

a) Escriba el código reordenado.


b) ¿Cuál es la duración (en ciclos) del programa? ¿Hay algún bloqueo que no haya podido ser eliminado?.
c) ¿Qué aceleración se ha conseguido (Tiempo antes dividido por Tiempo después)?.

Ejercicio 3.

Ahora activaremos la opción Configuration|Enable Forwarding , con esto habremos habilitado los desvíos. A
continuación, ejecutaremos el código del ejercicio 1 (el código no ordenado).

a) ¿Cuántos bloqueos se producen?. ¿De qué tipo son?.


b) ¿Cuántas veces se utilizan los desvíos?.
c) Calcule CPIBloqueos y CPITotal.
5
ARQUITECTURA DE SISTEMAS PARALELOS.
3º INGENIERIA TECNICA EN INFORMATICA DE SISTEMAS.
PRÁCTICA 6. CURSO 03/04.
(SEGMENTACION EN EL PROCESADOR DLX)

NUM. GRUPO:
ALUMNOS:

Ejercicio 1
1.a Bloqueos: Tipo:

1.b Duración:

1.c

Ejercicio 2
2.a Código:

2.b Duración:

2.c Aceleración:

Ejercicio 3
3.a Nº Bloqueos: Tipo:

3.b Nº Desvíos:

3.c CPIBLOQUEOS: CPITOTAL:

También podría gustarte