¿Cómo afectan el tamaño de la memoria caché y el tamaño de la matriz al rendimiento de las operaciones matemáticas en una matriz?

Estoy tratando de aprender el uso de caché. Por lo que veo al hacer un programa de experimento de muestra, el tiempo necesario para la ejecución de un programa que itera a través de una matriz y realiza algunas operaciones en los elementos de repente aumenta mucho si aumento el tamaño de la matriz más allá de un valor particular. ¿Alguien puede explicarlo de manera simple? términos cómo el tamaño de la memoria caché y el tamaño de la matriz afectan el rendimiento de las operaciones matemáticas en una matriz?

preguntado el 29 de septiembre de 13 a las 22:09

Depende un poco del tipo de operaciones matemáticas que estés haciendo. ¿Puedes ser mas específico? -

1 Respuestas

Si la memoria caché no puede acumular la matriz, cualquier referencia a esos elementos no acumulados dará como resultado la falta de memoria caché. La forma en que accede a los elementos de la matriz también marca la diferencia, porque en cada falla, el procesador trae un bloque de datos a la memoria caché, pensando que estos datos podrían ser necesarios pronto, preparándose para evitar futuras fallas en la memoria caché.

Ejemplo:

Si está operando en los elementos desde ubicaciones consecutivas, se mejorará el rendimiento. Porque dependiendo del tamaño de la línea de caché, el procesador buscará un bloque de memoria en la primera falla de caché.

Por ejemplo, tome una instancia de Matrix Multiplication, lo hacemos de la siguiente manera.

Supongamos: las matrices son demasiado grandes para acumularse en caché.

 for (i = 0; i < N; i = i + 1)
      for (j = 0; j < N; j = j + 1)
          A[i*N + j] = (double) random() / SOME_NUMBER;     

 for (i = 0; i < N; i = i + 1)
   for (j = 0; j < N; j = j + 1)
       B[i*N + j] = (double) random() / SOME_NUMBER;


 for (i = 0; i < N; i = i + 1)
    for (j = 0; j < N; j = j + 1)
       for (k = 0; k < N; k = k + 1)
           C[i*N + j] = C[i*N + j] + A[i*N + k]*B[k*N + j];

Aquí, mientras multiplicamos por cada fila, seguimos accediendo a la segunda columna de la matriz. En B la primera columna se almacena en B[0],[N-1],B[2N-1]....... y así sucesivamente, que no son ubicaciones de memoria consecutivas. Por lo tanto, habrá muchas fallas de caché. Entonces, si pudiéramos moldear la solución para que tratemos con ubicaciones de memoria consecutivas y podamos tener alguna ganancia de rendimiento. En lugar de almacenar la segunda matriz en 'Forma principal de fila', podemos almacenarla en 'Forma principal de columna', es decir, en forma transpuesta. Entonces ahora todos los elementos de la columna están en ubicaciones consecutivas.

A se accederá por filas y B se accederá por columnas, por lo que tenemos todas sus 'cosas respectivas' en ubicaciones de memoria consecutivas.

Entonces, cuando el procesador experimente la primera falla, buscará un bloque de memoria y, por lo tanto, se evitarán las próximas fallas. Aquí hemos explotado el 'Localidad espacial' y por lo tanto 'Bloqueo de caché'.

Ahora, si cambiamos el código de la siguiente manera, habrá una mejora significativa en el rendimiento

Almacene B en forma transpuesta:

   B[j*N + i] = random() / SOME_NUMBER;

También tendrás que acceder a la matriz transpuesta en ese orden:

  C[i*N + j] = C[i*N + j] + A[i*N + k]*B[j*N + k];

Respondido el 29 de Septiembre de 13 a las 23:09

Gracias por la respuesta. Pero mi pregunta es ¿por qué el tiempo de ejecución aumenta repentinamente cuando se alcanza el tamaño del caché? - Inseguro

Porque después de eso, cualquier referencia de elemento no almacenado en caché es una pérdida de caché. Luego, el procesador buscará en L2 y luego en L3 (si hay caché de varios niveles) o finalmente en la memoria principal. El acceso a la memoria consume mucho tiempo (número de ciclos de CPU) en comparación con el acceso a la memoria caché. - Patada de Vallabh

Pero esto sucede para cada pérdida de caché, ¿verdad? por lo tanto, el rendimiento depende de si se utilizan o no los datos que ya están cargados en la memoria caché. No debería depender de si la memoria caché está llena o no. Entonces, ¿por qué la pérdida de la memoria caché depende del tamaño de la memoria caché? - Inseguro

Cache miss es cuando el elemento no está en el caché. Un elemento no estará en la memoria caché por estos motivos: memoria caché llena, elemento no precargado debido a la mala organización de los datos y el tamaño de la línea de la memoria caché, la falta de localidad temporal y espacial. - Patada de Vallabh

Tengo una matriz y algunas operaciones se realizan en la matriz. Tengo un caché de un solo nivel con un tamaño de 1 MB y el tamaño de la línea de caché es de 32 bytes. Luego, cada vez que se solicite un elemento de matriz que no esté actualmente en caché, se cargarán 32 bytes en caché. Cuando el caché también está lleno, sucede lo mismo, la única diferencia es que una línea de caché debe sobrescribirse. Por lo tanto, el recuento de errores de caché dependerá de estos 32 bytes (es decir, tamaño de línea de caché) únicamente. Todavía no entiendo el papel que juega el tamaño del caché. - Inseguro

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.