Aumentar el tamaño de la línea de caché cuando el caché y la RAM no funcionan de forma asíncrona

Quiero mejorar el diseño de un procesador. Tiene un caché mapeado directamente simple, y quiero mejorar la tasa de aciertos. He estado trabajando para aumentar el tamaño de la línea de caché de una palabra de datos a cuatro, pero dado que todos los accesos al caché y a la RAM están actualmente bloqueados (quiero decir que la operación de toda la CPU está bloqueada cuando está esperando una lectura de datos o escribir), creo que simplemente estoy cambiando la demora que se necesita para acceder a la RAM al momento en que se necesita cualquier dato en la misma línea de caché. Si no me equivoco, esto no hará que el procesador se ejecute más rápido (y probablemente solo más lento, ya que se transfieren más datos entre el caché y la RAM).

¿Es este el caso o estoy pasando por alto algo?

Respuestas (5)

Al no desacoplar la actividad de la memoria de la actividad de la CPU, está desperdiciando la mayor parte del beneficio de tener un caché.

Pero en función de cómo ha descrito su sistema hasta ahora, parece que su análisis es correcto: aumentar el tamaño de la línea en efecto obtendrá previamente algunos de los datos, pero esto no dará como resultado ninguna ganancia de rendimiento. De hecho, podría resultar en una ligera pérdida de rendimiento en aquellas ocasiones en las que los datos precargados nunca se usan realmente: el tiempo dedicado a recuperarlos simplemente se desperdició.

Puedo ver eso. El caso es que estoy mejorando un diseño existente, no es mío. Así que esperaba que aumentar el tamaño de la caché me diera una mejor tasa de aciertos. Pero parece que tengo que pensar en algo más... Podría desacoplar las actividades, pero me temo que será demasiado esfuerzo para el poco tiempo que me queda.
La mayor parte del beneficio de un caché está en un golpe de caché. Por ejemplo, detener un ciclo (para un acceso de coincidencia de caché de 2 ciclos) es menos que detener ocho ciclos para un acceso a la memoria. Permitir que continúen las instrucciones no dependientes (p. ej., usar un marcador o incluso una ranura de retraso de carga <improperio eliminado>) mejora el rendimiento, pero normalmente la latencia de la memoria es sustancialmente mayor y el ancho de banda de la memoria es sustancialmente menor que la latencia y el ancho de banda de la memoria caché.

No está claro si está pensando en pasar de un caché de mapeo directo de N x 1 palabra a (por ejemplo) un DM de N/2 x 2 palabras o un caché de DM de N x 2 palabras. El primero podría mejorar un poco el acceso secuencial, porque la segunda palabra en una línea actúa como un búfer de captación previa. La segunda alternativa mejorará significativamente la tasa de aciertos, pero principalmente porque se ha duplicado el tamaño del caché.

El beneficio de rendimiento de un tamaño de bloque de caché más grande depende del ancho de banda y la latencia de la memoria principal y la carga de trabajo. Si la latencia de la memoria y el ancho de banda son relativamente altos (p. ej., la primera palabra está disponible en 8 ciclos de procesador y una palabra adicional en cada ciclo), entonces si la carga de trabajo usa incluso la mitad del bloque de caché antes de que se desaloje, entonces un bloque de cuatro palabras aumentará el rendimiento (deteniéndose solo durante 11 ciclos en lugar de 16). (Dado que muchas tecnologías de memoria tienen restricciones de ráfagas, el beneficio podría ser menor si el controlador de memoria tiene un búfer [por lo que los accesos secuenciales podrían llegar al búfer, sin sufrir la penalización de acceso a la memoria completa] o más si las fallas son en diferentes fragmentos de memoria y el uso de la ráfaga completa aumenta el ancho de banda efectivo de la memoria].)

Si el caché es reescritura, se debe considerar el costo adicional de desalojo. Por ejemplo, si el 50% de las palabras están sucias, entonces el estancamiento promedio (para los dos accesos que en promedio aciertan en el bloque de 4 palabras) pasaría de 16 ciclos a 20 ciclos y de 11 ciclos a 19,25 ciclos (75% de los bloques estaría sucio ya que la mitad de las palabras usadas están sucias y se usa la mitad de las palabras en una línea de caché).

