Taller Mips

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 8

Institución Universitaria Politécnico Grancolombiano

Taller MIPS

Orlando Alcala Vargas


Cod: 1820010544

Arquitectura de Computadores

Primer Semestre. 2021

Gabriel Eduardo Ávila Buitrago

Bogotá D.C, 10 de marzo de 2021


Ley de Amdahl

1. Un programa emplea 60% de su tiempo de ejecución realizando aritmética de


punto flotante. De las operaciones de punto flotante en este programa, 90% se
ejecutan en ciclos paralelizables.

a) Encuentre la mejora en tiempo de ejecución si el hardware de punto flotante se


hace el doble de rápido.

b) Encuentre la mejora en tiempo de ejecución si se usan dos procesadores para correr


los ciclos paralelizables del programa el doble de rápido.

c) Encuentre la mejora en el tiempo de ejecución que resulta de modificaciones tanto


en a) como en b).

SOLUCION

a) 60% Tiempo Ejecución

𝑇𝑖𝑒𝑚𝑝𝑜𝐸 𝑛𝑢𝑒𝑣𝑜 = 𝑇𝑖𝑒𝑚𝑝𝑜𝐸 𝑎𝑛𝑡𝑖𝑔𝑢𝑜 ∗ ((1 − 𝑓𝑟𝑎𝑐𝑐𝑖𝑜𝑛) + 𝑓𝑟𝑎𝑐𝑐𝑖𝑜𝑛 𝑚𝑒𝑗𝑜𝑟𝑎𝑑𝑎)


𝑇𝑖𝑒𝑚𝑝𝑜𝐸 𝑛𝑢𝑒𝑣𝑜 = 𝑇𝑖𝑒𝑚𝑝𝑜𝐸 𝑎𝑛𝑡𝑖𝑔𝑢𝑜 ∗ ((1 − 0.6) + 0.4)
𝑇𝑖𝑒𝑚𝑝𝑜𝐸 𝑛𝑢𝑒𝑣𝑜 = 𝑇𝑖𝑒𝑚𝑝𝑜𝐸 𝑎𝑛𝑡𝑖𝑔𝑢𝑜 ∗ (0.8) = 8

b) Tiempo Antiguo = 8
Flotante M = 90%
A.M = 2
0.6
𝑇𝑖𝑒𝑚𝑝𝑜 𝑛 = 𝑇𝑖𝑒𝑚𝑝𝑜 𝑎 ∗ ((1 − 0.6) + )
2
𝑇𝑖𝑒𝑚𝑝𝑜 𝑛 = 8 ∗ (0.4 + 0.3) = 5.6 𝑆

c)

0.6
𝑇𝑖𝑒𝑚𝑝𝑜 𝑛 = 𝑇𝑖𝑒𝑚𝑝𝑜 𝑎 ∗ ((1 − 0.6) + )
4
𝑇𝑖𝑒𝑚𝑝𝑜 𝑛 = 8 ∗ (0.4 + 0.15) = 4.4 𝑆

𝑇𝑖𝑒𝑚𝑝𝑜 𝑛 = 𝑇𝑖𝑒𝑚𝑝𝑜 𝑎 ∗ ((1 − 0.4) + 0.6) = 1.2 𝑆


2. Suponga que, con base en cuentas de operación (no hay gasto de tiempo en ellas),
una aplicación numérica usa 20% de operaciones de punto flotante y 80% de
operaciones integer/control (entero/control). El tiempo de ejecución de una operación
de punto flotante es, en promedio, tres veces más larga que otras operaciones.
Se considera un rediseño de la unidad de punto flotante para hacerla más rápida.

a) ¿Qué factor de aceleración para la unidad de punto flotante conduciría a 25% de


mejora global en rapidez?

b) ¿Cuál es la máxima aceleración posible que se puede lograr al modificar sólo la


unidad de punto flotante?

SOLUCION

20% = 0.2
80% = 0.8
t = 3 veces más largo

a)

𝑇𝑖𝑒𝑚𝑝𝑜 𝑛 = 𝑇𝑖𝑒𝑚𝑝𝑜 𝑎 ∗ ((1 − 0.2) + 0.8) = 1.6 𝑆


0.8
𝑇𝑖𝑒𝑚𝑝𝑜 𝑛 = 𝑇𝑖𝑒𝑚𝑝𝑜 𝑎 ∗ ((1 − 0.2) + )
0.25
𝑇𝑖𝑒𝑚𝑝𝑜 𝑛 = 1.6 ∗ (0.8 + 3.2) = 6.4 𝑆

b)

