es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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
Tags:  , ,

Answer

  1. Avatar for 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í:

    .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: nop              ; espacio de espera de carga y uso
        lw r1, 0(r0)     ; 
        sw r4, 0(r0)     ; 
        dadd r2,r1,r1    ; 
        dadd r3,r2,r2    ;  
        dadd r4,r3,r3    ; 
        dadd r1,r1,r0
        bne r4,r10,et
        nop              ; espacio de espera para captación de instrucciones
        mtc1 r4,f4
        mtc1 r3,f3
        mul.d f5,f3,f4 ;múltiples pipelines
        add.d f6,f3,f4
        div.d f7,f3,f4
        mul.d f5,f3,f4 ;bloque 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
    

    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.

Comments are closed.