Una caché de reescritura con bloques de una sola palabra tampoco necesitaría leer la memoria para escrituras de palabras completas en una falla de caché.

(La escritura directa sin asignación tiene algunas ventajas para las memorias caché de asignación directa, si hay un búfer de escritura. Puede ser útil combinar un búfer de escritura y una memoria caché de la víctima).

En una memoria caché asignada directamente , aumentar el tamaño del bloque también aumentará la tasa de errores de conflicto. La importancia de esto dependerá de la carga de trabajo (e incluso de la asignación de datos).

Otras posibles mejoras de la memoria caché incluyen proporcionar una memoria caché víctima (efectivamente, una pequeña memoria caché L2), usar una mayor asociatividad (la predicción de forma podría usarse para proporcionar velocidad de mapeo directo en las predicciones correctas) y proporcionar un búfer de captación previa. Si la latencia de la memoria es significativa, entonces no es necesario que haya muchas visitas en la memoria caché de la víctima o en el búfer de captación previa para compensar el retraso en el acceso a la memoria. (Acceder especulativamente a la memoria en caso de error antes de verificar el caché de la víctima/el búfer de captación previa reduciría la latencia de los errores en estos cachés auxiliares, pero podría aumentar la latencia cuando un acierto en el caché de la víctima es seguido inmediatamente por un error en el caché de la víctima, ya que el segundo acceso podría tener que espere a que se complete el primer acceso a la memoria que se va a descartar antes de iniciar el suyo propio).

Otra posibilidad a considerar son los cachés especializados. Por ejemplo, si los accesos a la pila se pueden filtrar del resto de la memoria caché de datos, los errores de conflicto se reducirían y se mantendría la simplicidad de las memorias caché asignadas directamente.

Por cierto, algunas formas de predicción de vías se benefician de los bloques de caché más grandes que una palabra porque pueden explotar la localidad de referencia.

La mayor ventaja de tener un tamaño de línea de caché más grande es que la complejidad de un controlador de caché a menudo se relaciona principalmente con el tamaño del búfer de etiquetas, que a su vez está controlado por la cantidad de líneas. Al duplicar el tamaño de cada línea, se duplica la cantidad de información que se puede almacenar en caché con un búfer de etiqueta de tamaño determinado. Si no fuera por el costo, duplicar el tamaño de cada línea de caché a menudo sería inferior a tener el doble de líneas de caché. Sin embargo, si cuadruplicar el tamaño de cada línea de caché (pero manteniendo el mismo número) costaría lo mismo que duplicar el número de ellas (pero manteniendo el mismo tamaño), es posible que la primera ofrezca más "beneficio por el dinero". .

En general, si uno está tratando de obtener un buen rendimiento de líneas de caché más grandes, debe tener un par de bits para cada unidad direccionable dentro de una palabra, indicando si esa unidad está vacía, presente y limpia (coincide con lo que está en RAM), o presente y sucio (solo aplicable para cachés de reescritura). Si alguna línea de caché no está completamente llena, puede ser útil recuperar su contenido de la RAM en momentos en que el bus de memoria estaría inactivo, pero las recuperaciones en las que la CPU está interesada deben tener prioridad sobre las que no lo están.

Por cierto, una ventaja de las cachés de escritura simultánea frente a las de escritura simultánea es que es posible tener cualquier número de dispositivos que tengan cachés de escritura simultánea compartiendo el bus sin que ningún código tenga que conocer las cachés de nadie; todo lo que se necesita para mantener la coherencia es la lógica para invalidar cualquier línea que sea alcanzada por accesos externos. Por el contrario, cuando se usa un caché de reescritura, será necesario que los dispositivos realicen un seguimiento de los datos que se almacenan en los cachés de otros dispositivos, para garantizar que cada dispositivo que tenga un bloque en su caché sea notificado si alguien más lo modifica. .