𝑇𝑖𝑒𝑚𝑝𝑜 𝑛 = 𝑇𝑖𝑒𝑚𝑝𝑜 𝑎 ∗ ((1 − 0.7) + 0.3) = 0.6 𝑆


Set de Instrucciones MIPS

3. Para los siguientes fragmentos de código, realice la simulación respectiva en


lenguaje ensamblador (asuma los registros a usar):

int a = 5; int a = A[0];


int b = 8; int b = A[1];
int c = a + b + 10; int c = a + b;

int a = 8; int a = 3;
for(int i=0; i<a; i++) { int b = 2;
D[i] = a+i; for(int i=0; i<a; i++) {
} for(j=0; j<b; j++) {
D[i+j] = i+j+a+b;
}
}

Asuma que la variable a está en $s0 y la Asuma que la variable a está en $s0 y la
b en $s1, realice el siguiente código. b en $s1, realice el siguiente código.

if(a < 2){ switch(a)


b = 5; {
} case 0: b = 0; break;
else if(a > 2){ case 1: b = 5; break;
b = 10; default: b = 10; break;
} }
else{
b = 15;
}
SOLUCION
.data
numero1: .asciiz "coloca el primer nuemro \n"
numero2: .asciiz "coloca el primer nuemro \n"
resultado: .asciiz "el resultado es = "
.text
li $v0,4
la $a0,numero1
syscall
li $v0,5
syscall
move $s0,$v0
li $v0,4
la $a0,numero2
syscall
li $v0,5
syscall
move $s1,$v0
add $s2, $s1,$s0
li $v0, 4
la $a0, resultado
syscall
li $v0, 1
move $a0, $s2
syscall

li $v0, 10
syscall
SOLUCION

fact: slti $t0, $a0, 2 # n<2 ?


beq $t0, $zero, else # Si n>=2, ir a else
addi $v0, $zero, 5 # devuelve 1
jr $ra
else: addi $sp, $sp, -8 # Reserva 2 palabras
# en pila (8 bytes)
sw $ra, 4($sp) # guarda ra y
sw $a0, 0($sp) # n en pila
addi $a0, $a0, -1 # a0=n-1
jal fact # factorial de n-1
lw $a0, 0($sp) # restaura n
lw $ra, 4($sp) # y ra
addi $sp, $sp, 8 # ajusta sp
mul $v0, $a0, $v0 # devuelve
jr $ra # n * fact(n-1)

4. Convierta los siguientes códigos ensamblador MIPS a código C:

addi $t1, $0, 50 addi $t0, $s6, 4


LOOP: lw $s1, 0($s0) add $t1, $s6, $0
add $s2, $s2, $s1 sw $t1, 0($t0)
lw $s1, 4($s0) lw $t0, 0($t0)
add $s2, $s2, $s1 add $s0, $t1, $t0
addi $s0, $s0, 8
subi $t1, $t1, 1
bne $t1, $0, LOOP
SOLUCION
#include <iostream>
int suma(int a, int b){
retunr a+b;
}
int main(){
int a=suma(1,2);
return 0;
}

5.1. Cuál es el código en C de las siguientes instrucciones MIPS. Asuma que las
variables f, g, h, i y j están en los registros $s0, $s1, $s2, $s3 y $s4. Asuma que la
dirección del registro A y B están en $s6 y $s7.

sll $t0, $s0, 2 # $t0 = f * 4


add $t0, $s6, $t0 # $t0 = &A[f]
sll $t1, $s1, 2 # $t1 = g * 4
add $t1, $s7, $t1 # $t1 = &B[g]
lw $s0, 0($t0) # f = A[f]
addi $t2, $t0, 4
lw $t0, 0($t2)
add $t0, $t0, $s0
sw $t0, 0($t1)

SOLUCION

#include <iostream>

int suma(int a, int b){


retunr a+b;
}

int main(){
int a=suma(1,2);
return 0;
}
5.2. ¿Es posible reducir el código anterior con menos instrucciones MIPS?

SOLUCION

No es posible debido a que aumentarían las sentencias por ejemplo al cambiar ciertas
sentencias por otras el código aumentaría de sentencias y se volvería más complejo
por lo tanto no se puede.

6. Convierta las siguientes instrucciones a código hexadecimal:

• add $t5, $s3, $t2


• slt $t2, $t5, $t1
• lw $s2, 0($s1)
• addi $t2, $0, $0
• sw $t5, 12($s2)

SOLUCION

• add $t5, $s3, $t2 = 0x026A6820


• slt $t2, $t5, $t1 = 0x01A9502A
• lw $s2, 0($s1) = 0x8e320000
• addi $t2, $0, $0 // las variables $0 deben estar acompañadas de una letra
• sw $t5, 12($s2) = 0xae4d000c

También podría gustarte