2009-11-18 28 views
43

Estoy interesado en forzar el vaciado de caché de CPU en Windows (por razones de evaluación comparativa, quiero emular el inicio sin datos en la memoria caché de la CPU), preferiblemente una implementación C básica o una llamada Win32.¿Cómo puedo hacer un vaciado de la caché de la CPU en Windows x86?

¿Hay una forma conocida de hacer esto con una llamada al sistema o incluso algo tan furtivo como decir un gran memcpy?

plataforma Intel i686 (P4 y más está bien también).

Respuesta

49

Afortunadamente, hay más de una manera para eliminar de manera explícita los cachés.

La instrucción "wbinvd" escribe de nuevo el contenido de caché modificado y marca las cachés vacías. Ejecuta un ciclo de bus para hacer que los cachés externos limpien sus datos. Desafortunadamente, es una instrucción privilegiada. Pero si es posible ejecutar el programa de prueba en algo parecido a DOS, este es el camino a seguir. Esto tiene la ventaja de mantener la huella de caché del "SO" muy pequeña.

Además, existe la instrucción "invd", que invalida las memorias caché sin volviendo a enjuagarlas a la memoria principal. Esto viola la coherencia de la memoria principal y el caché, por lo que debes encargarte de eso. No realmente recomendado.

Para la evaluación comparativa, la solución más simple es probablemente copiar un bloque de memoria grande en una región marcada con WC (combinación de escritura) en lugar de WB. La región de memoria asignada de la tarjeta gráfica es un buen candidato, o puede marcar una región como WC por usted mismo a través de los registros MTRR.

se pueden encontrar algunos recursos sobre la evaluación comparativa de las rutinas cortas en Test programs for measuring clock cycles and performance monitoring.

+1

Ohh, estoy en lo correcto, limpio. No sabía acerca de esta instrucción. – Falaina

+1

¡La instrucción wbinvd toma del orden de 2000-5000 ciclos de reloj para completarse! La mayoría de las instrucciones toman 2-5, en promedio. – unixman83

7

Hay instrucciones de ensamblaje x86 para forzar a la CPU a enjuagar ciertas líneas de caché (como CLFLUSH), pero son bastante oscuras. CLFLUSH, en particular, solo vacía una dirección elegida de cachés L1.

algo tan furtivo como hacer decir una gran memcopy?

Sí, este es el enfoque más simple, y se asegurará de que la CPU vacíe todos los niveles de caché. Simplemente excluya el tiempo de descarga de la memoria caché de sus benchmakrs y debe tener una buena idea de cómo funciona su programa bajo la presión de la memoria caché.

+1

"se asegurará de que el agua de la CPU todos los niveles de caché." No es verdad, como indiqué, la CPU comercial moderna, especialmente cuando se abstrae por un sistema operativo, puede (y probablemente lo haga) tener estrategias de almacenamiento en caché muy complicadas. – marr75

+4

Creo que está confundiendo la memoria caché de la CPU con otras cachés de nivel de sistema operativo. El sistema operativo básicamente no tiene voz en lo que la CPU guardará en caché o no, porque estas decisiones deben suceder tan rápido, no hay tiempo para las interrupciones del kernel ni nada por el estilo. La memoria caché de la CPU se implementa puramente en silicio. – intgr

+1

Un cambio de contexto permitirá que otros procesos se ejecuten y contaminen la caché. Pero esto es parte normal del comportamiento del sistema operativo: tendrá lugar con o sin el punto de referencia, por lo que tiene sentido incluir esto en sus tiempos de todos modos. – intgr

2

Desafortunadamente, no hay forma de eliminar explícitamente el caché. Algunas de sus opciones son:

1.) Agite la memoria caché realizando algunas operaciones de memoria muy grandes entre las iteraciones del código que está evaluando.

2.) Habilite la Deshabilitación de la caché en el x86 Control Registers y compare ese punto. Esto probablemente también deshabilitará el caché de instrucciones, que puede no ser lo que usted desea.

3.) Implemente la parte de su código su evaluación comparativa (si es posible) usando Non-Temporal instructions. Sin embargo, estos son solo insinuaciones al procesador sobre el uso de la memoria caché, todavía es libre de hacer lo que quiera.

1 es probablemente la más fácil y suficiente para sus propósitos.

Edición: Vaya, mi error no es una instrucción para invalidar la caché X 86, véase la respuesta de drhirsch

+1

Su afirmación de que no hay instrucciones para la limpieza del caché es incorrecta. Y volver a escribir una rutina usando instrucciones no temporales para la evaluación comparativa es una tontería. Si los datos que usa la rutina encajan en las memorias caché, se ejecutarían mucho más lentamente durante la evaluación comparativa, lo que haría que las mediciones carezcan de valor. – hirschhornsalz

+0

No hay forma de eliminar explícitamente el caché de Windows. Se le niega el acceso directo al hardware ... hay instrucciones de montaje no portátiles que pueden hacerlo. – marr75

+2

Puede hacerlo fácilmente en Windows 95,98, ME. E incluso para las variantes de Windows modernas, puede implementarlo en el anillo 0 utilizando un controlador. – hirschhornsalz

Cuestiones relacionadas