Documentos de Académico
Documentos de Profesional
Documentos de Cultura
B: .word 20,21,22,23,24,25,26,27,28,29
else
dsub R6,R1,R19 Resta del contenido de registros. R1 – R19 y lo
almacena en R6
fin:
halt ACABA
b)
Necesita un total de 253 ciclos si ejecutamos el código sin ninguna optimización
Instrucción Descripción
B: .word 20,21,22,23,24,25,26,27,28,29
bucle:
else:
c)
Necesita un total de 159 ciclos si ejecutamos el código con adelantamiento activados
Todas las instrucciones anteriores al fragmento encabezado por la etiqueta bucle se ejecutan
correctamente y sin variación respecto a la ejecución sin adelantamientos
Instrucción Descripción
daddi R1,R1,8 No sufre cambios
daddi R4,R4,1 No sufre cambios
slt R3,R1,R5 Se elimina una parada en la etapa ID ya
que se produce un adelantamiento de
R1 desde la primera instrucción hasta la
tercera.
beq R3,R0,else Se elimina una parada por riesgo
estructural, ya que, con el
adelantamiento producido en la
instrucción anterior, ya no hay riesgo de
coincidencia en la etapa ID. Además, se
produce un adelantamiento de R3 de la
instrucción anterior, de modo que en la
etapa ID evitamos dos paradas.
ld R10,A(R1) Nos encontramos con una instrucción
interrumpida, sin embargo, notamos la
diferencia respecto a la ejecución sin
adelantamiento porque en la
instrucción anterior hay una parada
menos en ID, de modo que la siguiente
instrucción se inicia un ciclo antes
dsub R6,R1,R19 No hay cambios
ld R10,A(R6) Se adelanta R6 desde la instrucción
anterior de EX a EX evitando dos
paradas por riesgo de datos
dsub R11,R10,R18 Al haber evitado las dos paradas
nombradas en la instrucción séptima,
prescindimos ahora de dos paradas por
riesgo estructurales (esto se produce
desde esta instrucción hasta la número
10), además se produce una
adelantamiento de R10 desde memoria
a EX(raw)
sd R11,A(R1) Se produce una parada estructural a fin
de no coincidir dos etapas EX y se
produce un adelantamiento desde EX
de la resta anterior hasta EX de esta.
bne R1,R20,bucle En lugar de desaparecer las dos
repetidas estas últimas instrucciones,
solo se elimina una por riesgo
estructural
ld R10,A(R0) Instrucción abortada
Vuelta a comenzar el bucle, no saldrá
de este hasta la ejecución de la
instrucción dadddi R11, R10, 5
dadddi R11, R10, 5 Se produce una parada en EX para
conseguir un adelantamiento de la
instrucción anterior de R10 desde
memoria hasta el propio EX
sd R11,A(R0) Se prescinde de dos paradas
estructurales debido a la variación
ocasionada por el adelantamiento
anterior, aunque se mantiene una
parada de un ciclo por el mismo riesgo.
También se produce adelantamiento de
R11 de Ex a Ex
sd R17,B(R0) Parada por riesgo estructural
sd R17,C(R0) No sufre cambios
halt No sufre cambios
d)
El speedup, como resultado del cociente de CPIs 1336/1188 = 1,31
.data
A: .word 10,11,12,13,14,15,16,17,18,19
B: .word 20,21,22,23,24,25,26,27,28,29
C: .word 30,31,32,33,34,35,36,37,38,39
.text
daddi R1,R0,0
daddi R4,R0,0
daddi R20,R0,72
daddi R19,R0,8
daddi R18,R0,10
daddi R17,R0,1
daddi R16,R0,2
daddi R5,R0,40
daddi R4,R4,1
slt R3,R1,R5
ld R10,A(R1)
beq R3,R0,else
daddi R11,R10,10
daddi R2,R1,8
ld R12,B(R2)
dadd R12,R12,R16
sd R11,A(R1)
dadd R12,R11,R12
dadd R13,R12,R4
sd R12,B(R1)
sd R13,C(R1)
bne R1,R20,bucle
j fin
else: ld R10,A(R6)
dsub R6,R1,R19
dsub R11,R10,R18
bne R1,R20,bucle
sd R11,A(R1)
fin: ld R10,A(R0)
sd R17,B(R0)
daddi R11,R10,5
sd R17,C(R0)
sd R11,A(R0)
halt
e)
Los casos posibles de rellenado de la ranura de salto que podemos aplicar son tres.
El primero consiste en rellenar la ranura con una instrucción anterior al salto, la segunda, con
una dirección del destino del salto y la tercera con una instrucción de la dirección de salto no
tomado.
La primera instrucción:
bne R1,R20,bucle
La segunda instrucción:
bne R1,R20,bucle
En el caso de este apartado, a diferencia de los dos siguientes, el código no tiene un sentido o
una función. Por ello, la reordenación del código es mucho más flexible. Para la primera
instrucción rellenaremos la ranura con la instrucción sd R13,C(R1), es decir, una instrucción
anterior al salto.
.data
A: .word 10,11,12,13,14,15,16,17,18,19
B: .word 20,21,22,23,24,25,26,27,28,29
C: .word 30,31,32,33,34,35,36,37,38,39
.text
daddi R1,R0,0
daddi R4,R0,0
daddi R20,R0,72
daddi R19,R0,8
daddi R18,R0,10
daddi R17,R0,1
daddi R16,R0,2
daddi R5,R0,40
daddi R4,R4,1
slt R3,R1,R5
ld R10,A(R1)
beq R3,R0,else
daddi R11,R10,10
daddi R2,R1,8
ld R12,B(R2)
dadd R12,R12,R16
sd R11,A(R1)
dadd R12,R11,R12
dadd R13,R12,R4
sd R12,B(R1)
bne R1,R20,bucle
sd R13,C(R1)
j fin
else: ld R10,A(R6)
dsub R6,R1,R19
bne R1,R20,bucle
dsub R11,R10,R18
sd R11,A(R1)
fin: ld R10,A(R0)
sd R17,B(R0)
daddi R11,R10,5
sd R17,C(R0)
sd R11,A(R0)
halt
2
a)
Instrucción Descripción
jal mul Se ejecuta correctamente
nop Es necesaria ya que de no existir, la instrucción
que se inicia automáticamente después del jal
por la predicción de salto no tomado, ejecutaría
el halt y terminaría el programa.
daddi r1,r0,64 Se ejecuta correctamente
daddi r5,r0,63 Se ejecuta correctamente
daddu r2,r0,r0 Se ejecuta correctamente
daddu r10,r0,r0 Se ejecuta correctamente
ld r3,x(r0) Se ejecuta correctamente
ld r4,y(r0) Se ejecuta correctamente
andi r9,r3,1 Se produce una parada para que este escrito el
resultado de la instrucción 7 y así poder hacer el
EX
dsub r9,r0,r9 Parada por riesgo estructural en F, y para de dos
ciclos en D para que este escrito r9
dsrl r3,r3,1 Parada por riesgo estructural en f
--- Empieza el bucle
and r6,r4,r9 Se ejecuta correctamente. (En la primera
iteración: Se produce un riesgo Raw, con el
registro R9, por tanto, una parada.)
daddu r2,r2,r6 Necesita dos paradas para que escriba R6 que
calcula en la instrucción anterior. (primera
iteración: además necesita una parada en la
etapa F por riesgo estructural)
sltu r7,r2,r6 Necesita dos paradas en la etapa F por riesgo
estructural, y dos paradas en la etapa D por
riesgo Raw con el registro R2
dsllv r7,r7,r5 Necesita dos paradas en la etapa F por riesgo
estructural, y dos paradas en la etapa D por
riesgo Raw con el registro R7
andi r10,r2,1 Necesita dos paradas en F por riesgo estructural
dsllv r10,r10,r5 Necesita dos paradas en D por riesgo RAW en el
registro R10
dsrl r2,r2,1 Dos paradas en F por riesgo estructural
or r2,r2,r7 Necesita dos paradas por riesgo Raw con el
registro R2
andi r9,r3,1 Necesita dos paradas en F por riesgo estructural.
dsub r9,r0,r9 Necesita dos paradas por riesgo RAW con el
registro R9
dsrl r3,r3,1 Necesita dos paradas por riesgo estructural en F
or r3,r3,r10 Necesita dos paradas en D por riesgo RAW con el
registro R3
daddi r1,r1,-1 Necesita dos paradas por riesgo estructural en F
bnez r1,again Necesita dos paradas en D por riesgo raw en con
el registro R1
sd r2,w(r0) Inicia la instrucción predicha por salto no
tomado y la aborta
-----------------------BUCLE---------------------- ------------------------------BUCLE--------------------------
sd r2,w(r0) (Fin de bucle). Necesita dos paradas por riesgo
estructural en F
sd r3,w+8(r0) Se ejecuta correctamente
jr r31 Se ejecuta correctamente
Aborta
nop Se ejecuta correctamente
halt Se ejecuta correctamente
b)
Si ejecutamos el código inicial con adelantamientos, desaparecen todas las paradas analizadas
en el apartado a, excepto la parada de la instrucción bnez r1,again. Por tanto, como tiene
dependencia con la instrucción inmediatamente anterior y el desplazamiento de esta no
influye en el código, la ejecutamos una instrucción antes. El total de ciclos obtenidos es 980
.data
x: .word 0xFFFFFFFFFFFFFFFF
y: .word 0xFFFFFFFFFFFFFFFF
w: .word 0,0
.text
halt
ld r3,x(r0) ; r3=x
ld r4,y(r0) ; r4=y
andi r9,r3,1 ; LSB de x
daddu r2,r2,r6
bnez r1,again
El primero consiste en rellenar la ranura con una instrucción anterior al salto, la segunda, con
una dirección del destino del salto y la tercera con una instrucción de la dirección de salto no
tomado.
De este modo, como dicha instrucción pertenece al fragmento de código encabezado por la
etiqueta a la que salta, no podemos poner la instrucción destino del salto en la ranura porque
dejaría de ser funcional. Tampoco podemos rellenar la ranura con la instrucción anterior ya
que alteraría el código. Por tanto la instrucción que rellena la ranura es la de salto no tomado
sd r2,w(r0)
Por otro lado, encontramos una instrucción jal, cuya ranura rellenaremos con la instrucción del
destino del salto. Las otras dos opciones quedan descartadas ya que, no existe una instrucción
anterior (es la primera) y la instrucción de salto no tomado es nop, la cual, como se ha
explicado antes existe con tal de que no se comience a ejecutar el halt. Es decir, no tiene
sentido dejar la instrucción nop si podemos ejecutar en su lugar una que sea necesaria para el
desarrollo del código.
.data
x: .word 0xFFFFFFFFFFFFFFFF
y: .word 0xFFFFFFFFFFFFFFFF
w: .word 0,0
.text
halt
mul: daddi r5,r0,63 ; todo 1's para shift
ld r3,x(r0) ; r3=x
ld r4,y(r0) ; r4=y
daddu r2,r2,r6
bnez r1,again
b)
Si activamos lo adelantamientos, todas las paradas producidas por los diferentes riesgos
en las instrucciones comprendidas entre a 1 y la 15 desaparecen
A continuación, si ejecutamos el código mediante Run To, muchas paradas necesarias sin
adelantamientos son resueltas, sin embargo, hay algunas que permanecen o aparecen.
beqz r3,par
de manera similar a la anterior, se encuentra al inicio del fragmento bucle, por lo que no
podemos reordenarlo, para así no alterar la toma de decisión de par o impar
Necesita de una parada en EX por resigo Raw con R4 que se le adelanta desde Mem de la
instrucción anterior. Con esta instrucción si que podemos reordenar el código, de modo
que sea la primera instrucción en ser ejecutada al iniciar el fragmento de código
encabezado por la etiqueta máximo. Esto es posible ya que las dos instrucciones que se
situaban anteriormente de dependen de la que estamos estudiando en ningún parámetro.
(sd r1,(r8) y sd r12,(r9))
; Conjetura de Collatz
.data
; Set CONTROL = 5, Set DATA+5 to x coordinate, DATA+4 to y coordinate, and DATA to RGB
colour to be output
; Set CONTROL = 8, read the DATA (either an integer or a floating-point) from the keyboard
.text
sd r1,0(r9) ; CONTROL = 8
sd r1,max(r0) ; max = r1
beqz r3,par
dadd r1,r2,r1 ; x 3
j maximo
sd r1,(r8) ; DATA = r1
sd r12,(r9) ; CONTROL = 1
beqz r3,fin
sd r1,max(r0) ; max = r1
beqz r3,bucle
ld r2,max(r0) ; r2 = max
sd r11,(r9) ; CONTROL = 4
sd r2,(r8) ; DATA = max
sd r12,(r9) ; CONTROL = 1
halt
c)
La primera instrucción de salto que encontramos es la del bloque encabezado por la
etiqueta bucle
beqz r3,par
En este caso, la ranura solo la podemos rellenar con la instrucción de salto no tomado
impar: daddu r2,r1,r1. Esto se debe a que la instrucción anterior es la que le pasa el
registro r3 a la condición del salto, por tanto, debe ejecutarse antes. Y la de rellenar la
ranura con la instrucción de la dirección del salto el código se altera.
beqz r3,fin
Para eta instrucción descartamos rellenar la ranura con una instrucción anterior ya que es
la que determina el registro que evlúa la condición de salto. Ahora, entre las otras dos
posibles, rellenar con la dirección de salto o con la de salto no tomado, la más eficiente es
el rellenado con la de la dirección de salto. slti r3,r1,2;
beqz r3,bucle
; Conjetura de Collatz
.data
; Set CONTROL = 5, Set DATA+5 to x coordinate, DATA+4 to y coordinate, and DATA to RGB
colour to be output
; Set CONTROL = 8, read the DATA (either an integer or a floating-point) from the keyboard
.text
daddi r1,$zero,8 ; r1 = 8
sd r1,0(r9) ; CONTROL = 8
sd r1,max(r0) ; max = r1
beqz r3,par
j maximo
sd r1,(r8) ; DATA = r1
sd r12,(r9) ; CONTROL = 1
beqz r3,fin
sd r1,max(r0) ; max = r1
fin: beqz r3,bucle
ld r2,max(r0) ; r2 = max
sd r11,(r9) ; CONTROL = 4
sd r12,(r9) ; CONTROL = 1
halt