Descripción de la caché de CPU y la línea de caché


Estoy tratando de entender cómo funciona la caché de la CPU. Digamos que tenemos esta configuración (como ejemplo).

  • Tamaño de caché 1024 bytes
  • Línea de caché 32 bytes
  • 1024/32 = 32 líneas de caché juntas.
  • La línea de caché Singel puede almacenar 32/4 = 8 ints.

1) De acuerdo con esta configuración, la longitud de la etiqueta debe ser 32-5 = 27 bits,y el tamaño del índice 5 bits (2^5 = 32 direcciones para cada byte en la línea de caché).

Si el tamaño total de la caché es 1024 y hay 32 líneas de caché, ¿dónde se almacenan las etiquetas+índices? (Hay otros 4 * 32 = 128 bytes.) ¿Significa que el tamaño real de la caché es 1024 + 128 = 1152?

2) Si la línea de caché es de 32 bytes en este ejemplo, esto significa que 32 bytes se copian en caché cuando la CPU necesita obtener nuevos bytes de la RAM. ¿Estoy en lo correcto al asumir que la posición de la línea de caché del byte solicitado será determinada por su dirección?

Esto es lo que quiero decir: si la CPU solicitó byte en [FF FF 00 08], entonces disponible la línea de caché se rellenará con bytes desde [FF FF 00 00] hasta [FF FF 00 1F]. Y nuestro solo byte requerido estará en la posición [08].

3) Si la instrucción anterior es correcta, ¿significa que los 5 bits que se utilizan para el índice, técnicamente no son necesarios ya que todos los 32 bytes están en la línea de caché de todos modos?

Por Favor, hágamelo saber si tengo algo mal. Gracias

 24
Author: chrisaycock, 2011-02-15

3 answers

Una caché consiste en datos y etiqueta RAM, dispuestos como un compromiso de tiempo de acceso vs eficiencia y diseño físico. Te estás perdiendo una estadística importante: número de formas (conjuntos). Rara vez tiene cachés de 1 vía, porque funcionan patológicamente mal con patrones simples. De todos modos:

1) Sí, las etiquetas ocupan más espacio. Esto es parte del compromiso de diseño: no desea que sea una gran fracción del área total, y por qué el tamaño de la línea no es solo 1 byte o 1 palabra. Además, todas las etiquetas para un índice se accede simultáneamente, y eso puede afectar la eficiencia y el diseño si hay un gran número de formas. El tamaño es ligeramente más grande que su estimación. Por lo general, también hay algunos bits extra bits para marcar la validez y, a veces sugerencias. Más vías y líneas más pequeñas necesitan una fracción más grande ocupada por las etiquetas, por lo que generalmente las líneas son grandes (32+ bytes) y las vías son pequeñas (4-16).

2) Sí. Algunos cachés también hacen una búsqueda de "palabra crítica primero", donde comienzan con la palabra que causó la línea llena, luego trae el resto. Esto reduce el número de ciclos que la CPU está esperando los datos que realmente pidió. Algunos cachés "escribirán a través" y no asignarán una línea si falla en una escritura, lo que evita tener que leer toda la línea de caché primero, antes de escribir en ella (esto no siempre es una victoria).

3) Las etiquetas no almacenarán los 5 bits inferiores, ya que no son necesarios para coincidir con una línea de caché. Solo indexan en líneas individuales.

Wikipedia tiene un bastante bueno, aunque un poco intenso, escribir en cachés: http://en.wikipedia.org/wiki/CPU_cache - ver "Implementación". Hay un diagrama de cómo se dividen los datos y las etiquetas. Yo, creo que todo el mundo debería aprender esto porque realmente se puede mejorar el rendimiento del código cuando se sabe lo que la máquina subyacente es realmente capaz de.

 17
Author: John Ripley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-15 18:05:25
  1. Los metadatos de la caché normalmente no se cuentan como parte de la caché en sí. Es posible que ni siquiera se almacene en la misma parte de la CPU (podría estar en otra caché, implementada usando registros especiales de CPU, etc.).
  2. Esto depende de si su CPU obtendrá direcciones no alineadas. Si solo obtiene direcciones alineadas, entonces el ejemplo que dio sería correcto. Si la CPU obtiene direcciones no alineadas, entonces podría obtener el rango 0xFFFF0008 a 0xFFFF0027.
  3. El los bytes de índice siguen siendo útiles, incluso cuando el acceso a la caché está alineado. Esto le da a la CPU un método abreviado para hacer referencia a un byte dentro de una línea de caché que puede usar en su contabilidad interna. Podrías obtener la misma información conociendo la dirección asociada con la línea de caché y la dirección asociada con el byte, pero eso es mucha más información para llevar.

Diferentes CPU implementan el almacenamiento en caché de manera muy diferente. Para la mejor respuesta a su pregunta, por favor dé algunos detalles adicionales sobre la CPU en particular (tipo, modelo, etc.) de la que estás hablando.

 3
Author: bta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-15 18:05:46

Esto se basa en mi vaga memoria, deberías leer libros como "Computer Architecture: A Quantitative Approach" de Hennessey y Patterson. Gran libro.

Asumiendo una CPU de 32 bits... (de lo contrario, sus figuras tendrían que usar >4 bytes (tal vez

1) Creo que es al menos 4*32 bytes. Dependiendo de la CPU, los arquitectos del chip pueden haber decidido realizar un seguimiento de otra información además de la dirección completa. Pero por lo general no se considera parte de la caché.

2) Sí, pero cómo se hace ese mapeo es diferente. Ver Wikipedia - CPU cache-associativity Existe la caché mapeada directa simple y la caché mapeada asociativa más compleja. Desea evitar el caso en el que un código necesita dos piezas de información, pero las dos direcciones se asignan a la misma línea de caché exacta.

 3
Author: typo.pl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-15 18:05:51