Esta respuesta es adicional a lo que Shekhar Upadhaya ha dicho aquí claramente.
La explicación del laico:
Imagine un empleado de uno de nuestros gobiernos “realmente eficientes”. oficinas. Está sentado allí en su escritorio con todo tipo de papeles tirados. Hay un cajón para el escritorio donde guarda un fajo de papeles más grande y puedes ver un gran armario de Godrej detrás de él donde tiene toneladas de papeles, ¡con Dios solo sabe a qué se remonta antes de la independencia!
Vas a él y le dices: “Hola amigo, ¿podrías traerme el ABC de papel?”. ¿Qué responde él? Él dice : “Oh, sí, ABC, ¿verdad? ¡Creo que acabo de ver eso aquí en la mesa! ” . Busca entre los 64 papeles que yacen sobre el escritorio y levanta un papel, lo mira de reojo, se golpea la frente y dice: “¡Arey! Fue ABD! ¡No ABC! ” “Espera, pero realmente creo que lo vi hace un par de días , debe estar aquí mismo “. Luego se agacha, abre el cajón del escritorio y
saca un paquete de aproximadamente 512 papeles, lo pone sobre la mesa y procede a escanearlos. Después de un par de minutos, dice : “Señor, no está aquí también. Por favor, ven mañana “. Pero tú dices: ” Por favor, es un asunto urgente “. Él te mira con disgusto, mira el reloj, murmura algo, y de mala gana se levanta y se dirige al armario. Puedes ver claramente que hay ¡8000 papeles allí! Los revisa y saca un documento, tosiendo y estornudando, por todo el polvo que gira, y le entrega su papel. Él dice : “Si eso no estuviera allí, ¡Hubiéramos tenido que ir a la habitación de atrás y buscar alrededor de 2 millones de documentos! “ . Lo miras, gracias a Dios y sales de allí antes de que el empleado tenga tiempo para pensar en “transacciones monetarias” .
Epílogo de la historia:
Aquí, el empleado es el procesador. El espacio en la parte superior de la tabla que puede contener esos 64 papeles (kB) y está más cerca de él y se puede buscar más rápido es el caché L1. El espacio en su cajón que puede contener una mayor cantidad de documentos (512kb) y lleva un poco más de tiempo buscar es el caché L2. El armario detrás de él que tiene una capacidad de almacenamiento aún mayor (8000kB) es el caché L3. El cuarto de almacenamiento con la mayor capacidad (2GB aquí) es la RAM.
La explicación del técnico:
Los cachés L1, L2 y L3 son agrupaciones de memoria diferentes similares a la RAM en una computadora. Se incorporaron para disminuir el tiempo que tarda el procesador en acceder a los datos. Este tiempo tomado se llama latencia. La arquitectura con la que están construidos también difiere considerablemente. Por ej. El caché L1 está construido con transistores más grandes y pistas metálicas más anchas, intercambiando espacio y potencia por velocidad. Las cachés de nivel superior están más compactas y usan transistores más pequeños.
Hay otras complejidades en la historia, como el hecho de que otros empleados (procesadores) pueden abrir y buscar (tiene acceso a) el armario (caché L3).
Los tiempos de acceso a los datos en estas memorias son generalmente del orden de nanosegundos y realmente no hacen una diferencia para el usuario promedio. Pero para los científicos / programadores que desarrollan / usan programas que procesan una gran cantidad de datos, es importante. ¡Hacen una gran diferencia en el orden de días o meses, incluso!
Para los realmente geek:
En un sistema Linux puede averiguar cuál es su tamaño de caché utilizando el comando lscpu
o comprobando el archivo cpuinfo en el directorio proc utilizando el comando cat /proc/cpuinfo
Busque el campo titulado tamaño de caché ; este suele ser el tamaño de caché L3 para los procesadores más nuevos.
Una de las prácticas que uso ampliamente en mis códigos para aumentar el rendimiento es el bloqueo de bucle . Intel prescribe la práctica y tiene una página bien explicada al respecto aquí: Cómo usar el bloqueo de bucle para optimizar el uso de la memoria en la arquitectura Intel® de 32 bits
Aquí hay un fragmento de código (de la página web anterior) para agregar una matriz ‘A’ a la transposición de otra matriz ‘B’, antes y después del bloqueo del bucle:
Antes de:
flotante A [MAX, MAX], B [MAX, MAX]
para (i = 0; i
Después:
flotador A [MAX, MAX], B [MAX, MAX];
para (i = 0; i
Suponiendo que está escrito en C (que almacena las matrices en fila). Lo que hace el código anterior es dividir la matriz en matrices más pequeñas que caben dentro del caché L1. El parámetro 'block_size' se elige de modo que cada fila de A y cada columna de B sea acomodada por el caché L1 durante una iteración. Por lo tanto, la latencia disminuye y el rendimiento aumenta.
Imagen cortesía: http://www.thehindu.com