¿Cómo vaciar la memoria caché de la CPU para una región de espacio de direcciones en Linux?

4 minutos de lectura

avatar de usuario
aminfar

Estoy interesado en vaciar el caché (L1, L2 y L3) solo para una región del espacio de direcciones, por ejemplo, todas las entradas de caché desde la dirección A hasta la dirección B. ¿Existe un mecanismo para hacerlo en Linux, ya sea desde el espacio del usuario o del kernel? ?

  • ¿Y cuál es tu CPU? ¿Desea ejecutar “descarga” desde el espacio del usuario o desde el espacio del kernel?

    – osgx

    27/03/2014 a las 23:45

  • El espacio de usuario sería genial, pero el espacio del núcleo también está bien. Estoy haciendo un estudio, así que necesito información para x86 o ARM. Supongo que no tienen el mismo mecanismo (al menos la implementación/instrucción subyacente no sería la misma).

    – aminfar

    28 de marzo de 2014 a las 0:37


  • Muy buena información. Te lo agradezco. Me preguntaba cómo puedo estimar el tiempo de ejecución de flush_cache_range sin ejecutarlo en el hardware real. Por ejemplo, una estimación muy aproximada podría ser: (number_cache_lines_to_flush * time_to_flush_each_cache_line). Sé que no será tan fácil, pero si puedes arrojar algo de luz, sería genial.

    – aminfar

    28 de marzo de 2014 a las 15:59


  • aminfar, esta estimación depende de la CPU exacta (su microarquitectura), y es difícil para cualquiera que no esté familiarizado con ARM. Además, me temo que x86 no tiene un vaciado de caché parcial (solo vaciado de tlb, pero no sé sobre el vaciado de tlb parcial).

    – osgx

    28 de marzo de 2014 a las 18:13

  • @aminfar, en x86 probablemente podrías usar clflush en ensamblaje en línea y recorrer el rango de direcciones

    – Leeor

    28 de marzo de 2014 a las 22:58


  • @aminfar, será difícil de estimar debido a la actividad de DMA y/o GPU.

    – rsaxvc

    14 de enero de 2015 a las 4:09

  • (Investigación personal) flush_tlb_range funciona como lo anuncia el nombre, solo descargando una pequeña región de memoria virtual cuando es necesario (en lugar de necesitar descargar todo el TLB)? No exactamente relacionado con todo lo demás aquí, pero más sobre la hipótesis de soluciones alternativas Meltdown de mayor rendimiento: p

    –Paul Stelian

    19 de enero de 2018 a las 16:05

  • El primer enlace dice que es solo para el caché de instrucciones, no estoy seguro de que sea lo que necesitaba OP

    – Leeor

    28 de marzo de 2014 a las 22:54


  • El código de @Leeor Linux no dice eso explícitamente, por eso lo vinculé.

    – auselen

    28 de marzo de 2014 a las 23:13

  • Si desea un comportamiento de cacheflush, definitivamente deberías llamarlo directamente. Llamar a una función incorporada con garantías de comportamiento más débiles porque actualmente se implementa sobre la función más fuerte que desea parece una mala idea.

    – Peter Cordes

    23 de octubre de 2016 a las 3:21

  • CLFLUSH ahora se define como fuertemente ordenado. La versión del manual de Intel en felixcloutier.com lo describe de la forma en que lo hizo (y falta una entrada para CLFLUSHOPT), pero una versión más nueva en hjlebbink.github.io/x86doc/ coincide con el PDF oficial de Inteldiciendo que está ordenado con otros CLFUSHes, y escribe, etc., con la nota al pie de página que Versiones anteriores de este manual… Todos los procesadores que implementan la instrucción CLFLUSH también la ordenan en relación con las otras operaciones enumeradas anteriormente.

    – Peter Cordes

    23 de octubre de 2016 a las 3:33


  • Esta es la razón por la cual existe CLFLUSHOPT y por qué Linux lo usa cuando está disponible.

    – Peter Cordes

    23 de octubre de 2016 a las 3:34

  • Peor aún, wbinvd no es interrumpible en sí mismo, por lo que es muy malo para la latencia de interrupción. Esta es casi siempre la solución incorrecta, a excepción de los experimentos de rendimiento u otros usos experimentales o de juguete. Además, vacía todos los cachés en todos los núcleos.

    – Peter Cordes

    21 de junio de 2019 a las 1:46

  • gran punto @PeterCordes sobre la naturaleza no interrumpible de esta instrucción. Actualizaré la respuesta para reflejar esto.

    – jithu83

    24/06/2019 a las 22:50


  • Peor aún, wbinvd no es interrumpible en sí mismo, por lo que es muy malo para la latencia de interrupción. Esta es casi siempre la solución incorrecta, a excepción de los experimentos de rendimiento u otros usos experimentales o de juguete. Además, vacía todos los cachés en todos los núcleos.

    – Peter Cordes

    21 de junio de 2019 a las 1:46

  • gran punto @PeterCordes sobre la naturaleza no interrumpible de esta instrucción. Actualizaré la respuesta para reflejar esto.

    – jithu83

    24/06/2019 a las 22:50


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad