È del tutto possibile comprendere e ottimizzare le cache. Inizia con la comprensione dell'hardware e continua con il controllo del sistema. Meno controllo hai sul sistema, meno probabilità avrai di riuscire. Linux o Windows che eseguono un sacco di applicazioni / thread che non sono inattivi.
La maggior parte delle cache sono in qualche modo simili nelle loro proprietà, usano alcune parti del campo dell'indirizzo per cercare hit, hanno una profondità (vie) e una larghezza (linea di cache). Alcuni hanno buffer di scrittura, alcuni possono essere configurati per scrivere o bypassare la cache in scrittura, ecc.
È necessario essere consapevoli di tutte le transazioni di memoria in corso che colpiscono quella cache (alcuni sistemi dispongono di istruzioni indipendenti e cache di dati che semplificano l'attività).
Puoi facilmente rendere inutile una cache non gestendo con cura la tua memoria. Ad esempio, se hai più blocchi di dati che stai elaborando, sperando di tenerli nella cache, ma sono in memoria in indirizzi che sono anche multipli rispetto al controllo hit / miss della cache, diciamo 0x10000 0x20000 0x30000 e ne hai più di questi modi diversi nella cache, potresti finire molto rapidamente facendo qualcosa che funziona abbastanza lentamente con la cache attiva, più lenta di quanto farebbe con la cache spenta. Ma cambiarlo in forse 0x10000, 0x21000, 0x32000 e questo potrebbe essere sufficiente per sfruttare appieno la cache, riducendo gli sfratti.
In conclusione, la chiave per l'ottimizzazione di una cache (beh, oltre a conoscere il sistema abbastanza bene) è quella di mantenere tutte le cose per le quali hai bisogno di prestazioni nella cache allo stesso tempo, organizzando quei dati in modo che sia possibile avere tutto nella cache in una volta. E prevenire cose come l'esecuzione di codice, interruzioni e altri eventi regolari o casuali dallo sfratto porzioni significative di questi dati che si stanno utilizzando.
Lo stesso vale per il codice. È un po 'più difficile, poiché è necessario controllare le posizioni in cui si trova il codice per evitare collisioni con altro codice che si desidera conservare nella cache. Durante il test / profiling di qualsiasi codice che passa attraverso una cache che aggiunge una singola riga di codice qua e là o anche una singola nop, tutto ciò che sposta o cambia gli indirizzi in cui il codice vive da una compilazione all'altra per lo stesso codice, cambia dove le righe della cache rientrano in quel codice e cambiano ciò che viene sfrattato e cosa no per le sezioni critiche.