2012-01-13 7 views
6

¿Es posible crear explícitamente objetos estáticos en la memoria caché de la CPU, para asegurarse de que esos objetos permanezcan siempre en la memoria caché para que no se llegue a ningún impacto en la memoria RAM o Dios lo prohíbe, memoria virtual hdd?Asigne memoria estática en la memoria caché de la CPU en c/C++: ¿es posible?

Estoy particularmente interesado en dirigirme a la memoria caché compartida L3 grande, sin intentar apuntar a L1, L2, instrucción ni a ninguna otra caché, solo la caché de memoria más grande que existe.

Y solo para aclarar para diferenciar de otros hilos que busqué antes de publicar esto, no estoy interesado en privatizar todo el caché, solo unas pocas, pequeñas clases de región.

+2

Creo que lo mejor que puedes hacer es usar la macro [__builtin_prefetch macro] de GCC (http://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Other-Builtins.html). La memoria caché IIRC no es direccionable por código, la CPU se las arregla sola (al menos en x86). –

+1

¿Qué tipo de procesador? Algunas arquitecturas tienen instrucciones para dar sugerencias de caché o dirigir capturas previas de caché antes de que se necesiten datos. – TJD

+1

corto anwer: no no puedes. Lo único que puede hacer es mantener apretada la localidad de referencia. No salte de un lado a otro en la memoria, pero intente acceder a los datos que están cerca de los datos a los que se accedió en la operación anterior. Además: mantener sus datos alineados en los límites de la memoria caché puede ayudarlo a evitar otra búsqueda en la memoria caché. Por cierto, las ranuras * de caché * no tienen que ser consecutivas. En x86, hay IIRC cuatro ranuras L1 y cientos o miles de ranuras L2. (que debe compartir con otros procesos en una máquina multiproceso). – wildplasser

Respuesta

12

No. La memoria caché no es direccionable, por lo que no puede asignar objetos en ella.

Lo que parece que pretendes preguntar es: Habiendo asignado espacio en la memoria virtual, ¿puedo asegurarme de que siempre obtengo los toques de caché?

Esta es una pregunta más complicada, y la respuesta es: en parte.

Definitivamente puede evitar ser intercambiado a un disco, utilizando la API de administración de memoria de su sistema operativo (por ejemplo, mlock()) para marcar la región como no paginable. O bien, asigne desde "grupo no paginado" para comenzar.

No creo que haya una API similar para fijar la memoria en la memoria caché de la CPU. Incluso si pudieras reservar la memoria caché de la CPU para ese bloque, no puedes evitar errores de caché. Si otro núcleo escribe en la memoria, se transferirá la propiedad y sufrirá un error de caché y una transferencia de bus asociada (posiblemente a la memoria principal, posiblemente a la memoria caché del otro núcleo).

Como menciona Mathew en su comentario, también puede forzar que el error de caché ocurra en paralelo con otro trabajo útil en la tubería, para que los datos estén en caché cuando lo necesite.

1

Puede ejecutar otro hilo que pase por encima de los datos y lo traiga a la caché L3.

Cuestiones relacionadas