Bei der Veröffentlichung einer neuen Prozessorgeneration geben die meisten Websites an, dass Game-Engines und -Programme für die neue Hardware optimiert werden müssen. Ich verstehe nicht ganz warum. Ein Prozessor hat normalerweise eine Architektur, die definiert, welche Art von Befehlssatz er verwendet. Die, die wir heutzutage alle verwenden, ist amd_x86_64. Warum müsste ein Programm oder ein Compiler aktualisiert werden, wenn alle Prozessoren dieselbe Architektur verwenden? Sicher gibt es Funktionen IN der Pipeline des neuen Prozessors, die die Ausführung von Maschinencode optimieren. Warum müsste der Maschinencode selbst geändert werden, wenn die Architektur dies nicht tun würde?
39
Antworten:
Weil verschiedene Generationen derselben Architektur unterschiedliche Befehlssätze haben können .
Beispielsweise sind Streaming-SIMD-Erweiterungen wahrscheinlich der bekannteste x86-Befehlssatz, und obwohl es nur eine x86-Architektur gibt, gibt es SSE, SSE2, SSE3 und SSE4.
Jede dieser Generationen kann neue Anweisungen enthalten, mit denen bestimmte Vorgänge schneller ausgeführt werden können. Ein Beispiel, das für Spiele relevant wäre, könnten Produktanweisungen sein.
Wenn eine Game Engine für eine frühere Generation einer Architektur kompiliert wurde, werden diese neueren Anweisungen nicht unterstützt. Ebenso kann es erforderlich sein, den Motor für neuere Anweisungen zu optimieren. Beispielsweise unterstützt SSE4 Skalarproduktanweisungen, die mit Array-of-Structs-Daten arbeiten. Eine Optimierung, die diese neueren Anweisungen nutzen könnte, besteht darin, Ihr Datenlayout in ein Array von Strukturen zu ändern.
quelle
Maximus 'Antwort ist richtig, ich möchte nur einen weiteren Teil der Geschichte erzählen:
Die Hardware selbst ändert sich auf eine Art und Weise, die Sie ändern müssen, unabhängig von den neu eingeführten Anweisungen.
Erhöhte oder verringerte Cache-Mengen bedeuten, dass Sie sich weniger oder mehr Gedanken über Probleme bei der Cache-Optimierung / -Unwirksamkeit machen müssen. Mehr Cache bedeutet, dass Sie sich bei kleinen Daten weniger darauf konzentrieren können, sicherzustellen, dass die Daten zusammenhängend sind, ohne dass Leistungsprobleme auftreten. Weniger Cache bedeutet, dass dies ein Problem sein könnte, und sehr wenig Cache bedeutet, dass es bei einigen großen Datenstrukturen in keiner Weise wichtig ist.
Neue Cache-Ebenen bedeuten, dass Sie sich mehr Gedanken darüber machen müssen, wie Sie noch größere Datenmengen organisieren (L1, L2, L3, L4).
Mehr Kerne bedeuten, dass Sie überlegen müssen, wie Sie Multithread-Anwendungen besser nutzen und wie sich Ihre Anwendung in einer Umgebung mit mehreren Prozessen skalieren lässt.
Schnellerer Takt bedeutet, dass Sie sich mehr Gedanken über die Speicherlatenz machen müssen als über die Geschwindigkeit der CPU-Berechnung als einen Engpass Ihres Systems.
Die Anzahl der FPUs auf einem System stimmt möglicherweise nicht mehr mit der Anzahl der ganzzahligen ALUs pro Kern überein (AMD hatte / hat Architekturen wie diese).
Die Anzahl der Taktzyklen, die zur Berechnung einer Operation benötigt werden, ist gesunken oder gestiegen.
Die Anzahl der verfügbaren Register wurde geändert.
Alle diese Faktoren wirken sich sehr effektiv auf die Leistung von Programmen aus, bei denen Annahmen über die zugrunde liegende Architektur früherer Hardware mit demselben ISA (positiv oder negativ) getroffen wurden.
quelle
pdep
dauert 1 Zyklus auf Intel, aber 6 auf Ryzen, so kann es sein, dass Sie es nicht auf Ryzen verwenden möchten.c[i] = a[i] OP b[i]
(dh 2 Ladevorgänge und 1 Speicherplatz pro Operation), sodass die Zeiten aufgrund der sehr geringen Rechenintensität von der Speicherbandbreite dominiert werden. Die Array-Größe wird nicht angezeigt, daher IDK, wenn sie in L1D passt. (gcc4.9 -Ofast
Diese Schleifen werden höchstwahrscheinlich automatisch vektorisiert, sodass Sie nicht einmal die Kosten für normale skalare Operationen als Teil eines komplexen Ganzzahlcodes messen). Die erste Zeile dieser Seite ist WICHTIG: Nützliche Rückmeldungen haben ergeben, dass einige dieser Maßnahmen schwerwiegende Fehler aufweisen. Ein großes Update ist in Vorbereitung .Selbst über grobe Änderungen hinaus, wie die Unterstützung neuer Anweisungen, ändern die Mikroprozessorhersteller ständig ihre Entwürfe, um die Leistung zu verbessern, und jeder neue Entwurf kann für jede Anweisung oder Technik eine andere relative Leistung aufweisen. Vielleicht haben Sie sorgfältig optimierten branchless Code für das Modell X geschrieben, aber das Modell Y verfügt über einen verbesserten Branch-Predictor, der die Strafe für die falsche Vorhersage für die nicht-branchless Version des Codes reduziert (wodurch auch ein Register frei wird, das woanders verwendet werden kann). . Möglicherweise unterstützt das Modell Y eine größere Parallelität eines bestimmten Befehls mit hoher Latenz, so dass Sie mit einer entrollten Schleife dieses Befehls einen besseren Durchsatz erzielen, während beim Modell X eine kürzere Sequenz besser war.
Jedes Problem kann auf vielfältige Weise gelöst werden, und jedes Programm ist eine ineinandergreifende Sammlung von Kompromissen und Ressourcenzuweisungen unter dem Gesichtspunkt der Optimierung. Selbst kleine Änderungen der Verfügbarkeit dieser Ressourcen oder der Kosten eines bestimmten Codeteils in Bezug auf diese Ressourcen können einen Kaskadeneffekt haben, der dem einen oder anderen Codeteil einen erheblichen Leistungsvorteil verleiht. Selbst wenn ein aufgerüsteter Chip "mehr von allem" hat, wie viel mehr von jedem Ding kann die Waage schwingen.
quelle