miércoles, 7 de enero de 2009

Control de caches de memoria

Las arquitecturas Intel 64 y IA-32 soportan cache, TLBs (translation look aside buffers), y un buffer de reserva para el almacenamiento temporal en el chip de instrucciones y datos. Todas las unidades se conectan al bus (en P4 y Xeon), pero cada una tiene características específicas de la máquina y pueden ser cambiadas en futuras versiones del procesador. La instrucción CPUID retorna las características de los caches y buffers del procesador que la ejecuta.
Los procesadores IA-32 y Intel 64 implementan 4 tipos de caches; los trace caches, los caches de nivel 1, los de nivel 2, y los de nivel 3.
Los procesadores basados en la microarquitectura Intel Core implementa un nivel de instrucciones TLB y dos niveles de datos TLB. Intel Core i7 proporciona un segundo nivel unificado TLB. El buffer de almacenamiento está asociado con las unidades de ejecución de instrucciones del procesador. Permite escribir en la memoria del sistema y/o en el cache interno para guardar y en algunos casos se combinan para optimizar el acceso al bus del procesador. Este buffer de almacenamiento siempre está activo en todos los modos de ejecución. Las caches del procesador son, la mayor parte, transparente para el software. Cuando se activan, los hilos de instrucciones y datos fluyen a través de ellas sin la necesidad de software explícito de control. Sin embargo, el conocimiento del comportamiento de estas caches será útil en la optimización del rendimiento del software. En sistemas MP el mantenimiento de la consistencia del cache, puede requerir en raras circunstancias, intervención por parte del software del sistema. Para estos casos, el procesador proporciona instrucciones de control de cache privilegiadas.
Los procesadores IA-32 y Intel 64 usan el protocolo de cache MESI (modified, exclusive, shared, invalid) para mantener la consistencia con caches internas y caches en otros procesadores. Cuando el procesador reconoce que se lee un operando desde memoria, y que es cacheable, se lee una linea cache entera en el cache apropiado. Esta operación se llama 'cache fill'. Si la posición de memoria que contiene el operando está casi cacheada en el tiempo siguiente que el procesador intenta acceder al operando, el procesador puede leer el operando desde la cache en vez de tener que volver atrás en memoria. Esta operación se llama 'cache hit'. Cuando el procesador intenta escribir un operando en un área cacheable de la memoria, primero comprueba si una línea existe en la cache para esa posición de memoria. Si existe, el procesador puede escribir el operando en la cache en lugar de escribirlo en la memoria del sistema. Esta operación se llama 'write hit'. Cuando se opera con sistemas MP, los procesadores IA-32 y Intel 64 tienen la capacidad de manipular los accesos de los otros procesadores a la memoria del sistema y a sus caches internas. Esto lo usan para mantener sus caches internas consistentes con la memoria del sistema y con los caches en los otros procesadores del bus.
En el cache de datos L1 y en los caches L2/L3 unificados, el protocolo de caches MESI mantiene la consistencia con los caches de los otros procesadores. El L1 y el L2/L3 tienen dos banderas de estado MESI por línea de cache. En general, la operación que realiza MESI es transparente a los programas.
Las arquitecturas IA-32 y Intel 64 proporcionan una variedad de mecanismos para controlar el cacheo de datos y instrucciones y para controlar el orden de lectura y escritura entre en procesador, las caches, y la memoria. Estos mecanismos se pueden dividir en dos grupos:
- Registros y bits de control de las caches: Se definen varios registros dedicados y varios bits contenidos en registros de control y entradas de tablas de paginación y de directorios que controlan el sistema de cacheo de localizaciones en memoria en las caches L1, L2 y L3. Estos mecanismos controlan el cacheo de páginas de memoria virtual y de regiones de memoria física.
- Instrucciones de ordenación de memoria y de control de caches: Se proporcionan varias instrucciones que controlan el cacheo de los datos, la ordenación de la lectura y escritura en memoria, y la precarga de los datos. Estas instrucciones permiten al software controlar el cacheo de estructuras específicas de datos, controlar la coherencia de la memoria en localizaciones específicas, y forzar ordenación en memoria en localizaciones específicas en un programa.
Una escritura a una localización de memoria en un segmento de código que ha sido cacheado actualmente en el procesador causa la invalidación de la línea o líneas de la cache. Esta comprobación esta basada en la dirección física de la instrucción.
El cacheo implícito ocurre cuando un elemento de la memoria se hace potencialmente cacheable, aunque el elemento puede que nunca haya sido accedido en una secuencia normal von Neumann. Ocurre cuando el procesador realiza precargas agresivas, predicción de branch, y TLB miss handling. Para evitar problemas relacionados con el cacheo implícito, el sistema operativo debe invalidar explícitamente el cache cuando se hacen cambios en datos cacheados que no son administrados automáticamente por el mecanismo de coherencia de cache. Esto incluye escribir al board de memoria de doble puerto o memoria física aliased que no sea detectada por el mecanismo de snooping del procesador, y los cambios en las entradas de las tablas de paginación en memoria.
El procesador actualiza sus caches de traducción de direcciones (TLBs) transparentemente al software. La instrucción INVLPG invalida la TLB para una página específica. Esta instrucción es la más eficiente cuando el software solo necesita invalidar una página específica, porque aumenta el rendimiento frente a invalidar toda la TLB. Esta instrucción no afecta al estado de la bandera G en un directorio de paginación o en una entrada de la tabla de paginación.
Los IA-32 y Intel 64 guardan temporalmente cada escritura a memoria en un buffer. Este buffer aumenta el rendimiento del procesador permitiéndole continuar ejecutando instrucciones sin tener que esperar hasta que se complete la escritura a memoria o a una cache. También permite retrasar escrituras para un uso mas eficiente de los ciclos de bus de acceso a memoria. En general, la existencia de este bus es transparente al software, incluso en sistemas MP. El procesador se asegura de que las operaciones de escritura se lleven a cabo en el orden del programa.
Los registros de rangos de tipos de memoria (MTRRs) proporcionan un mecanismo de asociación de tipos de memoria con rangos de direcciones físicas en la memoria del sistema. Permiten al procesador optimizar operaciones para diferentes tipos de memoria, como RAM, ROM, memoria frame-buffer, o dispositivos de E/S mapeados en memoria. También simplifican el diseño del hardware del sistema eliminando los pines de control de memoria usados para esta función. Después de un reset de hardware, el procesador desactiva todos los MTRRs, y esto provoca que la memoria física no sea cacheable. La inicialización del software debe activar los MTRRs a un mapa de memoria específico y definido en el sistema. Entonces el sistema operativo es libre de modificar el mapa de memoria usando los atributos de los caches de nivel de páginas normales. En sistemas MP cada procesador tiene que usar, obligatoriamente, un mapa de memoria MTRR idéntico para que el software tenga una visión consistente de la memoria. No existe hardware para mantener esta consistencia, pero en general los valores de los MTRR de cada procesador deben ser iguales. La capacidad de MTRR se determina ejecutando la instrucción CPUID y leyendo el estado de la bandera MTRR en el registro EDX.

No hay comentarios: