¿Cómo puede asegurarse de que su código se ejecute sin variabilidad en el tiempo de ejecución debido al caché?

StackOverflow https://stackoverflow.com/questions/69049

Pregunta

En una aplicación integrada (escrita en C, en un procesador de 32 bits) con duras restricciones de tiempo real, el tiempo de ejecución del código crítico (especialmente las interrupciones) debe ser constante.

¿Cómo se asegura que no se introduzca variabilidad temporal? en la ejecución del código, específicamente debido a los cachés del procesador (ya sea L1, L2 o L3)?

Tenga en cuenta que nos preocupa el comportamiento de la caché debido a la enorme efecto que tiene en la velocidad de ejecución (a veces más de 100:1 vs.acceder a la RAM).La variabilidad introducida debido a la arquitectura específica del procesador no se acerca en absoluto a la magnitud del caché.

¿Fue útil?

Solución

Si puede conseguir el hardware o trabajar con alguien que pueda hacerlo, puede desactivar el caché.Algunas CPU tienen un pin que, si se conecta a tierra en lugar de a la alimentación (o tal vez al revés), desactivará todos los cachés internos.¡Eso dará previsibilidad pero no velocidad!

De lo contrario, tal vez en ciertos lugares del código del software se pueda escribir para llenar deliberadamente el caché con basura, por lo que se puede garantizar que cualquier cosa que suceda a continuación será una pérdida de caché.Si se hace bien, esto puede dar previsibilidad y tal vez solo se pueda hacer en ciertos lugares, por lo que la velocidad puede ser mejor que deshabilitar totalmente los cachés.

Finalmente, si la velocidad sí importa (diseña cuidadosamente el software y los datos como en los viejos tiempos de programación para una antigua CPU de 8 bits), mantenlo lo suficientemente pequeño como para que todo quepa en la caché L1.Siempre me sorprende cómo los cachés integrados hoy en día son más grandes que toda la RAM en una minicomputadora de hace (década de murmullos).Pero esto será un trabajo duro y requerirá inteligencia.¡Buena suerte!

Otros consejos

Dos posibilidades:

Deshabilite el caché por completo.La aplicación se ejecutará más lento, pero sin variabilidad.

Precargue el código en el caché y "bloquéelo".La mayoría de los procesadores proporcionan un mecanismo para hacer esto.

Parece que te estás refiriendo a la familia de procesadores x86 que no está construida teniendo en cuenta sistemas en tiempo real, por lo que no existe una garantía real de ejecución en tiempo constante (la CPU puede reordenar microinstrucciones, pero hay predicción de rama y cola de búsqueda previa de instrucciones que se vacía cada vez que la CPU predice erróneamente saltos condicionales...)

Esta respuesta parecerá sarcástica, pero pretende hacerte pensar:

Ejecute el código solo una vez.

La razón por la que digo esto es porque muchas cosas lo harán variable y es posible que ni siquiera tengas control sobre él.¿Y cuál es tu definición de tiempo?Supongamos que el sistema operativo decide poner su proceso en la cola de espera.

Luego está la imprevisibilidad debido al rendimiento de la caché, la latencia de la memoria, la E/S del disco, etc.Todo esto se reduce a una sola cosa;A veces lleva tiempo llevar la información al procesador donde su código puede usarla.Incluyendo el tiempo que lleva recuperar/decodificar su código.

Además, ¿cuánta variación es aceptable para usted?Podría ser que esté bien con 40 milisegundos o con 10 nanosegundos.

Dependiendo del dominio de la aplicación, puede incluso enmascarar u ocultar la variación.Los profesionales de gráficos por computadora han estado renderizando en buffers fuera de la pantalla durante años para ocultar la variación en el tiempo de renderizado de cada fotograma.

Las soluciones tradicionales simplemente eliminan la mayor cantidad posible de elementos conocidos de tasa variable.Cargue archivos en la RAM, caliente el caché y evite IO.

Si realiza todas las llamadas a funciones en el código crítico 'en línea' y minimiza la cantidad de variables que tiene, puede permitirles tener el tipo 'registro'.Esto debería mejorar el tiempo de ejecución de su programa.(Probablemente tengas que compilarlo de una manera especial ya que los compiladores de hoy en día tienden a ignorar las etiquetas de "registro")

Supongo que tienes suficiente memoria para no provocar errores de página cuando intentas cargar algo desde la memoria.Los fallos de página pueden llevar mucho tiempo.

También puede echar un vistazo al código ensamblador generado para ver si hay muchas ramas e instrucciones de memoria que podrían cambiar su código en ejecución.

Si ocurre una interrupción en la ejecución de su código, tomará más tiempo.¿Tiene habilitadas las interrupciones/excepciones?

Preasigne memoria y asegúrese de que las interrupciones no afecten el caché (imposible, cierto).

/Alano

Comprenda el peor tiempo de ejecución para operaciones complejas y utilice temporizadores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top