Tamaño de línea de cachés L1 y L2

De una pregunta anterior en este foro, aprendí que en la mayoría de los sistemas de memoria, la memoria caché L1 es un subconjunto de la caché L2, significa que cualquier entrada eliminada de L2 también se elimina de L1.

Entonces, ahora mi pregunta es cómo determino una entrada correspondiente en la caché L1 para una entrada en la caché L2. La única información almacenada en la entrada L2 es la información de la etiqueta. En función de esta información de etiqueta, si vuelvo a crear el destinatario, puede abarcar varias líneas en la memoria caché L1 si los tamaños de línea de la memoria caché L1 y L2 no son iguales.

¿La architecture realmente se molesta en enjuagar ambas líneas o simplemente mantiene la caché L1 y L2 con el mismo tamaño de línea?

Entiendo que esta es una decisión política, pero quiero saber la técnica que se usa comúnmente.

    En Core i7 los tamaños de línea en L1, L2 y L3 son los mismos: eso es 64 Bytes. Supongo que esto simplifica el mantenimiento de la propiedad inclusiva y la coherencia.

    Consulte la página 28 de: https://www.scss.tcd.ie/Jeremy.Jones/CS3021/5%20caches.pdf

    El tamaño de Cache-Lines es (típicamente) 64 bytes.

    Además, eche un vistazo a este artículo muy interesante sobre cachés de procesadores: Galería de efectos de caché de procesador

    Encontrarás los siguientes capítulos:

    1. Acceso a la memoria y rendimiento
    2. Impacto de las líneas de caché
    3. Tamaños de caché L1 y L2
    4. Paralelismo a nivel de instrucción
    5. Asociatividad de caché
    6. Compartir línea de caché falso
    7. Complejidades de hardware

    La técnica más común para manejar el tamaño del bloque de caché en una jerarquía de caché estrictamente inclusiva es utilizar los mismos bloques de caché de tamaño para todos los niveles de caché para los que se aplica la propiedad de inclusión. Esto da como resultado una mayor sobrecarga de tags que si el caché de nivel superior usa bloques más grandes, que no solo usa el área de chip sino que también aumenta la latencia ya que las cachés de nivel más alto generalmente usan acceso por fases (donde las tags se verifican antes de acceder a la porción de datos). Sin embargo, también simplifica un poco el diseño y reduce la capacidad desaprovechada de las partes no utilizadas de los datos. No se necesita una gran fracción de fragmentos de 64 bytes no utilizados en bloques de caché de 128 bytes para compensar la penalización de área de una etiqueta adicional de 32 bits. Además, el efecto de locking de caché más grande de explotación de una localidad espacial más amplia puede proporcionarse mediante una captación previa relativamente simple, que tiene la ventaja de que no se deja sin utilizar si el trozo cercano no está cargado (para conservar ancho de banda de memoria o reducir la latencia en una memoria conflictiva leer) y que la captación previa de adyacencia no necesita limitarse a un trozo alineado más grande.

    Una técnica menos común divide el bloque de caché en sectores. Tener el tamaño del sector igual que el tamaño de bloque para las memorias caché de nivel inferior evita el problema de la invalidación excesiva de retroceso, ya que cada sector en la memoria caché de nivel superior tiene su propio bit válido. (Proporcionar todos los metadatos de estado de coherencia para cada sector en lugar de solo validez puede evitar el uso excesivo de ancho de banda de reescritura cuando al menos un sector de un bloque no está sucio / modificado y algunos gastos generales de coherencia [por ejemplo, si un sector está en estado compartido y otro es en el estado exclusivo, una escritura en el sector en el estado exclusivo podría no implicar tráfico de coherencia, si se usa coherencia en lugar de directorio).

    El ahorro de área de los bloques de caché sectorizados fue especialmente significativo cuando las tags estaban en el chip del procesador, pero los datos no estaban en el chip. Obviamente, si el área de almacenamiento de datos es comparable al tamaño del chip del procesador (que no es irracional), las tags de 32 bits con bloques de 64 bytes tomarían aproximadamente un 16 (~ 6%) del área del procesador, mientras que 128- los bloques de bytes tardarían la mitad. (POWER6 + de IBM, presentado en 2009, es tal vez el procesador más reciente para usar tags con chip en el procesador y datos sin procesadores. Almacenar datos en DRAM y tags embebidas de mayor densidad en SRAM de menor densidad, como hizo IBM, exagera esto efecto.)

    Cabe señalar que Intel utiliza “línea de caché” para referirse a la unidad más pequeña y “sector de caché” para la unidad más grande. (Esta es una razón por la que utilicé “bloque de caché” en mi explicación). Usando la terminología de Intel, sería muy raro que las líneas de caché varíen en tamaño entre los niveles de caché, independientemente de si los niveles son estrictamente inclusivos, estrictamente exclusivos o utilizados alguna otra política de inclusión.

    (La exclusión estricta generalmente usa el caché de nivel superior como caché de víctima donde los desalojos del caché de nivel inferior se insertan en el caché de nivel superior. Obviamente, si los tamaños de bloque eran diferentes y no se utilizaba la sectorización, un desalojo requeriría el rest de el bloque más grande para ser leído de algún lado e invalidado si está presente en el caché de nivel inferior. [ Teóricamente , la exclusión estricta se podría usar con un caché inflexible donde un desalojo L1 omitiría L2 y pasaría a L3 y L1 / L2 fallarían solo en el caché asignado a L1 o L2, evitando L1 para ciertos accesos. Lo más cercano a esto que estoy implementando es que Itanium omite L1 para accesos de coma flotante, sin embargo, si recuerdo bien, el L2 incluía L1.] )

    Normalmente, en un acceso a la memoria principal, se accede a 64 bytes de datos y 8 bytes de paridad / ECC (no recuerdo exactamente a qué). Y es bastante complicado mantener diferentes tamaños de línea de caché en los distintos niveles de memoria. Debe tener en cuenta que el tamaño de la línea de caché estaría más correlacionado con el tamaño de alineación de palabras en esa architecture que con cualquier otra cosa. En función de eso, es muy poco probable que el tamaño de una línea de caché sea diferente del tamaño de acceso a la memoria. Ahora, los bits de paridad son para el uso del controlador de memoria, por lo que el tamaño de la línea de caché suele ser de 64 bytes. El procesador realmente controla muy poco más allá de los registros. Todo lo demás que sucede en la computadora se trata más de obtener hardware para optimizar el rendimiento de la CPU. En ese sentido también, realmente no tendría sentido importar complejidad adicional al hacer que los tamaños de línea de caché sean diferentes en diferentes niveles de memoria.