assembly - procesador - q es arm
¿Qué se entiende por caché de datos y caché de instrucciones? (4)
El caché de instrucciones es solo otro nivel de memoria para acceder a las instrucciones más rápido. No es parte de la lógica de las unidades de reloj de cpu / partes internas / búsqueda-decodificación-ejecución, sin embargo, usted debería nombrarlo.
Cuando una instrucción de decir se almacena en caché, significa que está muy cerca del nivel de memoria de la CPU, por lo que cuando la CPU necesita cargar la instrucción en la dirección X, lo hace muy rápido en comparación con alguna otra dirección Y.
Las CPUs internamente no almacenan las instrucciones en caché.
Las instrucciones y los datos tienen diferentes patrones de acceso. ¿Podría alguien elaborar?
Por ejemplo, está mal visto actualizar (sobrescribir) las instrucciones y no es común. Entonces, si diseñas un caché para las instrucciones, puedes optimizarlo para las lecturas. Las instrucciones también son secuenciales, por lo que si la CPU accede a la instrucción en N, es probable que también acceda a la instrucción en N + 1. Sin embargo, esas dos propiedades no pueden ser tan importantes para los cachés de datos, o los cachés de datos tienen que ser mucho más detallados.
Desde here
Las instrucciones y los datos tienen diferentes patrones de acceso y acceso a diferentes regiones de la memoria. Por lo tanto, tener el mismo caché para instrucciones y datos no siempre funciona.
Por lo tanto, es bastante común tener dos cachés: un caché de instrucciones que solo almacena instrucciones y un caché de datos que solo almacena datos.
¿Es intuitivo conocer la distinción entre instrucciones y datos, pero ahora no estoy seguro de la diferencia en este contexto? ¿Qué constituye como datos y se coloca en un caché de datos y qué se constituye como instrucciones y se coloca en un caché de instrucciones?
Conozco la asamblea de ARM. ¿Cualquier cosa que requiera STR
, LDR
, LDMF
o STMFD
usará el caché de datos? Pero técnicamente hablando, STR
, LDR
, LDMF
y STMFD
son todas instrucciones, así que por eso estoy confundido. ¿Deben existir "datos" siempre con una "instrucción"? ¿Se consideran los datos algo en la sección .data
?
Por ejemplo, LDR R1, =myVar
entonces LDR entraría en el caché de instrucciones y el contenido de myVar ingresaría en el caché de datos? ¿O no funciona así?
Las instrucciones y los datos tienen diferentes patrones de acceso. ¿Podría alguien elaborar?
Este comentario que hice en una publicación útil resalta mi dificultad para entender:
"La idea es que si se ha cargado una instrucción de la memoria, es probable que se vuelva a utilizar pronto", pero la única forma de saber la siguiente instrucción es leerla. Eso significa una lectura de memoria (no se puede decir que ya esté en la memoria caché porque una nueva instrucción está en rojo). ¿Así que todavía no veo el punto? Digamos que acaba de suceder una instrucción LDR, así que ahora LDR está en el caché de datos. Tal vez suceda otra instrucción LDR, tal vez no, no podemos estar seguros, así que tenemos que leer la siguiente instrucción, por lo tanto, venciendo el propósito de la caché.
El caché de instrucciones incluiría líneas de caché extraídas de la memoria para su ejecución. El caché de datos incluiría líneas de caché extraídas de la memoria para cargarlas en un registro como datos.
Las recopilaciones de instrucciones se pueden hacer en porciones, asumiendo que la mayor parte del tiempo se ejecutarán muchas instrucciones seguidas. por lo tanto, la obtención de instrucciones puede ser más eficiente, es probable que haya un puñado o más de sobrecarga por transacción y luego la demora para que la memoria tenga los datos listos y luego un reloj por ancho de bus para el tamaño de la transacción. 8 palabras o instrucciones pueden ser, por ejemplo, 5 + n + 8 relojes, que es más eficiente que una instrucción a la vez (5 + 1 + 1) * 8.
Por otro lado, los datos no son tan buenos como para suponer que los datos se leerán de forma secuencial la mayor parte del tiempo, por lo que los ciclos adicionales pueden perjudicar, solo recuperar los datos solicitados (hasta el ancho de la memoria o del bus, ya que es un regalo gratuito). ).
En las ARM que conozco sobre la memoria caché L1 I y D están separadas, L2 están combinadas. L1 no está en el bus axi / amba y es probablemente más eficiente que un acceso que el L2 y más allá de los cuales son amba / axi (unos pocos ciclos de sobrecarga más tiempo más un reloj por ancho de bus de datos para cada transacción).
Para los espacios de direcciones que están marcados como cacheables (si el mmu está activado), L1 y, como resultado, L2 buscará una línea de caché en lugar del elemento individual para los datos y quizás más de una cantidad de datos de I para una búsqueda de instrucciones.
Cada una de sus instrucciones ldr y ldm generarán ciclos de datos que, si la dirección es cacheable, pueden ir a las caches L2 y L1, si es que aún no están allí. la instrucción en sí también si en una dirección almacenable en caché entrará en las memorias caché L2 y L1 si no está ya allí. (sí, hay muchas perillas para controlar lo que se puede almacenar en caché y no, no quiero entrar en esos matices, solo asume que para el debate, todas estas búsquedas de instrucciones y accesos de datos son cacheables).
Desearía guardar las instrucciones que se acaban de ejecutar en el caché en caso de que tenga un bucle o vuelva a ejecutar ese código. Además, las instrucciones que siguen en la línea de caché se beneficiarán de la sobrecarga ahorrada de un acceso más eficiente. pero si solo se ejecuta a través de un pequeño porcentaje de la línea de caché, en general, esos ciclos son un desperdicio, y si eso sucede demasiado, entonces el caché hizo las cosas más lentas.
Una vez que algo está en un caché, la próxima vez que se lee (o se escribe según la configuración), la copia del caché es la que se utiliza, no la copia en la memoria lenta. Eventualmente (dependiendo de la configuración) si la copia de caché de algún elemento se ha modificado debido a una escritura (str, stm) y se debe guardar algún nuevo acceso en la caché, se desaloja uno antiguo a la memoria lenta y se escribe desde El caché para ralentizar la memoria pasa. No tiene este problema con las instrucciones, las instrucciones son básicamente de solo lectura, por lo que no tiene que escribirlas en la memoria lenta, en teoría, la copia de caché y la copia de memoria lenta son las mismas.
ldr r1,=myvar
resultará en una carga relativa de PC
ldr r1,something
...
something: .word myvar
La instrucción ldr será parte de una búsqueda de línea de caché, una búsqueda de instrucciones (junto con un montón de instrucciones más). estos se guardarán en la parte I de la caché L1 en un brazo y la parte compartida de L2 (si está habilitado, etc.). Cuando esa instrucción se ejecute finalmente, la dirección de algo experimentará una lectura de datos, que si el almacenamiento en caché está habilitado en esa área para esa lectura, también ingresará en el caché L2 y L1 (parte D) si aún no está allí. Si recorres y ejecutas esa instrucción de nuevo de inmediato, lo ideal es que la instrucción esté en el caché L1 y que el tiempo de acceso para obtenerla sea muy rápido, un total de pocos relojes. Los datos también estarán en el caché L1 y también habrá un puñado de relojes para leer.
El 5 + n + 8 que mencioné anteriormente, algunos relojes de sobrecarga (5 es solo una posibilidad, puede variar tanto por el diseño como por lo que está sucediendo en paralelo). La N depende de las velocidades de memoria más lentas. esa n es bastante grande para dram, por lo que las cachés l2 y L1 son mucho más rápidas, y es por eso que la caché está ahí para reducir la gran cantidad de ciclos de reloj para cada acceso a dram, eficiente o no.
Teniendo en cuenta, por ejemplo, ARM. Por simplicidad, asumamos:
- VA-> PA es 1: 1 mapeado
- Las propiedades de MMU se configuran en caché y se pueden compartir
- solo hay L1I y L1D y L2D caché
Cuando se ejecuta un núcleo, PC tiene un VA (en lo sucesivo, PA ). En este punto, nadie sabe si el PA tiene datos o instrucciones. Y también, ya que esta es la primera vez que se golpea esta dirección, no habrá ninguna asignación de caché. Así que Hardware buscará en la memoria caché L1 I, L1D y L2D y no encontrará nada.
Pasa por la caminata de la MMU (la MMU no puede encontrar la dirección en TLB también) y finalmente obtiene el contenido de la memoria final. Ahora tenemos el contenido de ese PA que puede ser datos o instrucciones .
asignación en caché :
Cualquier dato que se obtenga en función de la dirección desde la PC se considera una instrucción y se asigna automáticamente en la memoria caché. La unidad de decodificación no se utiliza todavía. Si la unidad de decodificación descubre que su instrucción no es válida, entonces abortará y, por lo tanto, la lógica de anulación / excepción desalojará / invalidará la instrucción de la memoria caché. Además, el motor de captación previa puede obtener las siguientes instrucciones con respecto al PA que se usó anteriormente.
Asignación en caché D :
Una vez que la unidad de decodificación descubre su carga o almacenamiento y pasa el control a la unidad LoadStore, los datos se asignan / recuperan de la caché L1D.
Por lo tanto, la próxima vez que la próxima dirección llegue a la PC y siga a través de la misma cadena, se hará referencia a la dirección actual / se verificará con el contenido en L1I para obtener instrucciones y, siempre que haya un resultado, el contenido de la dirección actual se buscará en la TLB.