Frage

Ich habe sehr Stück C optimiert ++ und selbst kleine Veränderungen an Orten fern von Hot Spots machen kann die Leistung bis zu 20% betroffen. Nach tiefer Untersuchung stellte sich (wahrscheinlich) leicht unterschiedliche Register in Hot Spots verwendet erwiesen. Ich kann mit always_inline Attribute steuern inlineing, aber kann ich Zuteilung registrieren kontrollieren?

War es hilfreich?

Lösung

Wenn Sie wirklich mit dem Register alloation zu verwirren wollen, dann können Sie GCC zwingen, lokale und globale Variablen in bestimmten Registern zugeordnet werden.

Sie tun dies mit einer speziellen Variablendeklaration wie folgt aus:

 register int test_integer asm ("EBX");

Werke für andere Architekturen als auch, nur EBX ersetzen mit einem zielspezifischen Registernamen.

Für weitere Informationen zu diesem Thema empfehle ich Ihnen einen Blick auf die gcc Dokumentation:

http: //gcc.gnu .org / onlinedocs / gcc-4.3.3 / gcc / Local-Reg-Vars.html

jedoch Mein Vorschlag ist, nicht mit der Registerzuweisung zu verwirren, es sei denn Sie haben sehr gute Gründe, für sie. Wenn Sie einige Register selbst der Allocator zuzuweisen weniger Register mit zu arbeiten und Sie können mit einem Code am Ende, die schlimmer als der Code ist, dass Sie mit gestartet.

Wenn Ihre Funktion ist, dass die Leistung wichtig, dass Sie 20% Performance-Unterschiede zwischen bekommen kompiliert es eine gute Idee sein, das Ding in der Inline-Assembler zu schreiben.


EDIT: Wie strager die Compiler darauf hingewiesen werden, nicht gezwungen, das Register für die Variable zu verwenden. Es ist nur das Register zu verwenden, gezwungen, wenn die Variablen überhaupt verwendet wird. Z.B. wenn die Variable nicht eine Optimierung nicht überleben passieren wird es nicht verwendet werden. Auch das Register kann für andere Größen als auch verwendet werden.

Andere Tipps

Im Allgemeinen ist das Schlüsselwort register wird einfach von allen modernen Compiler ignoriert. Die einzige Ausnahme ist die (relativ) neue Hinzufügung eines Fehlers, wenn Sie die Adresse einer Variablen zu nehmen versuchen Sie mit dem Schlüsselwort register markiert haben.

Ich habe diese Art von Schmerz erlebt, wie gut und fand schließlich die einzige wirkliche Möglichkeit, um es am Ausgang Montag zu sehen war, zu versuchen und zu bestimmen, was gcc verursacht das Deepend zu gehen. Es gibt andere Dinge, die Sie tun können, aber es hängt davon ab, genau das, was Ihr Code versucht, zu tun. Ich war in einer sehr, sehr großen Funktion mit einer großen Menge von berechnetem goto Chaos arbeiten, in denen kleinere (scheinbar harmlose) Veränderungen katastrophale Leistung Treffer verursachen könnten. Wenn Sie tun, ähnlich gibt es ein paar Dinge, die Sie tun können, um zu versuchen, das Problem zu mildern, aber die Details sind etwas kitschig, so werde ich sie verzichten hier diskutieren, wenn es tatsächlich relevant ist.

Es hängt von dem Prozessor Sie verwenden. Oder soll ich sagen, ja, man kann mit dem Schlüsselwort register, aber das ist verpönt, wenn Sie einen einfachen Prozessor ohne Rohr-Innenfutter und einen Single-Core verwenden. In diesen Tagen GCC kann ein Weg besser machen, als Sie können mit Registerzuweisung. Vertrauen Sie es.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top