Frage

Ich habe mich gefragt, ob jemand auf iPhone 3Gs eine harte Zahlen für ARM und Daumencode -Leistung hatte. Insbesondere für den Code für nicht schwankende Punkte (VFP oder Neon) - bin ich mir der Probleme mit der Leistung des schwimmenden Punktes im Daumenmodus bewusst.

Gibt es einen Punkt, an dem die zusätzliche Codegröße größerer Armanweisungen zu einer Leistungsrisiko wird? Mit anderen Worten, wenn mein ausführbarer Code im Vergleich zum verfügbaren Speicher relativ gering ist gemessen Leistungsunterschied zum Einschalten des Daumenmodus?

Der Grund, warum ich frage, ist, dass ich den ARM für die neonspezifischen Quelldateien in Xcode mit der Option "-arm" aktivieren kann, dies jedoch den Simulator-Build unterbricht, da GCC X86 erstellt. Ich habe mich gefragt, ob ich "Compile als Daumen" ausschalten und damit fertig sein sollte.

War es hilfreich?

Lösung

Ich weiß nichts über das iPhone, aber eine Deckenanweisung, dass der Daumen langsamer als Arm überhaupt nicht korrekt ist. Bei der 32 -Bit -Breite Null -Wartezustandsspeicher ist der Daumen etwas langsamer, Zahlen wie 5% oder 10%. Wenn es sich um einen Thumb2 handelt, ist es eine andere Geschichte, es wird gesagt, dass Thumb2 schneller laufen kann. Ich weiß nicht, was das iPhone vermutet, dass es sich nicht um Daumen 2 handelt.
Wenn Ihnen der 32-Bit-Speicher nicht aus dem Null-Warnstaat ausgeht, variieren Ihre Ergebnisse. Eine große Sache ist 32 Bit breites Gedächtnis. Wenn Sie mit einem 16 -Bit -Bus wie der Gameboy Advance -Familie fahren und es einige Wartezeiten in diesem Gedächtnis oder ROM gibt, kann der Daumen leicht für die Leistung von Arm ausgestattet werden, obwohl mehr Daumenanweisungen erforderlich sind, um dieselbe Aufgabe auszuführen.

Testen Sie Ihren Code! Es ist nicht schwer, einen Test zu erfinden, der die Ergebnisse liefert, an denen Sie interessiert sind oder nicht. Es ist so einfach, Arm zu zeigen, wie der Daumen bläst, wie es Daumen ist, der den Arm wegbläst. Wen interessiert es, was die Dhrystones sind?

Was ich im Laufe der Jahre im Testen der Code -Leistung für ARM gefunden habe, ist, dass Ihr Code und Ihr Compiler der große Faktor sind. Daher ist der Daumen theoretisch ein paar Prozent langsamer, da er einige Prozent mehr Anweisungen verwendet, um dieselbe Aufgabe zu verformen. Aber wussten Sie, dass Ihr Lieblings -Compiler schrecklich sein könnte, und durch einfaches Schalter -Compiler können Sie mehrmals schneller laufen (GCC fällt in diese Kategorie)? Oder verwenden Sie denselben Compiler und vermischen die Optimierungsoptionen. In beiden Fällen können Sie den Unterschied zwischen Arm / Daumen beschatten, indem Sie in der Verwendung der Tools klug sind. Sie wissen das wahrscheinlich, aber Sie wären überrascht zu wissen, wie viele Leute denken, dass die einzige Möglichkeit, wie man Code erstellt, der einzige Weg ist, und der einzige Weg, um eine bessere Leistung zu erzielen, besteht darin, mehr Speicher oder andere Hardware auf das Problem zu werfen.

Wenn Sie auf dem iPhone sind, höre ich, dass diese Leute LLVM verwenden? Ich mag das LLVM-Konzept in vielerlei Hinsicht und ich bin bestrebt, es als meinen täglichen Fahrer zu verwenden, wenn es reift, aber es hat festgestellt, dass er für die jeweilige Aufgabe, die ich gemacht habe, Code produziert, der 10-20% (oder viel mehr) langsamer war. Ich war im Armmodus, ich habe den Daumenmodus nicht versucht, und ich hatte einen L1- und L2 -Cache an. Hätte ich ohne die Caches getestet, um Daumen wirklich mit dem Arm zu vergleichen, würde ich wahrscheinlich ein paar Prozent langsamer sehen, aber wenn Sie daran denken (was ich zu diesem Zeitpunkt nicht interessiert habe), können Sie doppelt so viel Daumencode wie ARM -Code zwischenspeichern Könnte bedeuten, dass, obwohl es ein paar Prozent mehr Code für die Aufgabe gibt, durch das Zwischenspeichern deutlich mehr davon und die Durchschnittsabrufzeit, die der Daumen ist, merklich schneller sein kann. Ich muss das vielleicht versuchen.

