Come posso eseguire un flush della cache della CPU in x86 Windows?

Sono interessato a forzare un flush della cache della CPU in Windows (per ragioni di benchmark, voglio emulare iniziando senza dati nella cache della CPU), preferibilmente un’implementazione di base C o chiamata Win32.

C’è un modo noto per farlo con una chiamata di sistema o anche qualcosa di subdolo come dire una grande memcpy ?

La piattaforma Intel i686 (anche P4 e versioni successive).

Fortunatamente, esiste più di un modo per svuotare esplicitamente le cache.

L’istruzione “wbinvd” ripristina il contenuto della cache modificato e contrassegna le cache vuote. Esegue un ciclo di bus per far sì che le cache esterne scarichino i loro dati. Sfortunatamente, è un’istruzione privilegiata. Ma se è ansible eseguire il programma di test sotto qualcosa come DOS, questa è la strada da percorrere. Questo ha il vantaggio di mantenere l’ingombro della cache del “SO” molto piccolo.

Inoltre, vi è l’istruzione “invd”, che invalida le cache senza ridurle alla memoria principale. Ciò viola la coerenza della memoria principale e della cache, quindi devi prenderti cura di te da solo. Non proprio raccomandato.

Per scopi di benchmark, la soluzione più semplice è probabilmente la copia di un grande blocco di memoria in una regione contrassegnata con WC (combinazione di scrittura) invece di WB. La regione mappata in memoria della scheda grafica è un buon candidato, oppure puoi contrassegnare una regione come WC da solo tramite i registri MTRR.

È ansible trovare alcune risorse sul benchmarking di routine brevi nei programmi di test per misurare i cicli di clock e il monitoraggio delle prestazioni.

Ci sono le istruzioni di assemblaggio di x86 per forzare la CPU a svuotare certe linee della cache (come CLFLUSH ), ma sono piuttosto oscure. In particolare CLFLUSH scarica solo un indirizzo scelto dalle cache L1.

qualcosa di subdolo come si dice una grande memcopia?

Sì, questo è l’approccio più semplice e farà in modo che la CPU svuoti tutti i livelli di cache. Escludere semplicemente il tempo di svuotamento della cache dai benchmakrs e dovresti avere una buona idea di come il tuo programma funziona sotto la pressione della cache.

Purtroppo non c’è modo di svuotare esplicitamente la cache. Alcune delle tue opzioni sono:

1.) Thrash della cache eseguendo alcune operazioni di memoria molto grandi tra iterazioni del codice che stai analizzando.

2. Abilitare Cache Disable nei registri di controllo x86 e confrontarlo. Questo probabilmente disabiliterà anche la cache delle istruzioni, che potrebbe non essere quello che vuoi.

3.) Implementare la parte del codice del benchmarking (se ansible) utilizzando istruzioni non temporali . Tuttavia, questi sono solo suggerimenti per il processore sull’utilizzo della cache, è ancora libero di fare ciò che vuole.

1 è probabilmente il più semplice e sufficiente per i tuoi scopi.

Edit : Oops, I standing correct è un’istruzione per invalidare la cache x86, vedere la risposta di drhirsch