bien, lo de mi primera respuesta. Más tarde, leí los comentarios de seguimiento debajo de su pregunta, así que me doy cuenta ahora que quiere descargar el INSTRUCTION CACHE para arrancar su programa (o partes de él) del caché, de modo que cuando pruebe su rendimiento, también pruebe su tiempo de carga inicial fuera de la memoria principal en la memoria caché de instrucciones. ¿También necesita vaciar todos los datos que su código utilizará en la memoria principal, de modo que tanto los datos como el código sean nuevas?
Antes que nada, me gustaría mencionar que la memoria principal también es una forma de caché, con su disco duro (el programa en el disco o el espacio de intercambio en el disco) siendo el más lento las instrucciones podrían venir de. Dicho esto, cuando se ejecuta por primera vez una rutina por primera vez, si todavía no se ha cargado en la memoria principal del disco por estar cerca de otro código que ya se ejecutó, primero se deben cargar las instrucciones de la CPU. del disco Eso lleva un orden de magnitud o más largo que cargarlo desde la memoria principal al caché. Luego, una vez que se carga en la memoria principal, se tarda un poco más de una orden de magnitud en cargar desde la memoria principal al caché de lo que lleva cargar desde el caché al buscador de instrucciones de la CPU. Entonces, si desea probar el rendimiento de arranque en frío de su código, debe decidir qué significa arranque en frío ... extraerlo del disco o extraerlo de la memoria principal. No conozco ningún comando para "vaciar" las instrucciones/datos de la memoria principal para intercambiar espacio, por lo que enjuagarlo en la memoria principal es todo lo que puede hacer (que yo sepa), pero tenga en cuenta que los resultados de su prueba aún pueden diferir de la primera ejecución (cuando puede arrancarlo del disco) en ejecuciones posteriores, incluso si vacía la caché de instrucciones.
Ahora, ¿cómo se puede vaciar el caché de instrucciones para asegurarse de que su propio código se vacíe en la memoria principal?
Si tuviera que hacer esto (algo muy raro de hacer en mi opinión), probablemente comenzaría por encontrar la longitud aproximada de & en la memoria de mis funciones. Como estoy usando Linux, emitiría el comando "objdump -d {myprogram}> myprogram.dump.txt", luego abriría myprogram.dump.txt en un editor y buscaría las funciones que quiero enjuagar y averiguar cuánto tiempo están restando su dirección de final de su dirección de inicio con una calculadora hexadecimal. Anotaría los tamaños de cada uno. Más tarde agregaría llamadas cacheflush() en mi código, dándole la dirección de cada función que quiero borrar como 'addr' y la longitud que encontré como 'nbytes', e ICACHE. Solo por seguridad probablemente me gustaría un poco de & agregar un 10% al tamaño, en caso de que haga algunos ajustes al código y olvide ajustar los nbytes. Haría una llamada a cacheflush() de esta manera para cada función que quiera eliminar. Luego, si necesito eliminar los datos también, si está usando datos globales/estáticos, también puedo eliminarlos (DCACHE), pero si se trata de datos de pila o montón, realmente no hay nada realista que pueda (o deba) hacer para enjuagar eso fuera de la memoria caché. Tratar de hacerlo sería un ejercicio de tontería, porque crearía una condición que nunca o muy raramente existiría en la ejecución normal. Suponiendo que está usando Linux ...
#include <asm/cachectl.h>
int cacheflush(char *addr, int nbytes, int cache);
...where cache is one of:
ICACHE Flush the instruction cache.
DCACHE Write back to memory and invalidate the affected valid cache lines.
BCACHE Same as (ICACHE|DCACHE).
Por cierto, este es tarea para una clase?
¿Por qué * * necesidad de vaciar la memoria caché? –
es un requisito para mi proyecto que implica calcular el tiempo necesario para mi lógica, por lo tanto, necesito enjuagar el caché. –
Posible duplicado de http://stackoverflow.com/questions/1756825/cpu-cache-flush – Tudor