[P3] [Ej. 2]

[P3] [Ej. 2]

de Nicolás Peri Nu -
Número de respuestas: 7

Hay un ciclo de espera haciendo loop unrolling que no me lo puedo sacar de arriba, traté de varias maneras pero siempre uno me queda.

El código original (con las esperas)

loop:
1- LD F0, 0(R1)
2- LD F4, 0(R2)
3- espera
4- MULTD F0, F0, F4
5- espera
6- espera
7- espera
8- ADDD F2, F0, F2
9- SUBI R1, R1, 8
10- SUBI R2, R2, 8
11- BNEQZ R1, loop
12- espera


código con loop unrolling

loop:
1- LD F0, 0(R1)
2- LD F4, 0(R2)
3- LD F5, -8(R1)
4- MULTD F0, F0, F4
5- LD F6, -8(R2)
6- SUBI R1, R1, 16
7- MULTD F5, F5, F6
8- ADDD F2, F2, F0
9- SUBI R2, R2, 16
10- espera
11- BNEQZ R1, loop
12- ADDD F2, F2, F5

Alguien pudo hacer que ejecute sin esperas?

Saludos

En respuesta a Nicolás Peri Nu

Re: [P3] [Ej. 2]

de Matias Richart -

Hola. Primero que nada tu solución esta muy bien. Cuidado que al restar a R1 y R2 16, tenes que sumar 8 y no -8 en los LD.

Al final pongo una posible solución sin esperas (en realidad hay ciclos de espera pero fuera del loop) pero necesita de algunas ideas un poco mas rebuscadas.

Primero me gustaría hacer notar la diferencia con el ejercicio 1. En este caso se da una dependencia que se llama loop-carried dependence, es decir que existe una dependencia entre diferentes iteraciones del loop. El resultado de ADDD F2,F0,F2 para la iteración i se necesita que ejecute antes que el ADDD de la iteración i+1, es decir hay una dependencia en F2 entre iteraciones. Esto es un problema para el loop unrolling.

Sin embargo, si miramos mas en detalle lo que se hace es ir almacenando en F2 la suma de los resultados. Entonces podemos aprovechar esto y guardar todas las iteraciones pares en un registro y las impares en otro.

loop:

LD F0, 0(R1)

LD F6, 8(R1)

LD F4, 0(R2)

LD F8, 8(R2)

MULTD F0, F0, F4

MULTD F6, F6, F8

SUBI R1, R1, 16

SUBI R2, R2, 16

ADD F2, F0, F2

BNEQZ R1, loop

ADDD F10, F6, F10

fuera_del_loop:

ADDD F2, F10, F2

En respuesta a Matias Richart

Re: [P3] [Ej. 2]

de Nicolás Peri Nu -
En respuesta a Nicolás Peri Nu

Re: [P3] [Ej. 2]

de Jimena Rodriguez Perez -

Me quedo una duda sobre la solución de Matias. Que tendria cargado inicialmente el registro F10? Deberia de tener el valor de la primer iteración de F2, no?

 

Gracias

Saludos

Jimena

En respuesta a Matias Richart

Re: [P3] [Ej. 2]

de Usuario eliminado -

"Cuidado que al restar a R1 y R2 16, tenes que sumar 8 y no -8 en los LD", yo entiendo que está bien restar -8 en los LD, por lo menos esa fue la idea que me quedó del ejercicio 1.

Mi solución (como no sabía que se podían agregar instrucciones nuevas) me quedó parecida a la de Nicolás, pero en vez de fusionar las dos instr. SUBI R2, R2, 8 lo que hice fue dejarlos separados, de esa manera cubri todos los stall (es medio trampa porque en realidad no se gana nada)