Heim >Technologie-Peripheriegeräte >IT Industrie >GCC -Leitfaden für Ampere -Prozessoren
Dieser Artikel wurde ursprünglich von Ampere Computing veröffentlicht.
In diesem Artikel wird beschrieben
Beim Versuch, eine Anwendung zu optimieren, ist es wichtig zu messen, ob eine potenzielle Optimierung die Leistung verbessert. Dies schließt Compiler -Optionen ein. Die Verwendung fortschrittlicher Compiler -Optionen kann zu einer besseren Laufzeitleistung führen, potenziell auf Kosten einer höheren Kompilierung, mehr Debug -Schwierigkeiten und häufig zu einer erhöhten Binärgröße. Warum Compiler -Optionen die Leistung beeinflussen, liegt außerhalb des Rahmens dieses Papiers, obwohl die kurze Antwort lautet, dass Codegenerierung, moderne Prozessorarchitekturen und wie sie interagieren, sehr kompliziert sind! Ein weiterer wichtiger Punkt ist, dass verschiedene Prozessoren aufgrund von Variationen der Computerarchitektur und der spezifischen Mikroarchitektur von unterschiedlichen Compiler -Optionen profitieren können. Wiederholtes Experimentieren mit Optimierungen ist der Schlüssel zum Leistungserfolg.So messen Sie die Leistung einer Anwendung, um die begrenzenden Faktoren sowie Optimierungsstrategien zu bestimmen, in den zuvor veröffentlichten Artikeln. Das Papier, die ersten 10 Fragen, die Sie während der Ausführung von Ampere Altra-basierten Instanzen beantworten sollten, beschreibt, welche Leistungsdaten erfasst werden sollen, um die Leistung des gesamten Systems zu verstehen. Eine Leistungsanalyse-Methodik zur Optimierung von Ampere Altra Family-Prozessoren erklärt, wie Sie effektiv und effizient mit einem datengesteuerten Ansatz optimieren können.
Dieses Papier fasst zunächst die gängigsten GCC -Optionen mit einer Beschreibung, wie sich diese Optionen auswirken. Die Diskussion wendet sich dann zu Fallstudien mit GCC -Optionen zur Verbesserung der Leistung der VP9 -Videocodierungssoftware und der MySQL -Datenbank für Ampere -Prozessoren vor. Ähnliche Strategien wurden effektiv verwendet, um zusätzliche Software zu optimieren, die auf Ampere -Prozessoren ausgeführt wird.
GCC -Empfehlungen
Um die Option GCC -MCPU zu verwenden, setzen Sie entweder das CPU -Modell ein oder geben Sie GCC an, das CPU -Modell basierend auf der Maschine zu verwenden, auf der GCC über -mcpu = nativ ausgeführt wird. Hinweis auf Legacy X86 -basierte Systeme, GCC -MCPU ist ein veraltetes Synonym für -mtune, während GCC -MCPU auf ARM -basierten Systemen vollständig unterstützt wird. Weitere Informationen finden Sie unter Architekturen: -March, -mtune und -mcpu.
Verwenden Sie nach Möglichkeit nur -mcpu und vermeiden Sie, march und -mtune beim Kompilieren für Arm. Im Folgenden finden Sie eine Fallstudie, in der Leistungssteigerungen hervorgehoben werden, indem die Option GCC -MCPU mit VP9 -Video -Codierungssoftware festgelegt wird.
Einstellen der Option -mcpu:
-mcpu = ampere1: generieren Code, der auf AmpereOn-Prozessoren ausgeführt wird. AmpereOne ist die nächste Generation von Cloud-nativen Prozessoren aus Ampere und erweitert die Familie von Hochleistungsprozessoren auf neue branchenführende Kernzählungen. Beachten Sie, dass dies Code generieren kann, die nicht auf Ampere Altra- und Altra Max -Prozessoren ausgeführt werden. Diese Option war zunächst in GCC Version 12.1 erhältlich und später auf GCC 10.5 und GCC 11.3 zurückgeschrieben.
-mcpu = Neoverse-n1: CODE generieren, der auf Ampere Altra, Ampere Altra Max sowie Ampere AmpereOne ausgeführt wird. Während diese Option für Code verwendet wird, die auf Ampere AmpereOne ausgeführt wird, wird er möglicherweise nicht alle verfügbaren neuen Leistungsfunktionen nutzen. Hinweis, GCC Version 9.1 oder höher ist erforderlich, um CPU -spezifische Tunings für Ampere Altra und Ampere Altra Max -Prozessoren zu aktivieren.
-mcpu = nativ: Codes-Codebetonte Das CPU-Modell basierend auf dem CPU GCC wird ausgeführt. Hinweis, GCC Version 9.1 oder höher ist erforderlich, um CPU -spezifische Tunings für Ampere -Altra- und Ampere -Altra -Max -Prozessoren zu aktivieren.
Die Verwendung von -mcpu = nativ ist möglicherweise einfacher zu bedienen, obwohl es ein potenzielles Problem hat, wenn die ausführbare Datei, die gemeinsame Bibliothek oder die Objektdatei in einem anderen System verwendet werden. Wenn der Build auf einem Ampere -AmpereOne -Prozessor durchgeführt wurde, kann der Code auf einem Ampere -Altra- oder Altra -Max -Prozessor nicht ausgeführt werden, da der generierte Code möglicherweise ARMV8.6 -Anweisungen enthalten kann, die bei Ampere -Ampere -Prozessoren unterstützt werden. Wenn der Build auf einem Ampere Altra oder Altra Max -Prozessor durchgeführt wurde, nutzt GCC die neuesten Leistungsverbesserungen, die bei Ampere -Ampereone -Prozessoren verfügbar sind, nicht. Dies ist ein allgemeines Problem beim Erstellen von Code, um die Leistungsfunktionen für jede Architektur zu nutzen.
Die folgende Tabelle listet auf, welche GCC -Versionen die Ampere -Prozessor -MCPU -Werte unterstützen.
Unsere Empfehlung ist die Verwendung der Option GCC -MCPU mit dem oben beschriebenen Wert (-mcpu = Ampere1, -mcpu = Neoverse -n1 oder -mcpu = nativ) mit -O2 Optimierungsoptionen und Messen, wenn verschiedene Optionen die Leistung im Vergleich zur Basislinie verbessern.
Zusammenfassung der gemeinsamen GCC -Optionen:
-mcpu empfohlen, wenn Sie auf Ampere-Prozessoren aufbauen, um prozessorspezifische Abstimmungen und Optimierungen zu ermöglichen. (Siehe Diskussion „Einstellen des Abschnitts -mcpu -Option“ oben für Einzelheiten.)
-OS optimieren Sie, um die Codegröße zu reduzieren. Wenn Ihre Anwendung durch Abrufen von Anweisungen begrenzt ist.
-O2 berücksichtigte die Standardoption für GCC-Optimierungsoptimierung und ist als Basislinie für den Vergleich mit anderen GCC-Optionen verwendet.
-O3 fügt zusätzliche Optimierungen hinzu, um effizientere Codes für Schleifen zu generieren.
Profilgeführte Optimierung (PGO): -Frofil -Generate & -FProfile -Use. Generieren Sie Profildaten, mit denen der Compiler möglicherweise bessere Entscheidungen über Optimierungen wie Inlining, Loop -Optimierungen und Standardzweige trifft. Dies wird als erweiterte Optimierung angesehen, da Änderungen am Build -System erforderlich sind, siehe unten.
Link -Time -Optimierung (LTO): -flto. Aktivieren Sie die Optimierung der Link-Zeit-Optimierungen, sodass der Compiler über einzelne Quelldateien hinweg optimieren kann. Auf diese Weise können Funktionen unter anderem die Optimierungen des Compiler über Quelldateien eingebaut werden. Dies wird auch als fortschrittliche Optimierung angesehen und erfordert möglicherweise Änderungen am Build -System. Diese Option erhöht die Gesamtbauzeit, was für große Anwendungen dramatisch sein kann. Es ist möglich, LTO nur für leistungskritische Quelldateien zu verwenden, um die Erstellungszeiten möglicherweise zu verkürzen.
VP9 ist ein von Google entwickelter Videocodierungsformat. LIBVPX ist die Open-Source-Referenzsoftware-Implementierung für die VP8- und VP9-Video-Codecs von Google und die Alliance for Open Media (Aomedia). LIBVPX bietet eine signifikante Verbesserung der Videokomprimierung gegenüber X264 mit dem Aufwand für zusätzliche Rechenzeit. Weitere Informationen zu VP9 und LIBVPX finden Sie auf Wikipedia.
In dieser Fallstudie ist der VP9 -Build so konfiguriert, dass sie die Option GCC -MCPU = native verwenden, um die Leistung zu verbessern. Verwenden Sie, wie oben erwähnt, die Option -mcpu beim Kompilieren von Ampere -Prozessoren, um die CPU -spezifische Abstimmung und Optimierungen zu ermöglichen. Anfänglich wurde LIBVPX unter Verwendung der Standardkonfiguration erstellt und dann mit -mcpu = nativ umgebaut. Zur Bewertung von VP9-Leistung wurde eine 1080p-Eingangsvideodatei, Original_Videos_Sports_1080p_sports_1080p-0063.mkv aus dem benutzergenerierten Inhaltsdatensatz des YouTube-generierten Inhalts verwendet. Weitere Informationen zum Erstellen von FFMPEG und verschiedenen Codecs, einschließlich VP9 für Ampere -Prozessoren, finden Sie unter Ampere's FFMPEG -Tuning- und Build -Handbuch.
.Standard libvpx Build:
$ git clone https://chromium.googlesource.com/webm/libvpx $ cd libvpx/ $ export CFLAGS="-mcpu=native -DNDEBUG -O3 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Wall -Wdeclaration-after-statement -Wdisabled-optimization -Wfloat-conversion -Wformat=2 -Wpointer-arith -Wtype-limits -Wcast-qual -Wvla -Wimplicit-function-declaration -Wmissing-declarations -Wmissing-prototypes -Wuninitialized -Wunused -Wextra -Wundef -Wframe-larger-than=52000 -std=gnu89" $ export CXXFLAGS="-mcpu=native -DNDEBUG -O3 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Wall -Wdisabled-optimization -Wextra-semi -Wfloat-conversion -Wformat=2 -Wpointer-arith -Wtype-limits -Wcast-qual -Wvla -Wmissing-declarations -Wuninitialized -Wunused -Wextra -Wno-psabi -Wc++14-extensions -Wc++17-extensions -Wc++20-extensions -std=gnu++11 -std=gnu++11" $ ./configure $ make verbose=1 $ ./vpxenc --codec=vp9 --profile=0 --height=1080 --width=1920 --fps=25/1 --limit=100 -o output.mkv /home/joneill/Videos/original_videos_Sports_1080P_Sports_1080P-0063.mkv --target-bitrate=2073600 --good --passes=1 --threads=1 –debug
So optimieren Sie libvpx build mit -mcpu = nativ
$ # rebuild with -mcpu=native $ make clean $ export CFLAGS="-mcpu=native -DNDEBUG -O3 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Wall -Wdeclaration-after-statement -Wdisabled-optimization -Wfloat-conversion -Wformat=2 -Wpointer-arith -Wtype-limits -Wcast-qual -Wvla -Wimplicit-function-declaration -Wmissing-declarations -Wmissing-prototypes -Wuninitialized -Wunused -Wextra -Wundef -Wframe-larger-than=52000 -std=gnu89" $ export CXXFLAGS="-mcpu=native -DNDEBUG -O3 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Wall -Wdisabled-optimization -Wextra-semi -Wfloat-conversion -Wformat=2 -Wpointer-arith -Wtype-limits -Wcast-qual -Wvla -Wmissing-declarations -Wuninitialized -Wunused -Wextra -Wno-psabi -Wc++14-extensions -Wc++17-extensions -Wc++20-extensions -std=gnu++11 -std=gnu++11" $ ./configure $ make verbose=1 # verify the build uses the sdot dot product instruction: $ objdump -d vpxenc | grep sdot | wc -l 128 $ ./vpxenc --codec=vp9 --profile=0 --height=1080 --width=1920 --fps=25/1 --limit=100 -o output.mkv /home/joneill/Videos/original_videos_Sports_1080P_Sports_1080P-0063.mkv --target-bitrate=2073600 --good --passes=1 --threads=1 --debug
Eine Untersuchung unter Verwendung von Linux -Perf, um die Anzahl der CPU -Zyklen in den Funktionen zu messen, die die meiste Zeit in Anspruch nahmen Das LIBVPX-Git-Repository zeigt, dass diese Funktionen von ARM optimiert wurden, um den Anweisungen ARMV8.6-A USDOT (gemischtes Signal-Produkt) zu verwenden, der von Ampere-Prozessoren unterstützt wird.
Die CPU -Zyklen, die in vpx_convolve8_horiz_neon ausgegeben wurden, wurden von 6.07e 11 bis 2,52E 11 unter Verwendung von GCC -MCPU = nativ reduziert, um die DOT -Produktoptimierung auf einem Ampere -Altra -Prozessor zu aktivieren, wodurch die CPU -Cyclen um einen Faktor von 2,4x reduziert werden.
Für vpx_convolve8_vert_neon wurden die CPU -Zyklen für eine Reduzierung von 16% von 2,46E 11 auf 2,07E 11 reduziert.
Insgesamt mit -mcpu = nativ, um die DOT -Produktanweisung zu aktivieren, um die Datei zu überschreiten, die die Datei Original_videos_sports_1080p_sports_1080p -0063.mkv um 7% auf einem Ampere -Altra -Prozessor durch Verbesserung des Anwendungsdurchsatzes um 7%. In der folgenden Tabelle werden Daten angezeigt, die mithilfe der Perf -Record- und Perf -Report -Dienstprogramme zur Messung von CPU -Zyklen und -anweisungen im Ruhestand gesammelt werden.
Dieser Abschnitt bietet einen Überblick über die Profile -geführte Optimierung von GCC (PGO) und eine Fallstudie zur Optimierung von MySQL mit PGO. Die Optimierungen des Profilhandbuchs ermöglichen es GCC, bessere Optimierungsentscheidungen zu treffen, einschließlich der Optimierung von Zweigen, Code -Block -Neuordnung, Inlining -Funktionen und Loops -Optimierungen über das Aufrollen von Schleifen, Schleifenschalen und Vektorisierung. Die Verwendung von PGO erfordert die Änderung der Build-Umgebung, um einen 3-teiligen Build durchzuführen.
Eine Herausforderung der Verwendung von PGO ist der extrem hohe Leistungsaufwand in Schritt 2 oben. Aufgrund der langsamen Leistung, die eine Anwendung ausführt, die mit GCC -FRPROFILE -Generate erstellt wurde, ist es möglicherweise nicht praktisch, auf Systemen zu betreiben, die in einer Produktionsumgebung betrieben werden. In den Abschnitt "Programminstrumentenoptionen des GCC-Handbuchs" finden Sie Anwendungen mit Laufzeitinstrumenten und den Abschnittoptionen, die die Optimierung für den Wiederaufbau der generierten Profilinformationen für zusätzliche Details steuern.
Wie im GCC-Handbuch beschrieben, wird -frofile-update = atomic für multi-thread-Anwendungen empfohlen und kann die Leistung verbessern, indem sie verbesserte Profildaten sammelt.
Mit PGO kann GCC Anwendungen besser optimieren, indem zusätzliche Informationen wie Messen von Zweigen im Vergleich zu nicht aufgenommenem und die Messung der Schleifenausflugzahlen bereitgestellt werden. PGO ist eine nützliche Optimierung, um zu versuchen, festzustellen, ob sie die Leistung verbessert. Leistungssignaturen, bei denen PGO helfen kann, enthalten Anwendungen mit einem erheblichen Prozentsatz an Fehlverhaltenszweigen, die mithilfe des Perf -Dienstprogramms gemessen werden können, um die PMU -Zähler (PMU) der CPU zu lesen. Eine große Anzahl von Zweigverpörungen führt zu einem hohen Prozentsatz der Front-End-Stände, die durch den PMU-Zähler von STALL_FRONTEND gemessen werden können. Anwendungen mit einem hohen L2-Befehlsrate mit einem hohen L2-Fehlschlag können auch von PGO profitieren, möglicherweise im Zusammenhang mit falsch verzeichneten Zweigen. Zusammenfassend lässt sich sagen, dass ein großer Prozentsatz an Zweig -Fehlverpredungen, CPU -Frontendständen und L2 -Befehlsmehlungen Leistungssignaturen sind, bei denen PGO die Leistung verbessern kann.
MySQL ist die weltweit beliebteste Open-Source-Datenbank und aufgrund der riesigen Binärgröße von MySQL ein idealer Kandidat für die Verwendung der GCC-PGO-Optimierung. Ohne PGO -Informationen ist es für GCC unmöglich, die vielen verschiedenen ausgeführten Codepfade korrekt vorherzusagen. Die Verwendung von PGO reduziert den Zweig -Fehlverhalten erheblich, L2 -Befehlsfehlrate und CPU -Frontendstände am Ampere Altra Max -Prozessor.
zusammenfassen, wie MySQL mit GCC PGO optimiert wird:
Weitere Details finden Sie auf der Website des Ampere -Entwicklers im MySQL -Tuning -Handbuch.
Optimierung von Anwendungen erfordert das Experimentieren mit unterschiedlichen Strategien, um festzustellen, was am besten funktioniert. Dieses Papier enthält Empfehlungen für verschiedene GCC -Compiler -Optimierungen, um leistungsstarke Anwendungen zu generieren, die auf Ampere -Prozessoren ausgeführt werden. Es zeigt die Verwendung der Option -mcpu als der einfachste Weg, um Code zu generieren, der alle Funktionen nutzt, die von Ampere -Cloud -nativen Prozessoren unterstützt werden. Zwei Fallstudien für MySQL -Datenbank und VP9 -Video -Encoder zeigen die Verwendung von GCC -Optionen zur Optimierung dieser Anwendungen, bei denen die Leistung kritisch ist.
für nachhaltiges Cloud Computing entwickelte Ampere -native Cloud -Prozessoren bieten vorhersehbare hohe Leistung, Plattformskalierbarkeit und in der Branche beispiellose Stromeffizienz. Wir laden Sie ein, mehr über unsere Entwicklerbemühungen zu erfahren und Best Practices bei teforner.amperecomputing.com zu finden und sich dem Gespräch unter Community.amperecomputing.com anzuschließen.
Das obige ist der detaillierte Inhalt vonGCC -Leitfaden für Ampere -Prozessoren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!