sirve - ¿Cómo funciona la memoria caché?
si borro la memoria cache se borran mis fotos (5)
Es así porque crea cachés como localidad. La misma cantidad de memoria a la que se accede, pero espaciada aún más, afectará a diferentes "líneas" de caché, o incluso podría perder la memoria caché por completo. Por lo tanto, es bueno, siempre que tenga la opción, organizar los datos para que los accesos que probablemente se suceden a tiempo, también lo hagan en el espacio. Esto aumenta las posibilidades de que se produzca un golpe de caché y le proporciona más rendimiento.
Por supuesto, hay una gran cantidad de información disponible sobre este tema, consulte, por ejemplo, esta entrada de wikipedia en la localidad de referencia . O, supongo, tu propio libro de texto del curso. :)
Hoy cuando estaba en la clase de organización de computadoras, la maestra habló sobre algo interesante para mí. Cuando se trata de hablar sobre Por qué funciona la memoria caché, dijo que:
for (i=0; i<M; i++)
for(j=0; j<N; j++)
X[i][j] = X[i][j] + K; //X is double(8 bytes)
no es bueno cambiar la primera línea con la segunda. ¿Cuál es tu opinión sobre esto? ¿Y por qué es así?
Hay un muy buen artículo de Ulrich Drepper de Red Hat y glibc fame, Lo que todo programador debería saber sobre la memoria . Una sección discutió los caches en gran detalle. Por ejemplo, hay efectos de caché en los sistemas SMP donde las CPU pueden terminar arrasando la propiedad de una línea de memoria caché modificada, perjudicando enormemente el rendimiento.
La memoria caché es una memoria muy rápida y muy cara que se encuentra cerca de la CPU. En lugar de buscar una pequeña porción de datos de la RAM cada vez, la CPU obtiene un fragmento de datos y los almacena en la caché. La apuesta es que si solo lee un byte, entonces es probable que el siguiente byte que lea sea el correcto. Si este es el caso, entonces puede provenir del caché.
Al diseñar su bucle tal como lo tiene, lee los bytes en el orden en que están almacenados en la memoria. Esto significa que están en la memoria caché y la CPU puede leerlos muy rápidamente. Si cambia las líneas 1 y 2, entonces leería cada "N" bytes cada vez en el ciclo. Los bytes que está leyendo ya no son consecutivos en la memoria, por lo que es posible que no estén en la memoria caché. La CPU tiene que buscarlos desde la RAM (más lenta) y, por lo tanto, su rendimiento disminuye.
Localidad de referencia. Como los datos se almacenan por filas, para cada fila, las j columnas están en direcciones de memoria adyacentes. El SO generalmente cargará una página completa de la memoria en el caché y las referencias de direcciones adyacentes probablemente se referirán a esa misma página. Si aumenta por el índice de fila en el bucle interno, es posible que estas filas estén en páginas diferentes (ya que están separadas por j dobles cada una) y la memoria caché puede tener que traer y eliminar constantemente las páginas de memoria a medida que hace referencia. los datos. Esto se llama golpeteo y es malo para el rendimiento.
En la práctica y con cachés más grandes y modernos, los tamaños de las filas / columnas tendrían que ser razonablemente grandes antes de que esto entrara en juego, pero sigue siendo una buena práctica.
[EDITAR] La respuesta anterior es específica de C y puede diferir para otros idiomas. El único que sé que es diferente es FORTRAN. FORTRAN almacena cosas en orden mayor de columna (la anterior es la fila principal) y sería correcto cambiar el orden de las declaraciones en FORTRAN. Si desea / necesita eficiencia, es importante saber cómo su lenguaje implementa el almacenamiento de datos.
En C, las matrices n-dimensionales son principales de fila, lo que significa que el último índice en la matriz representa espacios adyacentes en la memoria. Esto es diferente de algunos otros lenguajes, FORTRAN por ejemplo, que son columnas principales. En FORTRAN, es más eficiente iterar a través de una matriz 2D como esta:
do jj = 1,N
do ii = 1,M
x(ii,jj) = x(ii,jj) + K;
enddo
enddo