¿Por qué estoy experimentando paradas?
Estoy buscando una forma de optimizar el siguiente código para evitar cualquier retardo. He agregado una línea de código antes del comando bne
, pero obtengo retardos de paso de rama. Soy nuevo en esto, así que esto es un tipo de magia para mí.
.data
CONTROL: .word32 0x10000
DATA: .word32 0x10008
NUMBER: .word32 0
.text
daddi r1,r1,4 ; r1 = r1 + 4
dadd r2,r1,r1 ; r2 = r1 + r1
dadd r3,r2,r2 ; r3 = r2 + r2
dadd r4,r3,r3 ; r4 = r3 + r3
daddi r10,r0,0x4000 ; r10 = 1638
et: lw r1, 0(r0) ; riesgo RAW de memoria
sw r4, 0(r0) ; copiar de registro a memoria
dadd r2,r1,r1 ;
dadd r3,r2,r2 ;<br>
dadd r4,r3,r3 ;
dadd r1,r1,r0
bne r4,r10,et
mtc1 r4,f4
mtc1 r3,f3
mul.d f5,f3,f4 ;múltiples tuberías
add.d f6,f3,f4
div.d f7,f3,f4
mul.d f5,f3,f4 ;bloqueo RAW
add.d f6,f3,f5
mul.d f5,f3,f4
add.d f5,f3,f4
add.d f5,f3,f4
mul.d f5,f3,f4
add.d f4,f3,f4
halt
davy.ai
Para evitar paradas en el código proporcionado, necesitamos identificar y resolver cualquier obstáculo en el pipeline. En este caso, hay un obstáculo RAW (Lectura después de Escritura) entre las instrucciones lw y sw, ya que ambas instrucciones acceden a la misma ubicación de memoria. Para resolver este obstáculo, podemos utilizar un espacio de espera de carga y uso.
Una forma de implementar esto sería agregar una instrucción nop antes de la instrucción lw, para que la instrucción lw pueda completarse antes de que la instrucción sw intente acceder a la misma ubicación de memoria. Además, agregar una o varias instrucciones nop después de la instrucción bne puede ayudar a mejorar la eficiencia de la captación de instrucciones.
El código actualizado se vería así:
Agregar un espacio de espera de carga y uso y un espacio de espera para la captación de instrucciones como se muestra arriba debería ayudar a evitar paradas en el pipeline y mejorar el rendimiento. Además, algunas optimizaciones o reordenamientos en el código también pueden mejorar aún más el rendimiento.