Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo utilizar la caché DSP

Cómo utilizar la caché DSP

La caché en el procesador es una memoria de alta velocidad almacenada alrededor del procesador. Se puede utilizar para guardar algunas instrucciones únicas durante la operación y el procesamiento, acelerando así la operación.

En este artículo, la memoria caché se comparará con la memoria ordinaria del sistema, y ​​luego se introducirán algunas teorías básicas y términos básicos de la caché, así como la importancia de la caché en la arquitectura de procesador de alta velocidad. . Basado en la estructura DSP TMS320C64x de TI, nos centraremos en presentar a los desarrolladores cómo funciona el caché, cómo configurarlo y cómo usar cahce correctamente. Este artículo recorrerá todo el texto con la coherencia del caché.

Estructura de la memoria

Cuando la CPU accede a la memoria externa, no se producirá la prohibición de acceso a la memoria. Y no habrá retrasos en el acceso al acceder a la memoria interna.

Cuando el reloj de la CPU aumenta a 600 MHZ, el estado de espera de acceso no ocurrirá solo cuando la velocidad de la memoria también aumente a 600 MHZ. Desafortunadamente, la memoria interna que funciona a la misma frecuencia de 600 MHZ será muy costosa en la mayoría de los casos. Y 300MHZ no es una buena opción porque reducirá significativamente la frecuencia de la CPU. Imagine que un algoritmo necesita acceder a la memoria en cada ciclo. Cada acceso a la memoria tiene que esperar un ciclo, duplicando el ciclo de acceso y compensando así la doble frecuencia operativa de la CPU.

La solución es utilizar una memoria multinivel. La memoria más cercana a la CPU consta de un bloque rápido pero pequeño al que se puede acceder sin demora. Es ligeramente diferente de algunas CPU que usan memoria más grande pero más lenta. Para la memoria de bajo nivel, la memoria más cercana a la CPU es una memoria caché típica.

Regla de ubicación

Por supuesto, esta solución debe funcionar cuando la CPU pueda acceder a ella más rápido. condición de memoria reciente. Debido a la ley de ubicación, esto es válido para la mayoría de las CPU. Esto significa que dentro de un período de tiempo específico, el programa solo accede a una pequeña área relevante del espacio total de direcciones. Esto incluye los siguientes dos tipos básicos de ubicación:

1. La ley de ubicación espacial: los recursos que rodean un recurso al que se acaba de acceder tienen más probabilidades de ser accedidos.

2. ley de ubicación temporal: los recursos a los que se acaba de acceder en un momento del pasado tienen más probabilidades de ser accedidos inmediatamente en el futuro

La ley de ubicación espacial está determinada por el estilo de programación del programa de computadora En circunstancias normales, los datos relevantes se almacenarán continuamente en la memoria. Por ejemplo, al calcular un tipo diferente, coloque siempre el primer elemento en la primera columna, luego el segundo elemento, y así sucesivamente. De la misma manera, la razón para la formación de la ley de posición temporal es que el programa contiene estructuras como estructuras de bucle que llaman repetidamente a las mismas instrucciones (o incluso a los mismos datos).

La Figura 2 ilustra la ley de posición espacial, que describe un filtro FIR de sexto orden. Para calcular la salida y[0], se leerán 6 muestras del búfer de datos de entrada x[] (el valor está determinado por la regla de presupuesto para los datos de muestra a los que se accede en la memoria). Cuando se completa un acceso a datos, el controlador de caché recupera x[0] y una serie de direcciones de valores de muestra de la memoria. Esta serie de valores de dirección se denomina cadena de caché. La recuperación de cadenas de datos de la memoria de baja velocidad provocará algunos ciclos de latencia de la CPU. El propósito de esto es que cuando se realicen los siguientes cálculos, se pueda acceder inmediatamente a los números adyacentes a x[0]. Este principio se aplica al filtro FIR, porque se accederá inmediatamente a los siguientes cinco valores de muestra (x [1] -x [5]). El proceso de acceso a estos cinco valores se completará en el caché en lugar de en la memoria de baja velocidad, por lo que no habrá ciclos de retraso.

Al calcular la siguiente salida y[1], se usarán nuevamente cinco valores de muestra (x[1]-x[5]), y solo se usará un valor de muestra (x[6]). nuevo de. Todos los valores de muestra se han recuperado en la memoria caché y no habrá retrasos en la CPU.

Este ejemplo de datos que se utilizaron anteriormente y se utilizan nuevamente en el procesamiento de datos ilustra bien el principio de posición temporal.

