¿Cómo puedo hacer un vaciado de caché de CPU en Windows x86?

Estoy interesado en forzar el vaciado de la memoria caché de la 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.

¿Hay una manera conocida de hacer esto con una llamada al sistema o incluso algo tan furtivo como hacer una memcpy grande?

Plataforma Intel i686 (P4 y arriba también está bien).

Afortunadamente, hay más de una forma de eliminar explícitamente los cachés.

La instrucción “wbinvd” escribe de nuevo el contenido del caché modificado y marca los cachés vacíos. 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 progtwig 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 volver a tirarlas 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 fines de 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.

Puede encontrar algunos recursos sobre rutinas cortas de evaluación comparativa en progtwigs de prueba para medir ciclos de reloj y monitoreo de rendimiento.

Hay instrucciones de ensamblaje x86 para forzar a la CPU a vaciar 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 progtwig bajo la presión de la memoria caché.

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

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

2.) Habilite la desactivación de la memoria caché en los Registros de control x86 y haga una comparación de eso. Esto probablemente también deshabilitará el caché de instrucciones, que puede no ser lo que usted desea.

3.) Implemente la porción de su código, su evaluación comparativa (si es posible) usando instrucciones no temporales . Sin embargo, estos son solo consejos para el procesador sobre el uso de la memoria caché, aún así es libre de hacer lo que quiera.

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

Editar : Oops, estoy corregido, hay una instrucción para invalidar el caché x86, vea la respuesta de drhirsch