¿Cómo saber qué elemento reemplaza a cuál para un caché?

0

Si asumo que el primer elemento de la matriz que se busca en el caché D es a[0][0] , para la asociatividad 4, por favor, dígame qué elemento en qué matriz escribirá sobre a[0][0] en el caché D . Dado que la fórmula para establecer asociatividad es

  

En un caché asociativo de conjuntos, se proporciona el conjunto que contiene un bloque de memoria   por (Número de bloque) módulo (Número de conjuntos en el caché)

¿Cómo puedo saber de este código, compilado y ejecutado como ensamblaje MIPS en un MIPS? simulador , ¿qué elemento escribirá sobre a[0][0] ?

/* matris.c */
#include <stdio.h>
#include <idt_entrypt.h>

#define MATRIXSIZE 16
#define MATRIXSIZE_ROWS 16
#define MATRIXSIZE_COLS 16

/*
 * addera two matriser
 */
void matrisadd( int res[MATRIXSIZE_ROWS][MATRIXSIZE_COLS],
                int   a[MATRIXSIZE_ROWS][MATRIXSIZE_COLS],
                int   b[MATRIXSIZE_ROWS][MATRIXSIZE_COLS] )
{
  int i,j;

  for(i=0; i < MATRIXSIZE; ++i) /* variera rad-index */
    for(j=0; j < MATRIXSIZE; ++j) /* variera kolumn-index */
      res[i][j] = a[i][j] + b[i][j];
}

int main()
{
  static int   a[MATRIXSIZE_ROWS][MATRIXSIZE_COLS];
  static int   b[MATRIXSIZE_ROWS][MATRIXSIZE_COLS];
  static int res[MATRIXSIZE_ROWS][MATRIXSIZE_COLS];
  int i,j, Time;

  /*
   * initiera matris a och b
   */
  for( i=0; i<MATRIXSIZE; ++i)
    for( j=0; j<MATRIXSIZE; ++j)
    {
      a[i][j] = i+j;
      b[i][j] = i-j;
    }

  flush_cache();              /* toem cachen */
  timer_start();              /* nollstall tidmatning */

  matrisadd( res, a, b);

  Time = timer_stop();                /* las av tiden */
  printf("Time: %d\n",Time);
}
    

1 respuesta

1

Creo que ANSI C dicta que los arreglos multidimensionales se asignan a la memoria en orden de fila mayor. Eso significa que los elementos en una fila son contiguos en la memoria, es decir, un [0] [0] es adyacente a un [0] [1] en la memoria.

La forma en que funcionan las memorias caché asociativas es que algunos de los bits de dirección le indican en qué línea de la memoria caché está activado el elemento, y otros bits de la dirección le indican en qué conjunto se encuentra el elemento. Usted necesita saber la línea. ancho para saber cuántos bytes hay en una línea, y necesitas saber cuántas líneas contiene cada conjunto.

Digamos que no tenías un caché asociativo (es decir, tenías asociatividad = 1). Digamos también que tenías 32 bytes por línea y 16 líneas. Entonces su tamaño total de caché sería 16 * 32 = 512 bytes. Si su a [0] [0] se asignó a la memoria de modo que estuviera en un límite de línea de caché (es decir, su dirección era divisible por 32), entonces la línea que traería contendría un [0] [0] a través de un [ 0] [31] asumiendo que la cardinalidad de la segunda dimensión fue tan grande. Si, por otra parte, la cardinalidad de la segunda dimensión era, por ejemplo, 16, la fila a [0] [0] contendría un [0] [0] ... a [0] [15], un [1] [0 ] ... a [1] [15]. Y así.

Sin embargo, su matriz es dimensional, después de 512 bytes, usted estará lleno y el desplazamiento de 513º byte de [0] [0] eliminará la fila que contiene a [0] [0]. A menos que su caché sea asociativa. En ese caso, su 513ª entrada entrará en el siguiente conjunto, y eso seguirá sucediendo en la medida en que su caché sea asociativa. Solo después de agotar los sets volverás a enrollarte y soplarás un [0] [0]. Ahora, obviamente, para el mismo tamaño de caché, el aumento de la asociatividad reducirá efectivamente el número de líneas por conjunto. Así que el patrón de acceso determina si es útil o no. El kilometraje puede variar.

    
respondido por el vicatcu

Lea otras preguntas en las etiquetas