2009-03-25 13 views
6

Es posible que un sistema operativo determine si una página de memoria está en DRAM o en swap; por ejemplo, simplemente intente acceder a él y si se produce un error de página, no fue así.Determine si la ubicación de la memoria está en la memoria caché de la CPU

Sin embargo, ¿es lo mismo posible con la memoria caché de la CPU?

¿Hay alguna manera eficiente de saber si una ubicación de memoria determinada se ha cargado en una línea de caché, o para saber cuándo lo hace?

Respuesta

6

En general, no creo que esto sea posible. Funciona para DRAM y el archivo de paginación, ya que es un recurso administrado por el SO, el caché es administrado por la propia CPU.

El sistema operativo podría hacer un ciclo de temporización ajustado de una lectura de memoria y tratar de ver si se completa lo suficientemente rápido para estar en la caché o si tenía que ir a la memoria principal; esto sería muy propenso a errores.

En sistemas multi-core/multi-proc, hay cache coherency protocols que se usan entre procesadores para determinar cuándo deben invalidar las memorias caché de los demás, supongo que podría tener un dispositivo personalizado que husmeara este protocolo que el sistema operativo consultaría.

¿Qué estás tratando de hacer? Si desea forzar algo en la memoria, los procesadores x86 actuales admiten la recuperación previa de memoria en la caché de forma no bloqueante, por ejemplo, con Visual C++ puede usar _mm_prefetch para buscar una línea en la caché.

EDITAR: No he hecho esto yo mismo, por lo tanto, use bajo su propio riesgo. Para determinar errores de caché para creación de perfiles, es posible que pueda utilizar algunos registros específicos de la arquitectura. http://download.intel.com/design/processor/manuals/253669.pdf, el Apéndice A proporciona "Eventos de ajuste de rendimiento". Esto no se puede usar para determinar si una dirección individual está en la memoria caché o cuando está cargada en la memoria caché, pero se puede usar para las estadísticas generales. Creo que esto es lo que usa vTune (un perfilador fenomenal para este nivel).

+0

Gracias. Estoy interesado ya que estoy jugando con la escritura de kernels. Estoy interesado en perfilar fallas en la línea de caché en el hardware real. No me di cuenta de cuán perjudiciales son para las CPU modernas hasta que vi las diapositivas de Herb Sutter: http://is.gd/oWwp –

+0

. Hay formas de hacer un perfil de esto en el hardware, vtune sí. – Michael

+0

Una gran cantidad de CPU modernas tienen contadores de rendimiento que pueden proporcionar todo tipo de información, incluidas las estadísticas relacionadas con la caché. – sigjuice

6

Si intenta determinar esto usted mismo, el solo hecho de ejecutar su programa podría invalidar las líneas de caché relevantes, por lo tanto, hacer que sus mediciones sean inútiles.

Este es uno de esos casos que refleja el principio científico de que no se puede medir algo sin afectar lo que se está midiendo.

+0

Bueno, es muy fácil verificar que una ubicación * esté * en el caché. Solo leedlo, y listo, estará en el caché. ;) El truco está en probar si algo * no * está en la caché. :) – jalf

+1

Si se asegura de que su código se ejecute desde la memoria que no se puede descartar, el mero hecho de ejecutar un programa no afectará la caché. –

+0

Buenos puntos. Así que, básicamente, tendría que dar cuenta de todo lo demás que podría pasar para saber si un caché extravió o no la memoria en cuestión. –

1

X86 no sé cómo saber si la dirección está en la memoria caché pero aquí es cómo saber si la dirección estaba en caché

rdtsc 
save timestamp 
mov eax,address 
rdtsc read timestamp counter 
calculate timestamp difference 
if < threshold then was in cache 

umbral tiene que ser determinado a partir de la documentación o empíricamente

algunas máquinas tener contadores de caché de hit/miss que servirían igualmente bien

Cuestiones relacionadas