¿Es correcto el cálculo de la tasa de aciertos de mi caché?

1

Estudio memorias caché. Se supone que debo calcular la tasa de aciertos de datos para una llamada de función con un caché de datos asignados directos de 1024 bytes y un tamaño de bloque de 16 bytes.

sum(0x55aa1000,10);

La función está en el ensamblaje de MIPS 32

sum:
    xor $v0, $v0, $v0

loop:
    lb $t0, 0($a0)
    add $v0, $v0, $t0
    addi $a0, $a0, 1
    addi $a1, $a1, -1
    bne $a1, $zero, loop
    jr $ra

Mi intento de solución:

El campo establecido es de 7 bits porque 1024/16 = 128 = 2 ^ 7 y el campo de compensación de bytes es de 4 bits porque el tamaño del bloque es 16. Por lo tanto, el campo de etiqueta es 32-7-4 = 21 bits. Las etiquetas son las mismas para todos los accesos de datos (?)

Dado que el bucle incrementa el desplazamiento de los datos en 1 byte y disminuye el contador en 1, se ejecutará 10 veces, la primera vez será una falta y el resto será un éxito porque está dentro del mismo bloque.

Por lo tanto, la tasa de aciertos será del 90%.

¿Mi solución es correcta?

    

1 respuesta

2

No he tocado MIPS en años, por lo que este código es críptico como diablos. Creo que entiendo lo que está haciendo, pero corríjame si me equivoco.

Tampoco creo que esta primera línea sea en realidad mips aquí, por lo que es aún más confuso.

sum(0x55aa1000,10);

Desde esta dirección, 0x55aa1000 se envía a $ a0 y 10 a $ a1?

sum:
    xor $v0, $v0, $v0     # Xor with itself makes $v0=0

loop:
    lb $t0, 0($a0)        # Load addr 0x55aa1000 into $t0 load. Then that addr+1 each loop. 
    add $v0, $v0, $t0     # $v0 stores the sum of the bytes.
    addi $a0, $a0, 1      # Increment the offset by one.
    addi $a1, $a1, -1     # Decrement the counter ($a1) by one.
    bne $a1, $zero, loop  # Keep looping until the counter is zero.
    jr $ra                # return to the return address prior to the function call.

Si la directiva para enviar esos dos valores a $ a0 y $ a1 es correcta, entonces creo que su análisis también es correcto. Ha introducido una línea de caché (también conocido como bloque) en el caché en la primera ejecución y no tiene que cargar nada más en el caché después, ya que no está superando el tamaño de bloque de 16 bytes y está tirando del mismo bloque . La tasa de aciertos del 90% en este caso parece correcta. Sería mucho más interesante si $ a1 se cargara con un valor mayor. En ese caso, tendería hacia el mejor caso de 93.75% de tasa de aciertos para esta función.

    
respondido por el horta

Lea otras preguntas en las etiquetas