Maison >Périphériques technologiques >Industrie informatique >Guide GCC pour les processeurs Ampère
Cet article a été initialement publié par Ampere Computing.
Cet article décrit comment utiliser efficacement les options de collecte de compilateurs GNU (GCC) pour aider à optimiser les performances de l'application sur les processeurs Ampère.
Lorsque vous essayez d'optimiser une application, il est essentiel de mesurer si une optimisation potentielle améliore les performances. Cela inclut les options de compilateur. L'utilisation d'options de compilateur avancées peut entraîner de meilleures performances d'exécution, potentiellement au coût d'une augmentation du temps de compilation, de plus de difficultés de débogage et souvent d'une taille binaire accrue. Pourquoi les options de compilateur affectent les performances dépassent le cadre de cet article, bien que la réponse courte soit que la génération de code, les architectures de processeurs modernes et comment elles interagissent sont très compliquées! Un autre point important est que différents processeurs peuvent bénéficier de différentes options de compilateur en raison des variations de l'architecture informatique et de la microarchitecture spécifique. L'expérimentation répétée avec des optimisations est la clé du succès des performances.
Comment mesurer les performances d'une application pour déterminer les facteurs limitatifs, ainsi que les stratégies d'optimisation, ont déjà été couverts dans des articles précédemment publiés. Le document, les 10 premières questions à répondre lors de l'exécution sur les instances basées sur Ampère Altra, décrit les données de performance à collecter pour comprendre l'ensemble des performances du système. Une méthodologie d'analyse des performances pour optimiser les processeurs familiaux Ampère Altra explique comment optimiser efficacement et efficacement une approche basée sur les données.
Ce document résume d'abord les options GCC les plus courantes avec une description de la façon dont ces options affectent les applications. La discussion se tourne ensuite vers des études de cas en utilisant des options GCC pour améliorer les performances du logiciel de codage vidéo VP9 et de la base de données MySQL pour les processeurs AMPERE. Des stratégies similaires ont été effectivement utilisées pour optimiser des logiciels supplémentaires fonctionnant sur des processeurs Ampère.
Le compilateur GCC offre de nombreuses options qui peuvent améliorer les performances de l'application. Voir le site Web du GCC pour plus de détails. Pour générer du code qui tire parti de toutes les fonctionnalités de performance disponibles dans les processeurs AMPERE, utilisez l'option GCC -MCPU.
Pour utiliser l'option GCC -MCPU, définissez le modèle CPU ou dites à GCC d'utiliser le modèle CPU en fonction de la machine sur laquelle GCC fonctionne via -mcpu = natif. Remarque Sur les systèmes basés sur Legacy X86, GCC -MCPU est un synonyme obsolète pour -Mtune, tandis que GCC -MCPU est entièrement pris en charge sur les systèmes basés sur les bras. Voir Guide d'ARM sur les drapeaux du compilateur à travers les architectures: -March, -Mtune et -MCPU pour plus de détails.
En résumé, dans la mesure du possible, utilisez uniquement -MCPU et évitez -March et -Mtune lors de la compilation pour le bras. Vous trouverez ci-dessous une étude de cas mettant en évidence les gains de performances en définissant l'option GCC -MCPU avec le logiciel de codage vidéo VP9.
Définition de l'option -mcpu:
-mcpu = ampère1: générer du code qui s'exécutera sur des processeurs AMPEROE. Ampereone est la prochaine génération de processeurs natifs cloud d'Ampère, étendant la famille de processeurs haute performance aux nouveaux comptes de base de l'industrie. Remarque, cela peut générer du code qui ne s'exécutera pas sur les processeurs Ampère Altra et Altra Max. Cette option était initialement disponible dans GCC version 12.1 et plus tard, puis recouverte de GCC 10.5 et GCC 11.3.
-mcpu = neoversse-n1: générer du code qui s'exécutera sur ampère altra, ampère altra max ainsi qu'à ampère ampèreone. Bien que l'utilisation de cette option pour le code qui s'exécutera sur AMPERE AMPEREOE soit prise en charge, elle ne profitera pas de toutes les nouvelles fonctionnalités de performance disponibles. Remarque, GCC version 9.1 ou plus est nécessaire pour permettre des réglages spécifiques au CPU pour les processeurs Ampère Altra et Ampère Altra Max.
-mcpu = natif: générer le paramètre de code Le modèle CPU basé sur le CPU GCC fonctionne. Remarque, GCC version 9.1 ou plus est nécessaire pour activer les réglages spécifiques du CPU pour les processeurs Ampère Altra et Ampère Altra Max.
L'utilisation de -mcpu = native est potentiellement plus facile à utiliser, bien qu'il ait un problème potentiel si l'exécutable, la bibliothèque partagée ou le fichier d'objet sont utilisés sur un système différent. Si la construction a été effectuée sur un processeur Ampere Ampereone, le code peut ne pas s'exécuter sur un processeur AMPERE ALTRA ou ALTRA MAX car le code généré peut inclure des instructions ARMV8.6 prises en charge sur les processeurs AMPEREO Si la construction a été effectuée sur un processeur Ampère Altra ou Altra Max, GCC ne profitera pas des dernières améliorations de performances disponibles sur les processeurs Ampère Ampereone. Il s'agit d'un problème général lorsque le code de construction pour profiter des fonctionnalités de performance pour toute architecture.
Le tableau suivant répertorie les versions GCC qui prennent en charge les valeurs du processeur AMPERE -MCPU.
Notre recommandation consiste à utiliser l'option GCC -MCPU avec la valeur appropriée décrite ci-dessus (-mcpu = ampère1, -mcpu = neoversse-n1 ou -mcpu = native) avec -o2 pour établir une ligne de base pour les performances, puis explorer des autres Options d'optimisation et mesure si différentes options améliorent les performances par rapport à la ligne de base.
Résumé des options GCC communes:
-MCPU a recommandé lors de la construction de processeurs Ampère pour permettre un réglage et des optimisations spécifiques au processeur. (Voir discussion «Définition de la section -MCPU Option» ci-dessus pour plus de détails.)
-os optimiser pour réduire la taille du code, potentiellement si votre application est limitée en récupérant les instructions.
-O2 a considéré l'option d'optimisation GCC standard et bonne à utiliser comme référence pour comparer avec d'autres options de CCG.
-o3 ajoute des optimisations supplémentaires pour générer des codes plus efficaces pour les boucles, utile à essayer si les performances de votre application sont dominées par le temps passé en boucles.
Optimisation guidée du profil (PGO): -fprofile-géériser et -fprofile-use. Générez des données de profil que le compilateur utilisera pour potentiellement prendre de meilleures décisions sur les optimisations telles que l'inlinaison, les optimisations de boucle et les branches par défaut. Ceci est considéré comme une optimisation avancée car elle nécessite des modifications du système de construction, voir ci-dessous.
Optimisation du temps de liaison (LTO): -flto. Activez les optimisations de liaison-temps, permettant au compilateur d'optimiser les fichiers source individuels. Cela permet aux fonctions d'être incorporées sur les fichiers source parmi d'autres optimisations du compilateur. Ceci est également considéré comme une optimisation avancée et nécessite potentiellement des modifications du système de construction. Cette option augmente le temps de construction global, qui peut être dramatique pour les grandes applications. Il est possible d'utiliser LTO uniquement sur les fichiers source critiques de performances pour réduire les temps de construction.
VP9 est un format de codage vidéo développé par Google. LiBVPX est l'implémentation du logiciel de référence open source pour les codecs vidéo VP8 et VP9 de Google et l'Alliance pour les médias ouverts (Aomedia). LIBVPX offre une amélioration significative de la compression vidéo sur X264 avec le coût du temps de calcul supplémentaire. Des informations supplémentaires sur VP9 et LiBVPX sont disponibles sur Wikipedia.
Dans cette étude de cas, la version VP9 est configurée pour utiliser l'option GCC -MCPU = native pour améliorer les performances. Comme mentionné ci-dessus, utilisez l'option -MCPU lors de la compilation sur des processeurs AMPERE pour activer le réglage et les optimisations spécifiques du CPU. Initialement, libvpx a été construit en utilisant la configuration par défaut, puis reconstruit à l'aide de -mcpu = natif. Pour évaluer les performances VP9, un fichier vidéo d'entrée 1080p, original_videos_sports_1080p_sports_1080p-0063.mkv à partir de l'ensemble de données de contenu généré par l'utilisateur de YouTube. Voir Guide de réglage et de construction FFMPEG d'Ampère pour plus de détails sur la façon de créer FFMPEG et divers codecs, y compris VP9 pour les processeurs AMPERE.
build libvpx par défaut:
$ 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
comment optimiser la construction libvpx avec -mcpu = native
$ # 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
Une enquête utilisant Linux Perf pour mesurer le nombre de cycles CPU dans les fonctions qui ont pris le plus de temps incluent les fonctions VPX_CONVOLVE8_HORIZ_NEON et VPX_CONVOLVE8_VERT_NEON. Le référentiel Libvpx Git montre que ces fonctions ont été optimisées par ARM pour utiliser l'instruction ARMV8.6-A USDOT (produit de point de signalisation mixte) qui est prise en charge par les processeurs AMPERE.
Les cycles de CPU dépensés dans VPX_CONVOLVOL8_HORIZ_NEON ont été réduits de 6,07E 11 à 2,52E 11 en utilisant GCC -MCPU = natif pour activer l'optimisation du produit DOT sur un processeur d'altra Ampère, réduisant les cycles CPU par un facteur de 2,4x.
Pour VPX_CONVOLVE8_VERT_NEON, les cycles du CPU ont été réduits de 2,46E 11 à 2,07E 11, pour une réduction de 16%.
Globalement, en utilisant -mcpu = natif pour activer l'instruction du produit DOT a accéléré la transcodage du fichier original_videos_sports_1080p_sports_1080p-0063.mkv par 7% sur un processeur altra ampère en améliorant le débit de l'application. Le tableau suivant montre les données collectées à l'aide de l'enregistrement PERF et des utilitaires de rapport perf pour mesurer les cycles et les instructions du processeur à la retraite.
Cette section fournit un aperçu de l'optimisation guidée du profil de GCC (PGO) et une étude de cas de l'optimisation de MySQL avec PGO. Les optimisations des guides de profil permettent à GCC de prendre de meilleures décisions d'optimisation, notamment l'optimisation des branches, la réorganisation du bloc de code, les fonctions d'inclinaison et les optimisations de boucles via un déroulement de boucles, un pelage et une vectorisation en boucle. L'utilisation de PGO nécessite de modifier l'environnement de construction pour faire une construction en 3 parties.
Un défi de l'utilisation de PGO est les frais généraux extrêmement élevés à l'étape 2 ci-dessus. En raison de la lenteur des performances, une application construite avec GCC -fprofile-Genereate, il peut ne pas être pratique de fonctionner sur des systèmes opérant dans un environnement de production. Consultez la section Options d'instrumentation du programme du GCC Manual pour créer des applications avec une instrumentation d'exécution et les options de section qui contrôlent l'optimisation de la reconstruction en utilisant les informations de profil générées pour des détails supplémentaires.
Comme décrit dans le manuel du GCC, -fprofile-update = atomic est recommandé pour les applications multi-thread et peut améliorer les performances en collectant des données de profil améliorées.
Avec PGO, GCC peut mieux optimiser les applications en fournissant des informations supplémentaires telles que la mesure des succursales prises par rapport aux dénombrements de voyage en boucle non pris et de mesure. Le PGO est une optimisation utile pour essayer de voir si elle améliore les performances. Signatures de performance où PGO peut aider à inclure des applications avec un pourcentage important de mauvaise prédiction des succursales, qui peuvent être mesurées à l'aide de l'utilitaire Perf pour lire le compteur de l'unité de surveillance des performances du CPU (PMU) BR_MIS_PRED_REREDired. Un grand nombre de erreurs de prédiction des succursales conduisent à un pourcentage élevé de stands frontaux, qui peuvent être mesurés par le compteur PMU stall_fronttend. Les applications avec un taux de manchet de cache d'instructions L2 élevé peuvent également bénéficier de la PGO, peut-être liée aux succursales mal prédirées. En résumé, un grand pourcentage des erreurs erronées de branche, des stands frontaux du processeur et des manquements de cache d'instructions L2 sont des signatures de performance où PGO peut améliorer les performances.
MySQL est la base de données open source la plus populaire au monde et en raison de l'énorme taille binaire MySQL, est un candidat idéal pour utiliser l'optimisation GCC PGO. Sans informations PGO, il est impossible pour GCC de prédire correctement les nombreux chemins de code différents exécutés. L'utilisation de PGO réduit considérablement les erreurs de prédiction des branches, le taux de manchet de cache d'instructions L2 et les stands frontaux du CPU sur le processeur Ampère Altra Max.
Résumé comment MySQL est optimisé à l'aide de GCC PGO:
Des détails supplémentaires peuvent être trouvés sur le site Web du développeur AMPERE dans le Guide de réglage MySQL.
L'optimisation des applications nécessite d'expérimenter différentes stratégies pour déterminer ce qui fonctionne le mieux. Cet article fournit des recommandations pour différentes optimisations du compilateur GCC pour générer des applications très performantes exécutées sur des processeurs AMPERE. Il met en évidence l'utilisation de l'option -MCPU comme moyen le plus simple de générer du code qui tire parti de toutes les fonctionnalités prises en charge par les processeurs natifs Ampère Cloud. Deux études de cas, pour la base de données MySQL et le codeur vidéo VP9, montrent l'utilisation des options GCC pour optimiser ces applications où les performances sont critiques.
Conçu pour le cloud computing durable, les premiers processeurs natifs d'Ampère offrent des performances élevées, une évolutivité de la plate-forme et une efficacité énergétique sans précédent dans l'industrie. Nous vous invitons à en savoir plus sur nos efforts de développeur et à trouver les meilleures pratiques sur développeur.amperecomputing.com et à rejoindre la conversation sur communautaire.amperecomputing.com.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!