La caché se basa en el tiempo local y el espacio de acceso a los datos. Por lo tanto, los accesos a la memoria de baja velocidad se reducen considerablemente y la mayoría de los accesos a datos son atendidos por la memoria caché de alta velocidad a la frecuencia operativa de la CPU.

Tasa de memoria:

El sistema de caché generalmente incluye tres niveles

1. El caché de primer nivel (L1) está ubicado en el chip de la CPU y opera en la CPU. frecuencia de funcionamiento.

2. El caché de segundo nivel (L2) también se encuentra en el chip y es más lento y más grande que el L1.

3. La caché de tercer nivel (L3) se encuentra fuera de la CPU y es la memoria más lenta y más grande.

Los factores de ejecución correspondientes de cada nivel de caché están determinados por el intervalo del procesador del intervalo de caché. La Tabla 1 muestra un tiempo correspondiente representativo.

Cuando el operador necesita recuperar datos de la memoria, primero los busca en la caché de nivel más alto y luego en la caché del siguiente nivel. Si se encuentra en el caché, se denomina acierto. De lo contrario, se llama fallo.

El rendimiento de un sistema de caché depende del número de aciertos de la aplicación de caché, también conocido como tasa de aciertos. Para un nivel específico de caché, una alta tasa de aciertos de caché significa un mayor rendimiento. El rendimiento de todo el sistema CAHCE depende de la tasa de aciertos de las cachés en todos los niveles. Por ejemplo, la tasa de aciertos del caché L1 de primer nivel de un sistema de caché es 70, la tasa de aciertos del caché L2 de segundo nivel es 20, la tasa de aciertos del caché L3 de tercer nivel es 5 y la tasa de aciertos del caché L1 de primer nivel es 5. la memoria completa es 5. Por lo tanto, el rendimiento promedio de la memoria de este sistema según la Figura 3 es:

(0,7 * 4) (0,2 * 5) (0,05 * 30) (0,05 * 220) = 16,30 ns

Para ilustrar este concepto, utilizamos la estructura de memoria DSP TMS320C64x de TI. Por ejemplo, (Tabla 4) contiene una memoria caché interna de dos niveles y una memoria externa. La CPU puede acceder a L1cache sin demora. La memoria L2 se puede programar y asignar como L2SRAM (memoria direccionable en chip) y L2cache. Independientemente de la configuración, solo se puede acceder a la memoria L2 una vez cada dos ciclos. El tamaño de L2 depende del chip, pero siempre es mucho mayor que L1. Tomando como ejemplo el DSP TMS320C6454, el tamaño de L2 es 1 MByte. El C64x DSP admite hasta 2 GB de memoria externa. La velocidad de la memoria depende del tipo de tecnología utilizada en la memoria, la mayoría de las cuales rondan los 100 MHZ. En la Figura 3, todos los cachés y canales de datos son controlados automáticamente por el controlador de caché.

Actualización de datos de caché

Dado que el caché también es una parte de respaldo de la memoria principal, es crucial si el caché puede reflejar los datos de la memoria principal en tiempo real. Cuando los datos en el caché cambian pero los datos en la memoria principal no cambian, los datos en el caché se denominan datos "sucios". Cuando los datos cambian en el almacenamiento principal pero no cambian en la caché en tiempo real, los datos en la caché se denominan datos "retrasados".

El controlador de caché utiliza una serie de tecnologías para mantener la coherencia del caché y garantizar que se almacene información útil en el caché en lugar de datos retrasados. Las operaciones de "monitoreo" y "escritura reescrita" son dos métodos para mantener la coherencia de la caché. "Monitoreo" se refiere al proceso utilizado para permitir que el caché realice transferencias que afectan la dirección del caché en la memoria principal. Si el caché detecta que se ha producido dicha transferencia, se actualizará para coincidir con la memoria principal. Este proceso de copiar datos en la memoria principal se denomina operación de "escritura regresiva".

Debido a que el caché es más pequeño que la memoria principal, a menudo se llena. Cuando esto sucede, cualquier dato nuevo que se mueva al caché reemplazará los datos existentes. Hay varias formas de determinar el reemplazo de datos. Por ejemplo, método de sustitución aleatoria, método de sustitución primero en entrar, primero en salir y método de sustitución utilizado menos recientemente. La mayoría de los procesadores utilizan el método de reemplazo utilizado menos recientemente. Esto permite que los datos más recientes reemplacen los datos utilizados menos recientemente. Este método se deriva de la ley de la posición temporal.

Caché de mapeo directo

