Heim >Backend-Entwicklung >C++ >Wie können wir eine Monte-Carlo-Simulation für Intel Sandybridge-Prozessoren deoptimieren?

Wie können wir eine Monte-Carlo-Simulation für Intel Sandybridge-Prozessoren deoptimieren?

Linda Hamilton
Linda HamiltonOriginal
2024-12-03 22:16:12470Durchsuche

How Can We Deoptimize a Monte-Carlo Simulation for Intel Sandybridge Processors?

Deoptimierung eines Programms für die Pipeline in CPUs der Intel Sandybridge-Familie

Einführung

Die Aufgabe ist es, die Effizienz eines Monte-Carlo-Simulationsprogramms durch Ausnutzung der Intel Sandybridge-Prozessorarchitektur zu reduzieren. Dieser Prozessor verfügt über eine Out-of-Order-Pipeline mit Funktionen wie Registerumbenennung und Speicherpufferung, was es schwierig macht, die Parallelität auf Befehlsebene (Instruction Level Parallelism, ILP) zu reduzieren und Gefahren einzuführen.

Programmanalyse

Das Programm ist eine Monte-Carlo-Simulation, die den Preis europäischer Vanille-Call- und Put-Optionen berechnet. Die Schlüsselkomponenten des Programms sind:

  • Eine Schleife, die eine bestimmte Anzahl von Malen wiederholt
  • Gaußsche Zufallszahlengenerierung
  • Black-Scholes-Optionspreisformel

Optimierungstechniken

Das Folgende Techniken können verwendet werden, um die Programmeffizienz zu verringern:

  • Falsche Abhängigkeiten:Führen Sie unnötige Abhängigkeiten zwischen Anweisungen ein, um die Gefahr von Stillständen zu erhöhen.
  • Speicherengpässe: Verursachen Sie Cache-Fehler und Verzögerungen beim Speicherzugriff, indem Sie Daten falsch ausrichten oder nicht zusammenhängenden Speicherzugriff verwenden Muster.
  • Verzögerte Anweisungen:Verwenden Sie Anweisungen, die längere Latenzen haben und durch die Pipeline verzögert werden können.
  • Weniger effiziente Vorgänge:Verwenden Sie weniger effiziente mathematische Operationen wie Division statt Multiplikation.
  • Zweig-Fehlvorhersagen:Einführen unvorhersehbare Verzweigungen führen zu Pipeline-Leerungen.
  • Store-Forwarding-Störungen:Verwenden Sie Techniken wie das XOR-Verknüpfen hoher Bytes von Doubles, um Store-Forwarding-Störungen zu verursachen.
  • Anweisungscache Fehler: Teilen Sie Routinen in kleine Teile auf, um einen Anweisungscache zu verursachen Fehlschläge.

Spezifische Vorschläge

Basierend auf den oben genannten Techniken sind hier einige spezifische Vorschläge, um das Programm zu pessimieren:

  • Verwenden Sie std::atomic for-Schleifenzähler und richten Sie sie falsch aus.
  • Induzieren Sie falsches Teilen zwischen nicht-atomaren Variablen.
  • Multi-Thread mit einem einzigen gemeinsam genutzten std::atomic-Schleifenzähler.
  • Schreiben Sie Ausdrücke mit assoziativen/distributiven Äquivalenten um, um sie zu erhöhen Funktionieren.
  • Verwenden Sie intrinsische Funktionen sorgfältig, um Pipeline-Störungen zu vermeiden.
  • Verwenden Sie Inline-Assembly, um den UOP-Cache aufzubrechen.
  • Verwenden Sie CPUID/RDTSC, um jede Iteration zu timen und die Serialisierung einzuleiten .
  • Durchlaufen Sie Arrays in nicht zusammenhängender Reihenfolge und verwenden Sie Arrays mit Auffüllung und falsch ausgerichtete Elemente.
  • Verwenden Sie double precision anstelle von float, um die Latenz zu erhöhen.
  • Erzwingen Sie Konvertierungen von Integer zu Float und wieder zurück.
  • Compiler-Optimierungen mit -O0 deaktivieren und verwenden -march=i386 für langsamere Anweisungen.
  • Stellen Sie die CPU-Affinität häufig auf verschiedene CPUs ein.

Das obige ist der detaillierte Inhalt vonWie können wir eine Monte-Carlo-Simulation für Intel Sandybridge-Prozessoren deoptimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn