miércoles, 13 de mayo de 2015

Memoria Caché


Memorias Cache

Etimología

La palabra procede de la voz inglesa cache (/kæʃ/; «escondite secreto para guardar mercancías, habitualmente de contrabando») y esta a su vez de la francesa cache, (/kaʃ/; «escondrijo o escondite»). A menudo, en español se escribe con tilde sobre la «e» del mismo modo como el que se venía escribiendo con anterioridad al neologismo la palabra «caché» («distinción o elegancia» o «cotización de un artista»), proveniente de un étimo también francés, pero totalmente distinto: cachet, (/ka'ʃɛ/; «sello» o «salario»).
La Real Academia Española, en el Diccionario de la lengua española sólo reconoce la palabra con tilde,aunque en la literatura especializada en Arquitectura de computadoras (por ejemplo, las traducciones de libros de los autores Andrew S. Tanenbaum, John L. Hennessy y David A. Patterson) se emplea siempre la palabra sin tilde por ser anglosajona y debería escribirse en cursiva (cache).

Introduccion

Cuando en informática se habla de memoria caché o cache se está hablando de aquella cantidad de información que permanece de manera temporal en la computadora y que ayuda a la adquisición de velocidad y eficiencia cuando es necesario recurrir a determinado tipo de datos. El nombre de memoria cache proviene del francés, que significa “escondido” u “oculto”.

Concepto

Una memoria caché es una memoria en la que se almacenas una serie de datos para su rápido acceso. Existen muchas memorias caché (de disco, de sistema, incluso de datos, como es el caso de la caché de Google), pero en este tutorial nos vamos a centrar en la caché de los procesadores. Básicamente, la memoria caché de un procesador es un tipo de memoria volátil (del tipo RAM), pero de una gran velocidad. En la actualidad esta memoria está integrada en el procesador, y su cometido es almacenar una serie de instrucciones y datos a los que el procesador accede continuamente, con la finalidad de que estos accesos sean instantáneos. Estas instrucciones y datos son aquellas a las que el procesador necesita estar accediendo de forma continua, por lo que para el rendimiento del procesador es imprescindible que este acceso sea lo más rápido y fluido posible.

Historia

Desde la aparición en el mercado de procesadores con frecuencia de reloj de 25 o incluso 33 MHz o mas, una memoria de trabajo constituida por RAM dinámica ya no esta preparada para satisfacer las exigencias de la CPU en términos de tiempo de acceso. Con esas frecuencias, el procesador se ve forzado a aguardar continuamente hasta que la memoria de trabajo reaccione, lo cual conlleva que su capacidad operativa no sea aprovechada al máximo. En principio, la memoria de trabajo debería poder ser sustituida completamente por componentes estáticos de RAM que permitiesen intervalos de acceso bastante más breves. Pero esto seria demasiado caro. Por eso, en los casos en relación a equipos 386 y 486 de altas frecuencias, se ha recurrido a un método que ya se utilizaba en las gigantescas computadoras de los años setenta:  la instalación de una RAM cache externa. "Externa" quiere decir, en este contexto, que se sitúa fuera de la CPU, en su entorno y unida a ella por el sistema bus. En los 486, la memoria caché, que estamos describiendo recibe también el nombre de "caché, de segundo nivel", se ubica físicamente sobre la placa madre y consta de una serie de componentes est ticos de RAM con una capacidad de 64 o 256 kilobits. Así pues, con este procedimiento pueden obtenerse cachés de 64 o 256 kilobytes, tamaño bastante inferior al de la memoria de trabajo. La vigilancia de la memoria caché corre a cargo del controlador caché 82385 de Intel.  


Tipos

Hay tres tipos diferentes de memoria caché para procesadores:
  • Caché de 1er nivel (L1): Esta caché está integrada en el núcleo del procesador, trabajando a la misma velocidad que este. La cantidad de memoria caché L1 varía de un procesador a otro, estando normalmente entra los 64KB y los 256KB. Esta memoria suele a su vez estar dividida en dos partes dedicadas, una para instrucciones y otra para datos. 
  • Caché de 2º nivel (L2): Integrada también en el procesador, aunque no directamente en el núcleo de este, tiene las mismas ventajas que la caché L1, aunque es algo más lenta que esta. La caché L2 suele ser mayor que la caché L1, pudiendo llegar a superar los 2MB. A diferencia de la caché L1, esta no está dividida, y su utilización está más encaminada a programas que al sistema. 
  • Caché de 3er nivel (L3): Es un tipo de memoria caché más lenta que la L2, muy poco utilizada en la actualidad. En un principio esta caché estaba incorporada a la placa base, no al procesador, y su velocidad de acceso era bastante más lenta que una caché de nivel 2 o 1, ya que si bien sigue siendo una memoria de una gran rapidez (muy superior a la RAM, y mucho más en la época en la que se utilizaba), depende de la comunicación entre el procesador y la placa base.
Para hacernos una idea más precisa de esto, imaginemos en un extremo el procesador y en el otro la memoria RAM. Pues bien, entre ambos se encuentra la memoria caché, más rápida cuanto más cerca se encuentre del núcleo del procesador (L1). Las memorias caché son extremadamente rápidas (su velocidad es unas 5 veces superior a la de una RAM de las más rápidas), con la ventaja añadida de no tener latencia, por lo que su acceso no tiene ninguna demora... pero es un tipo de memoria muy cara. Esto, unido a su integración en el procesador (ya sea directamente en el núcleo o no) limita bastante el tamaño, por un lado por lo que encarece al procesador y por otro por el espacio disponible.
En cuanto a la utilización de la caché L2 en procesadores multinucleares, existen dos tipos diferentes de tecnologías a aplicar. Por un lado está la habitualmente utilizada por Intel, que consiste en que el total de la caché L2 está accesible para ambos núcleos y por otro está la utilizada por AMD, en la que cada núcleo tiene su propia caché L2 dedicada solo para ese núcleo. La caché L2 apareció por primera vez en los Intel Pentium Pro, siendo incorporada a continuación por los Intel Pentium II, aunque en ese caso no en el encapsulado del procesador, sino externamente (aunque dentro del procesador).
De: http://www.monografias.com/trabajos82/que-es-memoria-cache-procesador/que-es-memoria-cache-procesador2.shtml

Diseño
El sistema de memoria cache está diseñado especialmente para servir al apropiado y organizado almacenamiento de información en una computadora. Su función es básicamente mantener de manera temporal y accesible aquellos datos que son requeridos para realizar determinadas funciones o tareas. Esta disponibilidad permite que cada programa o archivo tenga inmediato acceso a la información necesaria y pueda así dedicarse a subir el nivel de eficiencia de las funciones normales. De tal modo, la memoria principal cuenta con una gran ayuda que le permite adquirir mayor velocidad de desempeño y mejores resultados por fuera de sus limitadas capacidades.
En el diseño de la memoria caché se deben considerar varios factores que influyen directamente en el rendimiento de la memoria y por lo tanto en su objetivo de aumentar la velocidad de respuesta de la jerarquía de memoria. Estos factores son las políticas de ubicación, extracción, reemplazo y escritura.

Política de ubicación

Decide dónde debe colocarse un bloque de memoria principal que entra en la memoria caché. Las más utilizadas son:
  • Directa: al bloque i-ésimo de memoria principal le corresponde la posición i módulo n, donde n es el número de bloques de la memoria caché. Cada bloque de la memoria principal tiene su posición en la caché y siempre en el mismo sitio. Su inconveniente es que cada bloque tiene asignada una posición fija en la memoria caché y ante continuas referencias a palabras de dos bloques con la misma localización en caché, hay continuos fallos habiendo sitio libre en la caché.
  • Asociativa: Los bloques de la memoria principal se alojan en cualquier bloque de la memoria caché, comprobando solamente la etiqueta de todos y cada uno de los bloques para verificar acierto. Su principal inconveniente es la cantidad de comparaciones que realiza.
  • Asociativa por conjuntos: Cada bloque de la memoria principal tiene asignado un conjunto de la caché, pero se puede ubicar en cualquiera de los bloques que pertenecen a dicho conjunto. Ello permite mayor flexibilidad que la correspondencia directa y menor cantidad de comparaciones que la totalmente asociativa.

Política de extracción

La política de extracción determina cuándo y qué bloque de memoria principal hay que traer a memoria caché. Existen dos políticas muy extendidas:
  • Por demanda: un bloque sólo se trae a memoria caché cuando ha sido referenciado y no se encuentre en memoria caché.
  • Con prebúsqueda: cuando se referencia el bloque i-ésimo de memoria principal, se trae además el bloque (i+1)-ésimo. Esta política se basa en la propiedad de localidad espacial de los programas.

Política de reemplazo

Determina qué bloque de memoria caché debe abandonarla cuando no existe espacio disponible para un bloque entrante. Básicamente hay cuatro políticas:
  • Aleatoria: el bloque es reemplazado de forma aleatoria.
  • FIFO: se usa el algoritmo First In First Out (FIFO) (primero en entrar primero en salir) para determinar qué bloque debe abandonar la caché. Este algoritmo generalmente es poco eficiente.
  • Menos recientemente usado (LRU): Sustituye el bloque que hace más tiempo que no se ha usado en la caché, traeremos a caché el bloque en cuestión y lo modificaremos ahí.
  • Menos frecuencias usadas (LFU): Sustituye el bloque que ha experimentado menos referencias.

Política de Actualización o Escritura

Determinan el instante en que se actualiza la información en memoria principal cuando se hace una escritura en la memoria caché.
  • Escritura Inmediata: Se escribe a la vez en Memoria caché y Memoria principal. Desventaja: genera cuello de botella.
  • Escritura Aplazada: Actualiza únicamente la Memoria caché luego de la modificación de sus datos. Cuando el bus de sistema se encuentra libre, actualiza la memoria principal. Esto puede generar que los periféricos lean datos erróneos, pero es poco frecuente.
  • Escritura Obligada: Actualiza únicamente la Memoria caché luego de la modificación de sus datos. Cuando no hay otra alternativa, actualiza la memoria principal. Esto puede producirse por cualquiera de estas causas:
  1. Se accede a la posición de memoria principal modificada en la caché. Antes de permitir la lectura/escritura, debe actualizarse el dato en la memoria principal.
  2. Debe eliminarse una línea de la caché, entonces se actualiza la memoria principal (en caso de ser necesario) antes de proceder a la eliminación.
    De: http://es.wikipedia.org/wiki/Cach%C3%A9_%28inform%C3%A1tica%29#Dise.C3.B1o

Estructura

La memoria cache se estructura normalmente en pequeños campos donde se guardan los datos necesarios (hasta un byte de espacio por cada campo o celda). Puede tener lugar como parte integrante de la memoria principal como también puede estar emplazada por fuera de ella y activarse de manera autónoma. A través del método del hit rate o del promedio de pedidos que recibe cada dato, se establece un orden de los elementos más requeridos y que por tanto pasan a estar a mayor disponibilidad, borrándose eventualmente aquellos que no vuelvan a ser utilizados.

Cuando uno habla de la memoria cache de disco está haciendo referencia a un proceso similar al de la memoria cache RAM que se produce en la misma memoria principal. Este procedimiento es otro modo de implementar el sistema de memoria cache evitando usar la lenta memoria del disco duro pero manteniendo activo su interior y proveyéndole con datos de manera mucho más directa.

De: http://www.definicionabc.com/memoria-cache.php

¿Por qué AMD ya no puede alcazar a intel?

En la época de los Pentium 4 de intel, AMD tomó la delantera en métricas
de los procesadores como el rendimiento o el consumo gracias a sus athlon de  arquitectura k7 y k8. Esto se debía a dos razones. Una por parte de intel y la otra por la coyuntura de la época en procesos de fabricación.
Con los pentium 4 intel tenía como meta alcanzar enormes velocidades de reloj con sus procesadores. En aquella época en intel se hablaba de 10ghz. Para llegar a esa cifra hay que escoger ciertas decisiones de diseño en el procesador que faciliten la subida en la velocidad de reloj. Las más típicas son el aumentar la latencia de las memorias caché o aumentar las etapas del pipeline del procesador para que la ejecución de cada etapa dure lo menos posible y así poder subir más la frecuencia. Estas decisiones de diseño tienen desventajas.
El aumentar la latencia de la memoria caché hace que los accesos a esta sean como es lógico más lentos y se pierdan ciclos de reloj esperando una respuesta de la caché. El aumentar las etapas del procesador no tendría desventajas si hablásemos de unas condiciones ideales en las que el 100% de las instrucciones se ejecutan correctamente. Para ahorrar accesos a la caché e indirectamente a la memoria RAM, la unidad de control de los procesadores muchas veces manda a ejecución en un procesador cosas que cree que debería estar ejecutando. Mediante estudios estadísticos que la unidad de control va haciendo durante la ejecución de los programas, la unidad de control puede adivinar con gran precisión muchos aspectos que definen el cómo se va a procesar algo en el propio procesador. Como esto igual es un poco abstracto, voy a poner un ejemplo:
  1. Estamos en un programa que en un momento dado entra en un bucle. Si el procesador tuviese que mirar en cada vuelta del bucle las vueltas que faltan para que este acabe, se perdería tiempo por el camino. La unidad de control por lo tanto, intenta predecir las vueltas que dará ese bucle.
  2. En una parte de un programa se da una condición (la del bucle mismamente que hace que se continúe dando vueltas dentro del bucle o se salga de él) que según su resultado hace que la ejecución de ese programa salte a un lado o a otro. La unidad de control intentará predecir ese salto.
  3. Si el predictor de saltos ha funcionado bien, se continúa con normalidad pero, ¿qué pasa si falla?
El el caso de fallo habría que echar atrás todo el pipeline ya que habría que volver a ejecutar ese bucle para que saque el resultado correcto de su ejecución. Se vaciaría todo el pipeline porque no se podría asegurar que alguna de las instrucciones que venía por detrás no utilizase ese resultado para alguno de sus operandos. Es cierto que existen técnicas para reducir esta penalización como la ejecución de instrucciones fuera de orden o en menor medida la tecnología propietaria de intel que llama HyperThreading, pero en aquella época esto no estaba tan desarrollado y esta penalización se juntaba con la latencia de la caché y un acceso a memoria lento, de unos 230 ciclos de reloj.

De: http://www.xataka.com/respuestas/el-eterno-dilema-procesador-amd-o-intel

Ancajima Mendoza María Alejandra- Ingenieria de Sistemas