x86 intel amd cpu-architecture cpu-cache

x86 - ¿Qué técnica de mapeo de caché se usa en el procesador Intel Core i7?



amd cpu-architecture (1)

Las memorias caché asignadas directamente no se utilizan básicamente en las CPU modernas de alto rendimiento . El ahorro de energía se ve superado por la gran ventaja en la tasa de aciertos para una caché asociativa de conjuntos del mismo tamaño, con solo un poco más de complejidad en la lógica de control. Los presupuestos de transistores son muy grandes en estos días.

Es muy común que el software tenga al menos un par de matrices que son un múltiplo de 4k entre sí, lo que crearía fallas de conflicto en una memoria caché asignada directamente. (El código de ajuste con más de un par de matrices puede implicar sesgarlas para reducir las omisiones de conflictos, si un bucle necesita recorrerlas todas a la vez)

Las CPU modernas son tan rápidas que la latencia DRAM es superior a 200 ciclos de reloj de núcleo, lo que es demasiado grande incluso para poderosas CPU de ejecución fuera de orden para esconderse muy bien en una memoria caché perdida.

Los cachés de varios niveles son esenciales (y se usan en todas las CPU de alto rendimiento) para proporcionar la baja latencia (~ 4 ciclos) / alto rendimiento para los datos más actuales (por ejemplo, hasta 2 cargas y 1 tienda por reloj , con 128, 256 o incluso una ruta de 512 bits entre la memoria caché L1D y las unidades de ejecución de carga / almacenamiento de vectores), mientras sigue siendo lo suficientemente grande como para almacenar en caché un conjunto de trabajo de tamaño razonable. Es físicamente imposible construir un caché muy grande / muy rápido / altamente asociativo que funcione tan bien como los cachés de varios niveles actuales para cargas de trabajo típicas; Los retrasos en la velocidad de la luz cuando los datos tienen que viajar físicamente lejos son un problema. El costo de la energía también sería prohibitivo. (De hecho, la potencia / densidad de potencia es un factor limitante importante para las CPU modernas, consulte Microprocesadores modernos: ¡una guía de 90 minutos! ).

Todos los niveles de caché (excepto el caché uop) están indexados físicamente / etiquetados físicamente en todas las CPU x86 que conozco. Los cachés L1D en la mayoría de los diseños toman sus bits de índice debajo del desplazamiento de la página, y por lo tanto también son VIPT permitiendo que la búsqueda de TLB ocurra en paralelo con la búsqueda de etiquetas, pero sin ningún problema de alias. Por lo tanto, los cachés no necesitan ser vaciados en cambios de contexto ni nada. (Consulte esta respuesta para obtener más información sobre los cachés de varios niveles en general y el truco de velocidad VIPT, y algunos parámetros de caché de algunas CPU x86 reales).

Los cachés privados (por núcleo) L1D / L1I y L2 son cachés asociativos de conjuntos tradicionales , a menudo de 8 o 4 vías para los cachés pequeños / rápidos. El tamaño de la línea de caché es de 64 bytes en todas las CPU x86 modernas. Las cachés de datos son reescritas. (Excepto en la familia AMD Bulldozer, donde L1D es de escritura directa con un pequeño búfer de combinación de escritura de 4 KB).

http://www.7-cpu.com/ tiene buenos números de organización / latencia de caché y ancho de banda, y números de organización / rendimiento TLB, para varias microarquitecturas, incluidas muchas x86, como Haswell .

La memoria caché decodificada "L0" en la familia Intel Sandybridge es asociativa de conjuntos y se aborda prácticamente . Hasta 3 bloques de hasta 6 uops pueden almacenar en caché los resultados de decodificación de las instrucciones en un bloque de 32 bytes de código de máquina. Relacionado: Alineación de ramificaciones para bucles que implican instrucciones microcodificadas en las CPU de la familia Intel SnB . (Un caché uop es un gran avance para x86: las instrucciones x86 son de longitud variable y difíciles de decodificar rápidamente / en paralelo, por lo que el almacenamiento en caché de los resultados de la decodificación interna y del código de máquina (L1I $) tiene ventajas significativas de potencia y rendimiento. todavía se necesitan decodificadores, porque el caché de uop no es grande; es más efectivo en bucles (incluidos bucles medianos a grandes). Esto evita el error Pentium4 (o la limitación basada en el tamaño del transitor en ese momento) de tener decodificadores débiles y confiar en el caché de seguimiento)

Intel moderno (y AMD, supongo) L3, también conocido como LLC, también conocido como cachés de último nivel, utiliza una función de indexación que no es solo un rango de bits de dirección . Es una función hash que distribuye mejor las cosas para reducir las colisiones de zancadas fijas. De acuerdo con Intel, mi caché debe ser asociativa de 24 vías aunque sea de 12 vías, ¿cómo es eso? .

Desde Nehalem en adelante , Intel ha utilizado una gran caché L3 compartida inclusiva , que filtra el tráfico de coherencia entre núcleos . es decir, cuando un núcleo lee datos que están en estado Modificado en L1d de otro núcleo, las etiquetas L3 dicen qué núcleo, por lo que un RFO (Lectura para la propiedad) puede enviarse solo a ese núcleo, en lugar de emitirse. ¿Cómo están organizados los modernos cachés Intel CPU L3? . La propiedad de inclusividad es importante, porque significa que ningún caché privado L2 o L1 puede tener una copia de una línea de caché sin que L3 lo sepa. Si está en estado Exclusivo o Modificado en una memoria caché privada, L3 tendrá datos no válidos para esa línea, pero las etiquetas aún dirán qué núcleo podría tener una copia. Los núcleos que definitivamente no tienen una copia no necesitan que se les envíe un mensaje al respecto, ahorrando energía y ancho de banda a través de los enlaces internos entre los núcleos y L3. Vea por qué la coherencia de caché en chip está aquí para quedarse para obtener más detalles sobre la coherencia de caché en chip en Intel "i7" (es decir, Nehalem y Sandybridge-family, que son arquitecturas diferentes pero usan la misma jerarquía de caché).

Core2Duo tenía un caché compartido de último nivel (L2), pero tardó en generar solicitudes RFO (Read-For-Ownership) en caso de errores de L2. Por lo tanto, el ancho de banda entre núcleos con un búfer pequeño que cabe en L1d es tan lento como con un búfer grande que no cabe en L2 (es decir, velocidad DRAM). Hay un rango rápido de tamaños cuando el búfer cabe en L2 pero no en L1d, porque el núcleo de escritura desaloja sus propios datos a L2 donde las cargas del otro núcleo pueden llegar sin generar una solicitud de RFO. (Ver Figura 3.27: Ancho de banda de núcleo 2 con 2 hilos en "Lo que todo programador debe saber sobre la memoria" de Ulrich Drepper. ( Versión completa aquí ).

Skylake-AVX512 tiene L2 por núcleo más grande (1MiB en lugar de 256k), y rodajas L3 (LLC) más pequeñas por núcleo. Ya no es inclusivo . Utiliza una red de malla en lugar de un bus de anillo para conectar núcleos entre sí. Vea este artículo de AnandTech (pero tiene algunas imprecisiones en los detalles de la microarquitectura en otras páginas, vea el comentario que dejé ).

Descripción general técnica de la familia escalable del procesador Intel® Xeon®

Debido a la naturaleza no inclusiva de LLC , la ausencia de una línea de caché en LLC no indica que la línea no esté presente en cachés privados de ninguno de los núcleos. Por lo tanto, se usa un filtro snoop para realizar un seguimiento de la ubicación de las líneas de caché en los núcleos L1 o MLC cuando no está asignado en la LLC. En las CPU de la generación anterior, la propia LLC compartida se encargó de esta tarea.

Este "filtro snoop" solo es útil si no puede tener falsos negativos. Está bien enviar una invalidación o RFO ( MESI ) a un núcleo que no tiene una copia de una línea. No está bien permitir que un núcleo conserve una copia de una línea cuando otro núcleo solicita acceso exclusivo a él. Por lo tanto, puede ser un rastreador que incluya etiquetas que sepa qué núcleos pueden tener copias de qué línea, pero que no almacena en caché ningún dato.

O tal vez el filtro snoop puede ser útil sin incluir estrictamente todas las etiquetas L2 / L1. No soy un experto en protocolos snoop multi-core / multi-socket. Creo que el mismo filtro snoop también puede ayudar a filtrar las solicitudes snoop entre sockets. (En Broadwell y versiones anteriores, solo los Xeons de cuatro sockets y superiores tienen un filtro snoop para el tráfico entre núcleos; Broadwell Xeon solo de socket doble y anteriores no filtran las solicitudes de snoop entre los dos sockets ).

AMD Ryzen usa cachés L3 separados para grupos de núcleos , por lo que los datos compartidos en muchos núcleos deben duplicarse en el L3 para cada grupo. También es importante destacar que las escrituras desde un núcleo en un clúster tardan más en ser visibles para un núcleo en otro clúster, y las solicitudes de coherencia tienen que pasar por una interconexión entre clústeres. (Similar a entre sockets en un sistema Intel multi-socket, donde cada paquete de CPU tiene su propio L3).

Esto nos proporciona NUCA (acceso no uniforme a la memoria caché), análogo al NUMA (acceso no uniforme a la memoria) habitual que se obtiene en un sistema de zócalo múltiple donde cada procesador tiene un controlador de memoria incorporado, y el acceso a la memoria local es más rápido que acceder a la memoria conectada a otro socket.

Los sistemas Intel multi-socket recientes tienen modos snoop configurables, por lo que, en teoría, puede ajustar el mecanismo NUMA para que funcione mejor para la carga de trabajo que está ejecutando. Consulte la página de Intel sobre Broadwell-Xeon para obtener una tabla + descripción de los modos de snoop disponibles.

Otro avance / evolución es una política de reemplazo adaptativo en el L3 en IvyBridge y versiones posteriores . Esto puede reducir la contaminación cuando algunos datos tienen una ubicación temporal, pero otras partes del conjunto de trabajo son mucho más grandes. (es decir, hacer un bucle sobre una matriz gigante con reemplazo estándar de LRU lo desalojará todo, dejando que la caché L3 solo almacene en caché los datos de la matriz que no se volverán a tocar pronto. El reemplazo adaptativo intenta mitigar ese problema).

Otras lecturas:

Aprendí sobre diferentes técnicas de mapeo de caché como mapeo directo, mapeo asociado y establecer técnicas de mapeo asociativo y también aprendí las compensaciones. Pero tengo curiosidad por saber qué se usa en Intel Core i7 o procesador AMD hoy en día. Y cómo evolucionan las técnicas. ¿Y qué cosas hay que mejorar?