Deoptimierung eines Programms für die Pipeline in CPUs der Intel Sandybridge-Familie
Das Ziel dieser Aufgabe ist es Ändern Sie ein bestimmtes Programm, um seine Leistung zu verringern, was als Deoptimierung bezeichnet wird. Diese Aufgabe erfordert ein Verständnis der Intel i7-Pipeline-Architektur und der Neuordnung von Befehlspfaden, um Gefahren einzuführen.
1. Falsches Teilen:
Sorgen Sie dafür, dass nicht-atomare Variablen in derselben Cache-Zeile gespeichert werden, was zu Verzögerungen bei der Speicherweiterleitung führt.
2. Die Speicherweiterleitung bleibt stehen:
Verwenden Sie XOR, um das Vorzeichenbit eines Doubles umzudrehen, anstatt den „-“-Operator zu verwenden, wodurch eine enge Speicherung auf nur ein Byte des Doubles erzwungen wird.
3. Speicher-Begriffsklärung:
Platzieren Sie Daten im Abstand von 4096B, um falsche Abhängigkeiten von Speichern auf verschiedenen Seiten auszulösen.
4. Falsch ausgerichtete Daten:
Verwenden Sie __attribute__((packed)), um eine Fehlausrichtung von Variablen über Cache-Zeilen- oder Seitengrenzen hinweg zu erzwingen und dadurch Cache-Fehler zu erhöhen.
5. Schrittweite:
Arrays mit einer Schrittweite von 4096 Bytes durchlaufen, was zu nicht zusammenhängendem Speicherzugriff führt und die Cache-Auslastung reduziert.
6. Verknüpfte Liste:
Speichern Sie Ergebnisse in einer verknüpften Liste, wodurch zeigerverfolgende Lastabhängigkeiten und möglicherweise verstreute Knoten im Speicher eingeführt werden.
1. Atomare Variablen:
Verwenden Sie std::atomic
2. Long Double:
Verwenden Sie Long Double-Variablen, um die x87-Emulation zu erzwingen, auch bei SSE2-fähigen CPUs.
3. Ganzzahlkonvertierungen:
Konvertieren Sie wiederholt zwischen Ganzzahl- und Float-Typen und führen Sie Konvertierungsanweisungen mit hoher Latenz ein.
4. Systemaufrufe:
Führen Sie häufige unnötige Systemaufrufe ein, um Kontextwechsel und Cache-/TLB-Fehler zu erzwingen.
Durch den Einsatz dieser Techniken ist es möglich, das Gegebene erheblich zu pessimieren Programm und machen es viel langsamer als seine Originalversion. Der Schlüssel zur erfolgreichen Deoptimierung besteht darin, jeden Schritt mit „teuflischer Inkompetenz“ und nicht mit böswilliger Absicht zu rechtfertigen.
Das obige ist der detaillierte Inhalt vonWie können wir ein Programm für Intel Sandybridge-CPUs absichtlich deoptimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!