È abbastanza possibile capire e ottimizzare per le cache. Inizia con la comprensione dell'hardware e continua con il controllo del sistema. Minore è il controllo sul sistema, meno probabile sarà il successo. Linux o Windows che eseguono un mucchio di applicazioni / thread che non sono inattivi.
La maggior parte delle cache sono in qualche modo simili nelle loro proprietà, usano una parte del campo dell'indirizzo per cercare hit, hanno una profondità (modi) e una larghezza (linea della cache). Alcuni hanno buffer di scrittura, alcuni possono essere configurati per scrivere o bypassare la cache nelle scritture, ecc.
Devi essere perfettamente consapevole di tutte le transazioni di memoria in corso che stanno colpendo quella cache (alcuni sistemi hanno istruzioni indipendenti e cache di dati che semplificano l'attività).
È possibile rendere inutilizzabile una cache non gestendo la memoria con attenzione. Ad esempio, se hai più blocchi di dati che stai elaborando, sperando di tenerli nella cache, ma sono in memoria a indirizzi che sono anche multipli rispetto al controllo hit / miss delle cache, ad esempio 0x10000 0x20000 0x30000, e hai più di a parte i modi nella cache, si può finire molto rapidamente per creare qualcosa che gira abbastanza lentamente con la cache, più lentamente di quanto farebbe con la cache disattivata. Ma cambiala in forse 0x10000, 0x21000, 0x32000 e questo potrebbe essere sufficiente per sfruttare al massimo la cache, riducendo gli sfratti.
La linea di fondo, la chiave per l'ottimizzazione di una cache (beh, oltre a conoscere abbastanza bene il sistema) è quella di mantenere tutti gli elementi di cui hai bisogno per le prestazioni nella cache allo stesso tempo, organizzando i dati in modo tale che sia possibile avere tutto nella cache in una volta. E impedire che cose come l'esecuzione di codice, interruzioni e altri eventi regolari o casuali rimuovano parti significative di questi dati che stai utilizzando.
Lo stesso vale per il codice. È un po 'più difficile anche se è necessario controllare le posizioni in cui il codice vive per evitare collisioni con altro codice che si desidera mantenere nella cache. Durante il test / profilazione di qualsiasi codice che passa attraverso una cache che aggiunge una singola riga di codice qua e là o anche un singolo nop, tutto ciò che sposta o cambia gli indirizzi in cui il codice vive da uno compila all'altro per lo stesso codice, cambia dove le linee della cache rientrano in quel codice e cambiano ciò che viene sfrattato e cosa no per le sezioni critiche.