web-dev-qa-db-fra.com

Comment utiliser les optimisations guidées par profil dans g ++?

De plus, quelqu'un peut-il me diriger vers un bon tutoriel sur le sujet? Je n'en trouve pas.

66
nakiya

-fprofile-generate instrumentera l'application avec du code de profilage. L'application, en cours d'exécution, enregistrera certains événements qui pourraient améliorer les performances si ce modèle d'utilisation était connu au moment de la compilation. Les branches, la possibilité d'inlining, etc., peuvent toutes être enregistrées, mais je ne suis pas sûr en détail de la façon dont GCC implémente cela.

Une fois le programme terminé, il transfère toutes ces données dans des fichiers * .gcda, qui sont essentiellement des données de journal pour un test. Après avoir reconstruit l'application avec l'indicateur -fprofile-use, GCC prendra en compte les données du journal * .gcda lors de ses optimisations, augmentant généralement les performances de manière significative. Bien sûr, cela dépend de nombreux facteurs.

51
Maister

De cet exemple :

g++ -O3 -fprofile-generate [more params here, like -march=native ...] -o executable_name
// run my program's benchmarks, or something to stress its most common path
g++ -O3 -fprofile-use [more params here, like -march=native...] -o executable_name

Fondamentalement, vous compilez et liez initialement avec cet indicateur supplémentaire pour la compilation et la liaison: -fprofile-generate (de ici ).

Ensuite, lorsque vous l'exécutez, par défaut, il créera des fichiers .gcda "à côté" de vos fichiers .o, semble-t-il (codés en dur sur le chemin complet où ils ont été construits).

Vous pouvez éventuellement modifier l'emplacement de création de ces fichiers .gcda avec -fprofile-dir = XXX setting .

Ensuite, vous recompilez et reconnectez en utilisant le -fprofile-use, et il le compile en utilisant la qualité guidée par le profil.

21
rogerdpack

La partie délicate est la configuration des makefiles.

Vous avez certainement besoin de répertoires de sortie distincts pour les fichiers objets. Je recommanderais de les nommer "profil" et "version". Vous devrez peut-être copier les fichiers * .gcda résultant de l'exécution du profil afin que GCC les trouve à l'étape de génération de la version.

Le résultat sera certainement plus rapide. Il sera probablement plus grand également. L'option -fprofile-use permet de nombreuses autres étapes d'optimisation qui ne sont autrement activées que par -O3.

2
Zan Lynx