La memoria caché se puede configurar en "mapeado directo" o "modo conjunto". Para explicar estos términos, tomamos como ejemplo el C64X L1Pcache que se muestra en la Figura 4. Estos cachés están compuestos por 512 columnas de 32 bytes. Cada fila se asigna a alguna dirección de memoria fija y familiar. Por ejemplo:

Las direcciones de 0000h a 0019h a menudo se organizan en la columna 0 por el caché

Las direcciones de 0020h a 0039h a menudo se organizan en la columna 1 por el caché

Las direcciones de 3FE0h a 3FFFh a menudo se organizan en la columna 511 del caché.

Entonces, una vez que necesitamos obtener la dirección 4000h, debido a que la capacidad de la caché está agotada, las direcciones de 4000h a 4019h deben comenzar desde la columna 0 nuevamente.

Para mantener los datos replicados, cada fila de L1Pcache incluye:

Una señal válida para indicar si la columna de caché contiene información útil

Un marcador cuyo valor son los 18 bits superiores de la dirección. Esto es necesario porque una columna especificada puede contener datos en diferentes direcciones. Por ejemplo, la columna 0 puede contener datos de 0000h a 0019h, también pueden ser datos de 4000h a 4019h.

Un dato configurable, este dato equivale a la dirección del bit 5 al bit 13. Para el mapeo directo, los datos en esta configuración son los mismos que el valor de esta columna. La cosa es más complicada cuando se trata de métodos conjuntos, de los que hablaremos más adelante.

Ahora veamos qué sucede cuando la CPU accede a la dirección ubicada en 0020h. Se supone que el caché está completamente invalidado, lo que significa que no todas las columnas contienen datos válidos. Cuando la CPU emite una solicitud de acceso a la dirección 20h, el controlador de caché comienza a buscar los bits de dirección parciales (por ejemplo, de los bits 5 al 13) que son iguales a la dirección de la columna. Cuando este valor de dirección parcial (de los bits 5 a 13) se establece en 1, la dirección a consultar coincide. El controlador continuará verificando si los bits de etiqueta en la primera columna también coinciden con los 18 bits de orden superior de las direcciones 0020h a 0039h. Cuando se completen, se verificará el bit de datos válido para ver si el caché contiene datos válidos. Si el bit de datos válido es 0, el controlador de caché registra una operación fallida.

Esta operación fallida hará que el controlador lea los datos 0020h-0039h de esta columna de la memoria y establezca el bit de datos válido en 1. Al mismo tiempo, parte del valor de la dirección se guarda en la RAM de etiquetas. Los datos obtenidos se transferirán a la CPU para completar la operación de acceso.

Si se accede nuevamente a la dirección 0020h, el controlador de caché obtendrá la dirección nuevamente y verificará su configurador y etiqueta. Cuando el bit de datos válido es 1, el controlador registrará una operación de acceso, por lo que los datos en la columna de caché también se enviarán a la CPU para completar toda la operación de acceso.

Método de configuración conjunta

El método de configuración conjunta es una continuación del método de mapeo directo. En el mapeo directo, cada configuración contiene solo una columna. En el modo de configuración conjunta, cada configuración contiene varias columnas, lo que se denomina modo multidireccional. La Figura 5 ilustra una caché configurada conjuntamente, tomando como ejemplo el L1D del DSP C64x. Se trata de una caché conjunta bidireccional que contiene 64 bytes con una capacidad total de 16 KBytes.

Para mantener los datos, cada columna de L1Dcache contiene lo siguiente:

Un bit usado menos recientemente se usa para indicar qué formas se han usado raramente recientemente (esto no se usa en L1P);

Se utiliza un bit de datos sucios para indicar si la columna de caché coincide con la capacidad de la memoria principal (esto no se utiliza en L1P); se utiliza para indicar la columna de caché si los datos contenidos en ella son datos válidos;

Un bit de marca, equivalente a los 18 bits altos de la dirección;

Un dato de configuración, equivalente a los 5 a 13 bits de la dirección.

El método para determinar aciertos y errores es el mismo que el método de caché de mapeo directo. La diferencia es que en este momento se necesitan dos bits de bandera y un bit de bandera registra qué canal de datos solicitados. Si se accede a los datos de la forma 0, se accede a los datos de la columna de la forma 0. Si se accede a los datos de la forma 1, se accede a los datos de la columna de la forma 1.