Wenn Sie LLVM verwenden, haben Sie das andere Problem mehrerer Stellen, um Optimierungen durchzuführen. Wenn Sie von C nach Bytecode gehen, können Sie den Bytecode selbst optimieren. Sie können dann Ihren gesamten Bytecode zusammenführen und dies als Ganzes optimieren. Wenn Sie dann vom Byte -Code zum Assembler wechseln, können Sie optimieren. Wenn Sie nur 3 Quelldateien hatten und angenommen haben, dass es nur zwei Optimierungsstufen pro Gelegenheit gab, die nicht optimieren oder optimieren, haben Sie mit GCC 8 Kombinationen zum Testen, mit LLVM Die Anzahl der Experimente ist fast eine Größenordnung höher . Mehr als Sie wirklich rennen können, Hunderte bis Tausende. Für den einen Test, den ich ausgeführt habe, nicht auf den Bytecode -Schritt operierte und dann den Bytecode nicht optimiert, während sie getrennt sind, sondern nach dem Zusammenführen der Bytecode -Dateien in einem großen (GER) eine optimiert werden. Die LLC -Optimierung auf dem Weg zum Arm führte zu den besten Ergebnissen.

Fazit ... Test, Test, Test.

BEARBEITEN:

Ich habe das Wort Bytecode verwendet, ich denke, der richtige Begriff ist Bitcode in der LLVM -Welt. Der Code in den .bc -Dateien meine ich ...

Wenn Sie mit LLVM von C zu Arm gehen, befindet sich Bitcode (BC) in der Mitte. Es gibt Befehlszeilenoptionen zum Optimieren des C -to BC -Schritts. Sobald Sie BC pro Datei optimieren können, können Sie BC bis BC optimieren. Wenn Sie wählen, können Sie zwei oder mehr BC -Dateien in größere BC -Dateien zusammenführen oder einfach alle Dateien in eine große BC -Datei umwandeln. Anschließend kann auch jede dieser kombinierten Dateien optimiert werden.

Meine Theorie, die bisher nur noch einige Testfälle enthält Mach seinen Job. Das bedeutet also, dass er ohne Optimierung von C zu BC wechseln. Führen Sie dann alle BC -Dateien in eine große BC -Datei zusammen. Sobald Sie das Ganze als eine große BC -Datei haben, lassen Sie den Optimierer seinen Optimierungsschritt durchführen, maximieren Sie die Informationen und hoffentlich Qualität der Optimierung. Gehen Sie dann von der optimierten BC -Datei zum ARM -Assembler. Die Standardeinstellung für LLC ist mit der Optimierung eingeschaltet. Sie möchten diese Optimierung zulassen, da dies der einzige Schritt ist, der weiß, wie man für das Ziel optimiert wird. Die BC -zu -BC -Optimierungen sind allgemein und nicht zielgerichtet (AFAIK).

Sie müssen noch testen, testen, testen. Experimentieren Sie mit Optimierungen zwischen den Schritten, um zu sehen, ob Ihr Programm schneller oder langsamer läuft.

Andere Tipps

Sehen Sie sich dieses PDF von ARM/Daumen für Performance/Code -Größe/Stromverbrauch aus.

Profil geführte Auswahl der Arm- und Daumenanweisungen
- Abteilung für Informatik, Universität von Arizona von Rajiv Gupta

Der Daumencode ist im Wesentlichen immer langsamer als gleichwertiger Arm. Der einzige Fall, in dem der Daumencode ein großer Leistungsgewinn sein kann, ist, wenn der Unterschied zwischen Ihrem Code-Anpassung an On-Chip-Speicher oder Cache macht.

Es ist schwierig, genaue Zahlen für Leistungsunterschiede zu geben, da dies vollständig davon abhängt, was Ihr Code tatsächlich tut.

Sie können den Compiler-Flags von Per-Architecture in Xcode festlegen, wodurch das Brechen des Simulator-Builds vermieden wird. Siehe Dokumentation zur Einstellung von Xcode Build -Einstellungen.

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