xeon productos procesadores procesador familia caching optimization x86 intel cpu-cache

caching - productos - ¿Cómo escriben las CPU Intel Xeon en la memoria?



procesador intel xeon e5-2630 v4 (2)

La localidad es importante incluso para DRAM en sí, incluso descontando el almacenamiento en caché. Una escritura en ráfaga de 64B bytes contiguos para una línea de caché sucia es mucho más rápida que 16 escrituras de 4B a 16 direcciones diferentes. O para decirlo de otra manera, escribir una línea de caché completa no es mucho más lento que escribir solo unos pocos bytes modificados en una línea de caché.

Lo que todo programador debería saber sobre la memoria , de Ulrich Drepper, explica muchas cosas sobre cómo evitar los cuellos de botella de la memoria cuando se programa. Él incluye algunos detalles del direccionamiento DRAM. Los controladores DRAM deben seleccionar una fila y luego seleccionar una columna. El acceso a otra página de memoria virtual también puede causar una falla TLB.

DRAM tiene un comando de transferencia de ráfaga para transferir un fragmento secuencial de datos. (Obviamente diseñado para el beneficio de las CPU que escriben líneas de caché). El sistema de memoria en las computadoras modernas está optimizado para el patrón de uso de escribir líneas de caché completas, porque eso es lo que casi siempre sucede.

Las líneas de caché son la unidad en la que las CPU siguen sucias o no. Sería posible rastrear la suciedad con un tamaño de línea más pequeño que las líneas de caché presentes o no, pero eso requeriría transistores adicionales y no vale la pena. Los múltiples niveles de caché están configurados para transferir líneas de caché completas, por lo que pueden ser lo más rápido posible cuando se debe leer una línea de caché completa.

Existen las denominadas lecturas / escrituras no temporales ( movnti/movntdqa ) que omiten la caché. Estos son para uso con datos que no se volverán a tocar hasta que se hayan desalojado de la memoria caché de todos modos (de ahí que no sean temporales). Son una mala idea para los datos que podrían beneficiarse del almacenamiento en caché, pero le permitirían escribir 4 bytes en la memoria, en lugar de una línea de caché completa. Dependiendo del MTRR para ese rango de memoria, la escritura puede o no estar sujeta a la combinación de escritura. (Esto es relevante para regiones de E / S mapeadas en memoria, donde dos escrituras 4B adyacentes no son lo mismo que una escritura 8B).

El algoritmo que solo toca dos líneas de caché ciertamente tiene la ventaja en ese puntaje, a menos que se requiera mucho más cálculo, o especialmente bifurcación, para descubrir qué memoria escribir. Tal vez haga una pregunta diferente si quiere ayuda para decidir. (Vea los enlaces en https://stackoverflow.com/tags/x86/info , especialmente las guías de Agner Fog, para obtener información que lo ayudará a decidir por sí mismo).

Consulte la respuesta de Cornstalks para advertencias sobre los peligros de tener múltiples hilos en diferentes CPU tocando el mismo recuerdo. Esto puede conducir a una desaceleración más grande que las escrituras extra para un programa de un solo subproceso.

Estoy tratando de decidir entre dos algoritmos. Uno escribe 8 bytes (dos palabras alineadas de 4 bytes) en 2 líneas de caché, el otro escribe 3 líneas de caché completas.

Si la CPU solo escribe los 8 bytes modificados en la memoria, entonces el primer algoritmo usa mucho menos ancho de banda de memoria: 8 bytes frente a 192 bytes. Si la CPU escribe líneas de caché completas, la diferencia entre 128 y 192 bytes es menos llamativa.

Entonces, ¿cómo escribe una CPU Intel Xeon en la memoria? Te sorprendería lo difícil que es encontrar una respuesta en Google a algo que debería ser conocido.

Según lo entiendo, las escrituras van al buffer de la tienda, y luego a la caché. Es posible que solo se escriban en la memoria cuando la línea de caché sucia se expulsa de la memoria caché, pero ¿Intel rastrea qué partes de la línea de caché están sucias o simplemente lo vuelca todo? Prefiero dudar de que sigan las cosas por debajo de la granularidad de la línea de caché. También me sorprendería mucho si algo va a la memoria antes de que la línea de caché sea desalojada.


Para que la CPU vuelva a escribir solo los bytes sucios en la memoria, necesitaría almacenar un bit sucio por cada byte en la caché. Eso no es factible y no se hace en las CPU modernas (hasta donde yo sé). Las CPU solo tienen un bit sucio para una línea de caché. Escribir en cualquier byte en la línea de caché hace que toda la línea se marque como sucia.

Cuando llega el momento de purgar la línea de caché sucia, se debe escribir toda la línea, porque la CPU no tiene idea de qué byte (s) cambió.

Esto se puede ver en las políticas de invalidación de caché en las que escribir en una línea de caché en un núcleo puede invalidar la línea de caché en un núcleo diferente (porque las dos líneas de caché se asignan a la misma dirección), incluso si el primer núcleo usa lo la mitad de la línea de caché y el segundo núcleo está utilizando la mitad superior de la línea de caché. Es decir, si el núcleo 1 escribe en byte N, y el núcleo 2 usa byte N + 1, entonces el núcleo 2 aún tiene que actualizar su línea de caché aunque usted y yo sepamos que no es necesario.