He estado leyendo Ulrich Drepper, "What every programmer should know about memory" y en la sección 3.3.2 Measurements of Cache Effects (en la mitad de la página) me da la impresión de que acceder a cualquier miembro de una estructura provoca que toda la estructura se arrastre a la memoria caché de la CPU.¿El acceso a un único miembro de la estructura arrastra toda la estructura al caché?
¿Es esto correcto? Si es así, ¿cómo sabe el hardware sobre el diseño de estas estructuras? ¿O el código generado por el compilador fuerza de algún modo que se cargue toda la estructura?
O son las desaceleraciones del uso de estructuras más grandes, principalmente debido a la TLB causados por las estructuras que se extendían a través de más páginas de memoria?
El struct ejemplo utilizado por Drepper es:
struct l {
struct l *n;
long int pad[NPAD];
};
Dónde sizeof(l)
se determina por NPAD
es igual a 0, 7, 15 o 31 que resulta en estructuras que son 0, 56, 120, y 248 bytes aparte y suponiendo líneas de caché de 64 bytes y páginas de 4k.
Sólo iteración a través de la lista enlazada se pone significativamente más lento que la estructura crece, a pesar de que nada más que el puntero se está accediendo realidad.
Esto es exactamente correcto. El concepto sofisticado aquí es la localidad de referencia. – jason
Entonces, cuando dices "extenderse a través de más líneas de caché" te refieres a que parte de la ralentización resulta de la captación previa de las partes no utilizadas de la estructura circundante, además de las fallas TLB. –
@Robert: Creo que podría aplicarse de dos maneras diferentes: 1. Una sola estructura es tan grande que no cabe cómodamente en una única página de caché. Si "lo tocaste todo" (suena sucio), probablemente causaría varias recuperaciones de página. 2. Con una estructura más grande, obtienes menos estructuras en la memoria caché con cualquier lectura de página de caché individual, lo que aumenta la probabilidad de que la * siguiente * estructura que deseas no esté en la memoria caché. Un problema fundamental aquí es * localidad de referencia *. Si te saltas la memoria, vas a tener más fallas en la memoria caché. Comprenda su patrón de acceso y diseñe en consecuencia. –