Ich bin ein Student im zweiten Jahr der Computerspieltechnologie. Ich habe kürzlich meinen ersten Prototyp meiner "Art" eines eigenen Pfadfinders fertiggestellt (der kein A * anstelle eines geometrischen Ansatzes / einer Mustererkennung verwendet, der Pfadfinder benötigt nur das Wissen über das Terrain, das er für Entscheidungen hält, weil ich wollte eine KI, die tatsächlich erforschen könnte, wenn das Gelände bereits bekannt ist, dann wird sie den kürzesten Weg leicht zurücklegen können, da der Pfadfinder eine Erinnerung an Knoten hat.
Wie auch immer, meine Frage ist allgemeiner: Wie beginne ich mit der Optimierung von Algorithmen / loops / for_each / etc. Verwenden von Assembly, obwohl allgemeine Tipps willkommen sind. Ich bin speziell auf der Suche nach guten Büchern, weil es wirklich schwierig ist, gute Bücher zu diesem Thema zu finden. Es gibt einige kleine Artikel wie diesen , aber immer noch nicht genug Wissen, um einen Algorithmus / ein Spiel zu optimieren ...
Ich hoffe, es gibt ein modernes gutes Buch da draußen, das ich einfach nicht finden konnte ...
quelle
Antworten:
Ich werde derjenige sein, der hier gegen den Strich geht und sagen, es ist nie zu früh, etwas über Optimierungen zu lernen , insbesondere über Baugruppenoptimierungen und, was noch wichtiger ist, über das Debuggen in der Baugruppe. Ich glaube, dass Sie den größtmöglichen Nutzen daraus ziehen werden, wenn Sie ein Student sind (weil Sie dann sehr wenig zu verlieren haben (dh zeitlich / geldmäßig)) und alles, was Sie gewinnen können.
Wenn Sie in der Branche tätig sind und nicht die Aufgabe haben, in der Montage herumzubasteln, dann tun Sie das nicht. Wenn Sie ein Student sind oder Zeit im Allgemeinen haben, würde ich die Zeit finden, um zu lernen, Programme zu zerlegen und zu sehen, ob ich eine bessere Lösung als der Compiler finden kann. Wenn ich nicht kann, wen interessiert das? Ich habe gerade gelernt, wie man neben dem Compiler auch schreibt, und das ist ein RIESIGES Plus, wenn man mit einem Fehler im Release-Code (ohne Fehlersymbole) konfrontiert ist und auf die Demontage starrt, denn das ist das einzige, worauf man achten kann.
Die Antwort
Dies ist eine der besten Ressourcen, die ich zum Erlernen von Optimierungen gefunden habe.
http://www.agner.org/optimize/
Das Geschwätz
Wenn Sie einige Artikel von großen Entwicklern lesen (zum Beispiel, wenn Sie die Gründe für die Erstellung von EASTL und die nähere Betrachtung des Codes prüfen, werden Sie zu Kommentaren wie diesem geführt, weil GCC schrecklich darin ist, diese if - Anweisung einzutragen , aus der hervorgeht, wovon die Mehrheit stammt) Die Leute sagen, Sie vertrauen darauf, dass der Compiler nicht immer richtig ist (vor allem in der Spieleentwicklung). Wenn Sie dann in der Branche Fuß fassen, werden Sie feststellen, dass Optimierungen alltäglich sind und zu wissen, was die Assembly-Ausgabe bedeutet, ein großes Plus ist. Außerdem scheinen die Leute (insbesondere beim Stackoverflow) nicht zu erkennen, dass das Erstellen von Profilen für Spiele sehr schwierig und nicht immer genau ist.
Es gibt jedoch eine Einschränkung. Sie können Zeit damit verbringen, etwas zu optimieren, und später feststellen, dass Zeit verschwendet wurde. Aber was hast du gelernt? Sie haben gelernt, denselben Fehler unter ähnlichen Umständen nicht zu wiederholen.
Was SO jetzt einnimmt, ist meiner Meinung nach eine religiöse Haltung zu der Aussage , nicht zu optimieren, bis Sie sich profilieren und sich keine Sorgen machen, der Compiler weiß es besser als Sie . Es behindert das Lernen. Ich kenne Experten in der Branche, die sehr gutes Geld erhalten (und ich meine SEHR gutes Geld), um bei der Zusammenstellung herumzuspielen, um das Spiel zu optimieren und Fehler zu beheben, weil der Compiler schlecht darin ist oder Ihnen einfach nicht helfen kann, weil es gut ist kann nicht (GPU-bezogene Abstürze, Abstürze, bei denen Daten in einem Debugger nicht einlesbar sind usw. usw.)!
Was ist, wenn jemand, der das liebt, es noch nicht vollständig erkannt hat, die Frage hier stellt und von den vielen Antworten, die der Compiler kennt, besser als Sie ab- oder abgeschaltet wird? und wird nie einer dieser hochbezahlten Programmierer?
Ein letzter Gedanke. Wenn Sie dies frühzeitig tun, werden Sie feststellen, dass Sie bald anfangen, Code zu schreiben, der im schlimmsten Fall keine Leistungsverbesserungen aufweist, da der Compiler ihn auf die gleiche Weise optimiert hat oder bestenfalls einige Leistungsverbesserungen aufweist, da der Compiler ihn jetzt optimieren kann . In beiden Fällen ist es zur Gewohnheit geworden, und Sie können Code nicht langsamer schreiben als zuvor. Einige Beispiele sind (es gibt viele weitere):
EDIT: Update nach 8 weiteren Jahren in der Branche. Montage lernen. Erfahren Sie, wie Optimierer funktionieren und welche Assembly sie generieren (CompilerExplorer ist ein großartiges Tool dafür). Ich habe unzählige Abstürze in Test-Builds (optimierte Builds für interne Tests) festgestellt, bei denen Sie sich auch mit Debug-Symbolen nicht auf den Debugger verlassen können. Der Compiler hat zu viele Dinge optimiert und die Assembly ist Ihre einzige wertvolle Informationsquelle, um den Fehler aus dem Absturzdump zu finden. Jeder Build dauert 30-40 Minuten, wenn Sie Glück haben und an erster Stelle in der Build-Warteschlange stehen. Sie können sich also nicht auf einige traditionelle Techniken verlassen, um den Fehler zu isolieren. Multiplayer macht es noch schlimmer. Wenn Sie die Baugruppe kennen und wissen, wie Sie die optimierte Baugruppe lesen, werden Sie einfach besser und letztendlich wertvoller für das Team.
quelle
Der erste Tipp, den Sie erhalten, lautet: Nicht.
Moderne Compiler sind wirklich sehr, sehr gut darin, Code zu optimieren, und es ist sehr viel wahrscheinlicher, dass sie das besser können als jede selbst erstellte Assemblersprache, die Sie schreiben.
Die Ausnahme wäre ein spezieller Fall, bei dem Sie mit Sicherheit festgestellt haben, dass der Compiler eine schlechte Optimierungsarbeit leistet. Das ist also der zweite Tipp. Es gibt hier keine allgemeinen Richtlinien. Sie müssen Ihren eigenen Code kennen, wissen, was er tut, in der Lage sein, ihn zu zerlegen und mit absoluter Sicherheit festzustellen, dass der Compiler schlechte Arbeit leistet.
Auch in diesem Fall möchten Sie möglicherweise immer noch nicht. Sie müssen sicher sein, dass für Sie kein laufender Wartungsaufwand entsteht. Möglicherweise möchten Sie in 6 Monaten wieder zu diesem Code zurückkehren und einen Teil davon ändern, oder Sie finden einen äußerst subtilen Fehler, der in einer Assembler-Version schwieriger zu beheben sein wird. Selbst wenn Sie glauben, alle Fehler behoben zu haben, werden die Fehler, von denen Sie nicht einmal gedacht haben, dass sie passieren könnten, für Sie Realität, sobald Ihr Programm an die Öffentlichkeit geht. Das ist ein ziemlicher Augenöffner (und eine demütigende Erfahrung).
Und selbst wenn Sie damit einverstanden sind, werden Sie möglicherweise feststellen, dass es absolut keine messbare Leistungsverbesserung gibt, da Ihr Hauptengpass an einer anderen Stelle in Ihrem Programm liegen könnte. Das bringt mich also wieder zu Nummer 1 zurück. Nicht.
quelle
Normalerweise hängt eine solide Optimierung nicht von der Verwendung von Assembly oder der Durchführung von Mikrooptimierungen mit Code in höheren Sprachen ab. Wenn Sie viele Forschungsarbeiten lesen (wie ich - oder es versuchen!), Werden Sie feststellen, dass die an Algorithmen vorgenommenen Verbesserungen häufig eher auf einer breiteren konzeptionellen, "qualitativen" Ebene als auf einer "quantitativeren" Ebene liegen. Ebene der Mikrooptimierung. Ich möchte betonen, dass Gewinne in der Größenordnung wahrscheinlicher zu finden sind, wenn Algorithmen unter diesem Gesichtspunkt betrachtet oder vorhandene Lösungen vektorisiert / parallelisiert werden.
Trotzdem bin ich kürzlich auf dieses Problem gestoßen. Dies ist möglicherweise ein guter Weg, um x86-ASM speziell für Spieleentwickler zu erlernen.
NACHTRAG
Zwei Quellen aus meinem Kopf:
Darüber hinaus ist das Lesen von Forschungsarbeiten eine hervorragende Möglichkeit, die Denkprozesse der Weisen zu verfolgen, da sie Algorithmen optimieren, um eine bessere Leistung zu erzielen. Am häufigsten werden Gewinne gesehen durch:
Das Lesen von Forschungsergebnissen hält Sie auch auf dem neuesten Stand Ihres Fachs, anstatt darauf zu warten, dass dieses Wissen in die Branche gelangt.
quelle
Ich denke, es könnte zu früh sein.
Wie auch immer, es ist wichtig zu verstehen, dass der Compiler selbst keinen langsameren Code als das Assembly-Äquivalent erzeugt. Sie erhalten keine Leistung, wenn Sie einfach den gleichen Assembly-Code wie der Compiler schreiben.
Konzentrieren Sie sich zunächst auf montagefreie Optimierungen. Igor Ostrovsky hat einige gute Artikel, die einige der Grundlagen aufzeigen: http://igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/
Beachten Sie, dass Verzweigungsfehlervorhersagen und Cache-Fehler das sind, wogegen Sie in erster Linie optimieren sollten, auch wenn Sie einige zusätzliche Rechenoperationen ausführen müssen. In der Regel lohnt es sich, eine unvorhersehbare Verzweigung zu vermeiden oder zufällig aus zu viel Speicher zu lesen.
Und am wichtigsten ist natürlich, dass Sie zuerst Ihren Algorithmus optimieren. Eine langsame Implementierung eines schnellen Algorithmus ist fast immer schneller als eine schnelle Implementierung eines langsamen Algorithmus.
quelle
Dieses Buch ist außergewöhnlich gut für ein Lehrbuch. Aber es ist nicht speziell auf Optimierung ausgerichtet. Assemblersprache für x86-Prozessoren, 6. Ausgabe
Es geht mehr darum, die Grundlagen des Zusammenbaus mithilfe von MASM zu vermitteln. Gegen Ende des Buches erfahren Sie dann, wie Sie Assembler in c ++ einbinden und in größere Programme integrieren können.
Ich habe dies hier aufgeführt, weil es sinnvoll ist, die Grundlagen des Zusammenbaus zu lernen, bevor Sie lernen, wie Sie damit Programme optimieren.
Ich mag dieses Buch, weil Irvine Ihnen beibringt, wie man die Werkzeuge verwendet, die zum Schreiben von Maskenprogrammen benötigt werden. Er geht speziell auf die Verwendung der IDE (Visual Studio C ++) und des Debuggers ein. Jedes Kapitel enthält einige Videos, die sich mit der Lösung von Problemen befassen. Einige dieser Informationen sind auf der angegebenen Website frei verfügbar.
quelle