Tengo curiosidad sobre el comportamiento del caché. Aquí hay algunas preguntas relacionadas con el caché a continuación:
¿La operación de escritura trae los datos al caché? Teniendo en cuenta una asignación como A[i] = B[i], ¿se cargará A[i] en el caché? Dado que solo escribo algo en A[i] en lugar de leer su valor.
Al asignar una gran cantidad de memoria, la memoria puede provenir del sistema operativo. Y el sistema operativo inicializará los datos a cero por razones de seguridad ( Referencia ). Si las asignaciones traerán datos a la memoria caché (pregunta 1), ¿este mecanismo ocupará la memoria caché?
Suponga que hay una matriz B asignada y que la B completa está ahora en la memoria caché. ¿Las líneas de caché ocupadas por B dejarán de ser válidas (disponibles) justo después de liberar la matriz B?
¿Alguien podría darme una pista?
Desde aquí https://people.freebsd.org/~lstewart/articles/cpumemory.pdf
--
- ¿La operación de escritura trae los datos al caché?
Del artículo:
De forma predeterminada, todos los datos leídos o escritos por los núcleos de la CPU se almacenan en la memoria caché. Hay regiones de memoria que no se pueden almacenar en caché, pero esto es algo que solo debe preocupar a los implementadores del sistema operativo; no es visible para el programador de la aplicación. También hay instrucciones que permiten al programador omitir deliberadamente ciertos cachés. Esto se discutirá en la sección 6.
--
- Al asignar una gran cantidad de memoria, la memoria puede provenir del sistema operativo. ¿Este mecanismo ocupará el caché?
Posiblemente no. Ocupará el caché solo después de leer o escribir datos. Del artículo:
En sistemas operativos como Linux con soporte de paginación bajo demanda, una llamada de mmap solo modifica las tablas de páginas... No se asigna memoria real en el momento de la llamada de mmap.
La parte de asignación ocurre cuando se accede por primera vez a una página de memoria, ya sea leyendo o escribiendo datos, o ejecutando código. En respuesta a la falla de página resultante, el núcleo toma el control y determina, utilizando el árbol de la tabla de páginas, los datos que deben estar presentes en la página. Esta resolución de la falla de la página no es barata, pero ocurre para cada página que utiliza un proceso.
--
3. Suponga que hay una matriz B asignada y que la B completa está ahora en la memoria caché. ¿Las líneas de caché ocupadas por B dejarán de ser válidas (disponibles) justo después de liberar la matriz B?
del artículo, la invalidación de una línea de caché ocurre solo cuando ha habido una operación de escritura en otra CPU
Lo que se desarrolló a lo largo de los años es el protocolo de coherencia de caché MESI (Modificado, Exclusivo, Compartido, Inválido). El protocolo lleva el nombre de los cuatro estados en los que puede estar una línea de caché cuando se utiliza el protocolo MESI. ... Si el segundo procesador quiere escribir en la línea de caché, el primer procesador envía el contenido de la línea de caché y marca la línea de caché localmente como no válida.
Y también se puede desalojar la línea de caché:
Otro detalle de los cachés que no es interesante para los programadores es la estrategia de reemplazo de caché. La mayoría de las memorias caché desalojan primero el elemento LRU (menos utilizado recientemente).
Y desde mi experiencia con TCMalloc free() no es una razón convincente para desalojar la memoria de un caché. Por el contrario, podría ser perjudicial para el rendimiento. En free() , TCMalloc simplemente coloca un bloque de memoria liberado en su caché. Y este bloque de memoria será devuelto por malloc() cuando una aplicación solicite un bloque de memoria la próxima vez. Esa es la esencia de un asignador de almacenamiento en caché como TCMalloc. Y si este bloque de memoria todavía está en caché, ¡entonces es aún mejor para el rendimiento!
Este es un artículo interesante donde encontrarás más información (probablemente demasiada) sobre lo que estás preguntando:
Lo que todo programador debe saber sobre la memoria
Con respecto a su pregunta, todas las operaciones que realice en la memoria se almacenarán en caché. Como programador, no tienes ningún control al respecto (y ni siquiera el sistema operativo). Tenga en cuenta que si necesita implementar un algoritmo que consume espacio (memoria), intente aumentar la localidad de la memoria.
Entonces, suponiendo que tiene que lidiar con 1 GB de datos, intente dividir el cálculo en grupos (secciones de datos) e intente realizar todas las operaciones una sección a la vez. De esta manera, realmente usará datos del caché y no necesitará acceder a la memoria externa cada vez. Esto puede darle un impulso de rendimiento.
Para responder a la pregunta del título, no. Estas operaciones no invalidan los cachés, y de manera bastante intencionada. ¿Qué sucede con la memoria liberada? Hay dos casos importantes. Uno, la memoria se recicla inmediatamente para la próxima asignación de sus programas. Tener la dirección aún en caché es eficiente en este caso, ya que reduce la cantidad de escrituras en la memoria principal.
Pero incluso si la memoria no se reutiliza directamente, el asignador de memoria puede fusionar bloques libres en segundo plano o realizar otras operaciones. Esto a menudo implica escribir en el espacio asignado anteriormente por sus datos. Después de todo, liberar memoria no destruye físicamente la memoria. Simplemente establece el propietario. Después de delete , la propiedad se transfiere de su programa al tiempo de ejecución o al sistema operativo.