aumentando el tamaño de la línea de caché de una palabra de datos a cuatro... simplemente cambiando el retraso que se necesita para acceder a la RAM al momento en que se necesita cualquier dato en la misma línea de caché. ... esto no hará que el procesador se ejecute más rápido (y probablemente solo más lento, ya que se transfieren más datos entre el caché y la RAM).

Cuando el procesador no necesita que se obtengan los datos "adicionales", entonces tiene razón; el tiempo dedicado a obtener esos datos adicionales se desperdicia, lo que hace que el procesador sea más lento.

Sin embargo, si el procesador necesita obtener los datos "adicionales", hay varias formas en que las líneas de caché más grandes pueden hacer que el procesador sea más rápido (con una cantidad fija de datos en el caché).

Cualquier programa de referencia en particular, cuando se prueba repetidamente usando una variedad de tamaños de línea de caché (y una cantidad fija de datos en la memoria caché), le dará un tamaño de línea de caché particular que es el óptimo para ese programa de referencia en particular, pero lamentablemente, diferente Los programas de referencia tienen diferentes tamaños de línea de caché óptimos. Los programas que leen bytes casi al azar, como ARC4, normalmente prefieren líneas de caché más cortas. Los programas que leen grandes bloques de datos más o menos secuencialmente suelen preferir líneas de caché más grandes. Es una compensación.

Leer los mismos datos en menos tiempo

  • Toda la DRAM y la mayoría de las demás memorias son más rápidas para leer datos secuencialmente que las lecturas aleatorias. Si la CPU necesita leer el byte 1000 ahora, luego el byte 7007 y luego el 1001, aunque aún tenga la misma cantidad de ciclos de memoria de lectura sin importar cómo baraje las lecturas, a menudo se necesita menos tiempo de reloj de pared para (un ) lee los bytes 1000 y 1001 seguidos en algún modo secuencial y luego 7007 que lo hace para (b) hacer lecturas aleatorias.

  • Si tiene un bus de datos de memoria estrecho que requiere varios ciclos de memoria para llenar una línea de caché, un caché inteligente puede leer primero el byte deseado de la memoria, reenviarlo a la CPU y luego completar el resto de la línea de caché con "extra". " datos. La primera lectura toma el mismo tiempo que un sistema de línea de caché pequeña. En los casos en que la CPU puede quedarse completamente sin caché en paralelo con la carga del caché, una lectura posterior de los datos precargados es más rápida.

Más datos en la misma cantidad de tiempo

Si tiene o puede cambiar a un bus de datos de memoria amplia (por ejemplo, todos los procesadores Intel que se ajustan al zócalo LGA-2011 tienen 256 pines de datos, que se conectan a 256 líneas de datos en la placa base; hoja de datos del zócalo LGA-2011, sección 6.1 )

  • Si puede leer una línea de caché grande de una sola vez, se necesita la misma cantidad de tiempo para leer toda la línea de caché que para leer un solo byte. Por lo tanto, también puede almacenar en caché la línea de caché de ancho completo, ya que no se ejecuta más lentamente incluso en el peor de los casos, porque ocasionalmente la CPU puede necesitar algunos de esos datos "adicionales" más tarde y luego no necesita esperar.
  • Si puede escribir una línea de caché grande de una sola vez y usa una caché de reescritura, se necesita la misma cantidad de tiempo para escribir esa línea de caché ancha que para escribir un solo byte o un registro completo. Por lo tanto, también podría usar una línea de caché ancha, ya que no se ejecuta más lentamente en el peor de los casos, porque ocasionalmente la caché ancha puede "combinar escrituras" y escribir la línea de caché completa de una vez en un ciclo de memoria en lugar de en partes a lo largo. 2 o más ciclos de memoria separados.

Leer menos datos

  • Como señaló Wouter van Ooijen, si realmente está aumentando la cantidad de datos en su caché manteniendo los mismos bits de etiqueta pero aumentando el tamaño de la línea de caché, eso tiende a aumentar la tasa de aciertos, lo que hace que el sistema sea más rápido en casi todos los casos.