Está en la página 1de 7

Problema 1

Supongamos un procesador VLIW cuyas instrucciones pueden decodificar


hasta cuatro operaciones con las restricciones que se muestran en la tabla.
En dicha tabla también se incluye información de las latencias de cada una
de las unidades funcionales disponibles que se utilizan en este ejercicio.
Las operaciones se pueden decodificar de forma similar a como se harían
en un repertorio de instrucciones RISC similar al DLX. Muestre una forma
posible de ejecutar el siguiente código C.

void sum(int c[ ], int a[ ], int b[ ], int n)


{
int i;
for (i=0; i<n; i++)
c[ i ]=a[ i ]+b[ i ];
}
Nota: Suponga que el procesador dispone de 32 registros para enteros R0 – R31 de
64 bits, la dirección de inicio del código es conocida y se encuentra en el registro R31,
y la dirección que indica que se ha acabado la matriz c[ ] esta en R30. Se sugiere
desenrollar el bucle (hasta cuatro iteraciones) para tener un mayor número de
instrucciones entre saltos.
Solución:
el código realiza la suma de elementos de dos arrays, 'b' y 'c', y almacena el resultado en un
tercer array 'a'. Aquí está la explicación línea por línea:

Asumiendo n=1000
int i
for(i=0;i<1000;i++)
a[i] = b[ i ] + c[ i ];
R1 contiene la dirección base para el array ‘a’ ; Aquí se asume
que el registro R1 mantiene la dirección base del array 'a'.
R2 contiene la dirección base para el array 'b’
R3 contiene la dirección base para el array 'c’
R4=1000
Loop: ; Etiqueta que marca el inicio del bucle.
LW R5, 0(R2) ; Carga el contenido de la dirección apuntada
por R2 (elemento de 'b') en el registro R5.
LW R6, 0(R3) ; elementos de c
ADD R7, R6, R5 ; Suma el contenido de los registros R6 y R5 y almacena el resultado en el
registro R7.
SW 0(R1), R7; Almacena el contenido de R7 en la dirección apuntada por R1 (elemento de
'a').
ADDI R1, R1, #8 ; Incrementa la dirección base de 'a' en 8 bytes (asumiendo que los elementos
son de 4 bytes cada uno).
ADDI R2, R2, #8 ; Incrementa la dirección base de 'b' en 8 bytes.
ADDI R3, R3, #8
SUBI R4, R4, #1 ; decrementa la variable del bucle en 1
BNEZ R4, Loop : Salta a la etiqueta 'Loop' si el contenido de R4 no es igual a cero, es decir, si
el bucle no ha terminado.

este código realiza una operación de suma de elementos de dos arrays y


almacena el resultado en un tercer array, utilizando registros para
mantener las direcciones base de los arrays y un bucle para iterar sobre
los elementos.
código assembly MIPS, y realiza una operación similar a la
explicación anterior, con la diferencia de que carga y suma
elementos en bloques de 8 bytes (posiblemente enteros de 64
bits).
Loop:: Etiqueta que marca el inicio del bucle.
LW R5, 0(R2): Carga el contenido de la dirección apuntada por R2 (elemento de 'b') en el registro R5.
LW R6, 0(R3): Carga el contenido de la dirección apuntada por R3 (elemento de 'c') en el registro R6.
LW R8, 8(R2): Carga el contenido de la dirección apuntada por R2 más 8 bytes (siguiente elemento de 'b')
en el registro R8.
LW R9, 8(R3): Carga el contenido de la dirección apuntada por R3 más 8 bytes (siguiente elemento de 'c')
en el registro R9.
LW R11, 16(R2): Carga el contenido de la dirección apuntada por R2 más 16 bytes en el registro R11.
LW R12, 16(R3): Carga el contenido de la dirección apuntada por R3 más 16 bytes en el registro R12.
LW R14, 24(R2): Carga el contenido de la dirección apuntada por R2 más 24 bytes en el
registro R14.
LW R15, 24(R3): Carga el contenido de la dirección apuntada por R3 más 24 bytes en el
registro R15.
ADD R07, R06, R05: Suma los contenidos de R6 y R5 y almacena el resultado en R07.
ADD R10, R09, R08: Suma los contenidos de R9 y R8 y almacena el resultado en R10.
ADD R13, R12, R11: Suma los contenidos de R12 y R11 y almacena el resultado en R13.
ADD R16, R15, R14: Suma los contenidos de R15 y R14 y almacena el resultado en R16.
SW 0(R1), R07: Almacena el contenido de R07 en la dirección apuntada por R1.
SW 8(R1), R10: Almacena el contenido de R10 en la dirección apuntada por R1 más 8 bytes.
SW 16(R1), R13: Almacena el contenido de R13 en la dirección apuntada por R1 más 16
bytes.
SW 24(R1), R16: Almacena el contenido de R16 en la dirección apuntada por R1 más 24
bytes.
ADDI R1, R1, #8: Incrementa la dirección base de 'a' en 8 bytes.
ADDI R2, R2, #8: Incrementa la dirección base de 'b' en 8 bytes.
ADDI R3, R3, #8: Incrementa la dirección base de 'c' en 8 bytes.
SUBI R4, R4, #2: Decrementa el contador del bucle en 2.
BNEZ R4, Loop: Salta a la etiqueta 'Loop' si el contenido de R4 no es igual a cero, es decir,
si el bucle no ha terminado.
Para el Primer Caso:
5*1000 = 5000
Para el Segundo Caso:
8*(1000/4) = 2000
Se ha conseguido un factor de ganancia igual a 3

También podría gustarte