Es ist durchaus möglich, Caches zu verstehen und zu optimieren. Es beginnt mit dem Verstehen der Hardware und setzt sich fort, die Kontrolle über das System zu behalten. Je weniger Kontrolle Sie über das System haben, desto unwahrscheinlicher ist es, dass Sie Erfolg haben. Linux oder Windows mit einer Reihe von Anwendungen / Threads, die nicht im Leerlauf sind.
Die meisten Caches haben ähnliche Eigenschaften. Verwenden Sie einen Teil des Adressfelds, um nach Treffern zu suchen. Sie haben eine Tiefe (Wege) und eine Breite (Cache-Zeile). Einige haben Schreibpuffer, andere können so konfiguriert werden, dass sie den Cache beim Schreiben durchlaufen oder umgehen, usw.
Sie müssen genau wissen, welche Speichertransaktionen in diesem Cache ablaufen (einige Systeme verfügen über unabhängige Befehls- und Datencaches, die die Aufgabe erleichtern).
Sie können einen Cache leicht unbrauchbar machen, indem Sie Ihren Speicher nicht sorgfältig verwalten. Wenn Sie beispielsweise mehrere Datenblöcke verarbeiten, in der Hoffnung, sie im Cache zu behalten, sie sich jedoch an Adressen im Speicher befinden, die sogar ein Vielfaches der Cachetreffer- / -fehlersuche betragen, z. B. 0x10000 0x20000 0x30000, und Sie haben mehr von Abgesehen von den Möglichkeiten im Cache kann es sehr schnell vorkommen, dass bei eingeschaltetem Cache etwas sehr Langsames entsteht, das langsamer ist als bei ausgeschaltetem Cache. Aber ändern Sie das auf vielleicht 0x10000, 0x21000, 0x32000 und das könnte ausreichen, um den Cache voll auszunutzen und die Räumungen zu reduzieren.
Fazit: Der Schlüssel zur Optimierung eines Caches (abgesehen von einer guten Systemkenntnis) besteht darin, alle erforderlichen Leistungsmerkmale gleichzeitig im Cache zu speichern und die Daten so zu organisieren, dass sie verfügbar sind alles auf einmal im Cache. Und verhindern, dass Dinge wie Codeausführung, Interrupts und andere regelmäßige oder zufällige Ereignisse signifikante Teile dieser Daten, die Sie verwenden, entfernen.
Gleiches gilt für Code. Es ist jedoch etwas schwieriger, da Sie die Speicherorte des Codes kontrollieren müssen, um Kollisionen mit anderem Code zu vermeiden, den Sie im Cache behalten möchten. Während Sie jeden Code testen / profilieren, der einen Cache durchläuft, in dem hier und da eine einzelne Codezeile oder sogar ein einzelnes NOP hinzugefügt wird, ändert sich alles, was die Adressen verschiebt oder ändert, an denen der Code von einer Kompilierung zur anderen für denselben Code vorhanden ist, an der Position Die Cache-Zeilen fallen in diesen Code und ändern, was entfernt wird und was nicht für kritische Abschnitte.