Si ninguna ruta coincide, los datos se asignarán desde la memoria. El bit utilizado menos recientemente determinará cómo se asignan los datos de forma similar a una operación de conmutación. Si el bit utilizado menos recientemente de la columna asignada 0 se establece en 0, los datos se asignarán a la primera columna. Independientemente de si la columna de caché se lee o se escribe, se cambiará el bit de marca utilizado menos recientemente. Por ejemplo: si se lee la columna 0, el bit utilizado menos recientemente cambiará a 1. Dado que el bit utilizado menos recientemente solo registra operaciones perdidas, su estado se actualizará cada vez, independientemente de si el acceso a la columna es acertado o fallido, de lectura o de escritura.

Para L1P, L1D es un caché asignado para lectura, independientemente de si la operación de lectura acierta o falla cuando se solicitan nuevos datos en la memoria. En una operación de escritura perdida, los datos se transfieren de la memoria de escritura a la memoria, sin pasar por L1Dcacee. Durante una operación de acierto de escritura, los datos se escriben en la memoria caché en lugar de hacerlo inmediatamente en la memoria. Cuando los datos se modifican mediante un acceso de escritura de la CPU, el contenido de la memoria caché se envía a una memoria caché de reescritura y, posteriormente, los datos se escriben en la memoria.

El bit de datos sucios indica que cuando los datos en el caché se modifican mediante una operación de escritura, los nuevos datos modificados aún no se han escrito en la memoria principal. Inicialmente, al bit de datos sucios se le asignará un valor de 0. Una vez que la CPU escribe en una columna, el bit de datos sucios pasará a ser 1. Cuando esta columna se expulsa de la memoria caché, estos datos se volverán a escribir en la memoria principal. Esto sucede cuando se produce un error de lectura y se solicitan nuevos datos de la columna de datos sucios. Se pasará un comando de reescritura al controlador de caché para provocar una operación de reescritura, pero esto no sucede muy a menudo.

Optimizar el rendimiento de la caché

Hay tres situaciones de error:

Error inevitable (también llamado primer error): este error ocurre cuando se colocan datos por primera vez en el caché, para distinguirlo de los siguientes dos errores, se pueden evitar.

Error de conflicto: se produce un error cuando la columna se reemplaza antes de ser reutilizada.

Pérdida de capacidad: este método ocurre cuando se agota la capacidad de la caché. La pérdida de capacidad es un método de conflicto.

Por cada fallo, el controlador sufre un retraso al colocar los datos de la memoria en la caché. Para un mejor rendimiento, el contenido de cada columna se debe reutilizar tanto como sea posible antes de reemplazarlo. Reutilizar una columna para obtener diferentes posiciones mejora el acceso a ubicaciones espaciales y reutilizar una columna mejora el acceso a ubicaciones temporales. Este es uno de los principios más básicos para optimizar el rendimiento del almacenamiento en caché.

Por ejemplo, el rendimiento de la caché es relativamente alto cuando se accede con frecuencia a la memoria caché. Este patrón de acceso repetirá el acceso a la columna anterior antes de acceder a la siguiente columna.

Por ejemplo, el siguiente código tiene una tasa de aciertos muy alta:

El rendimiento del siguiente código es igual al anterior, porque su acceso a la memoria tiene una tasa de aciertos muy grande, lo que significa que el. La tasa de acceso a la columna anterior se reduce antes de acceder a la siguiente columna.

Si una columna se expulsa del caché y es necesario acceder a ella nuevamente, esta columna se debe reescribir en el caché. Por lo tanto, cómo evitar esta expulsión se vuelve muy importante, y determinar la causa de este error puede ayudarnos a evitar el próximo error.

Como se mencionó anteriormente, el motivo de la pérdida de capacidad es que la capacidad de la caché es menor que la de la memoria principal. Si se produce una pérdida de capacidad, la forma más sencilla es aumentar la capacidad de la caché. Por ejemplo,

El L2cache en el DSP C64x se puede configurar como un híbrido de caché y SRAM. Si faltan muchas capacidades, los programadores pueden solicitar más memoria L2 como caché. Otra

solución es reducir la cantidad de datos necesarios.

Si se produce un conflicto y se produce un error, la clave es reorganizar la disposición de los datos para que los datos de la última hora se puedan asignar a otras rutas. (Para el mapeo directo, esto es similar a mapear datos en diferentes filas). Cambiar la disposición de la memoria puede hacer que los datos se ubiquen en diferentes ubicaciones de la memoria para que no ocurran conflictos. Como opción, desde una perspectiva de diseño de hardware, el modo multiconjunto puede producir un modo multicolumna. Por lo tanto, dos columnas en la memoria que se asignan a la misma configuración se pueden asignar en la caché sin conflicto.