Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment comprendre l'output de g++ -ftime-report ?

    12 septembre 2022 à 0:16:26

    Salut tout le monde !

    J’ai compilé du code avec g++ -ftime-report pour faire du profiling.

    Voici ce que j’ai en output :

    Time variable                                   usr           sys          wall               GGC
         phase setup                        :   0.00 (  0%)   0.00 (  0%)   0.00 (  0%)    1353 kB (  0%)
         phase parsing                      :   2.06 (  5%)   1.13 ( 50%)   3.30 (  8%)  565836 kB ( 30%)
         phase lang. deferred               :   0.30 (  1%)   0.06 (  3%)   0.36 (  1%)   65727 kB (  4%)
         phase opt and generate             :  37.96 ( 94%)   1.07 ( 47%)  39.03 ( 91%) 1224911 kB ( 66%)
         |name lookup                       :   0.23 (  1%)   0.06 (  3%)   0.34 (  1%)   18602 kB (  1%)
         |overload resolution               :   0.36 (  1%)   0.10 (  4%)   0.41 (  1%)   83103 kB (  4%)
         garbage collection                 :   0.42 (  1%)   0.00 (  0%)   0.43 (  1%)       0 kB (  0%)
         dump files                         :   0.02 (  0%)   0.01 (  0%)   0.06 (  0%)       0 kB (  0%)
         callgraph construction             :   0.18 (  0%)   0.01 (  0%)   0.17 (  0%)   12930 kB (  1%)
         callgraph optimization             :   0.10 (  0%)   0.01 (  0%)   0.05 (  0%)     371 kB (  0%)
         ipa function summary               :   0.07 (  0%)   0.00 (  0%)   0.08 (  0%)    1110 kB (  0%)
         ipa dead code removal              :   0.03 (  0%)   0.00 (  0%)   0.02 (  0%)       0 kB (  0%)
         ipa devirtualization               :   0.01 (  0%)   0.00 (  0%)   0.00 (  0%)     134 kB (  0%)
         ipa cp                             :   0.10 (  0%)   0.01 (  0%)   0.12 (  0%)    8595 kB (  0%)
         ipa inlining heuristics            :   3.18 (  8%)   0.00 (  0%)   3.20 (  7%)   19108 kB (  1%)
         ipa function splitting             :   0.21 (  1%)   0.00 (  0%)   0.19 (  0%)     286 kB (  0%)
         ipa reference                      :   0.01 (  0%)   0.00 (  0%)   0.02 (  0%)       0 kB (  0%)
         ipa pure const                     :   0.05 (  0%)   0.01 (  0%)   0.06 (  0%)      17 kB (  0%)
         ipa icf                            :   0.12 (  0%)   0.00 (  0%)   0.12 (  0%)       1 kB (  0%)
         ipa SRA                            :   0.33 (  1%)   0.03 (  1%)   0.27 (  1%)   23892 kB (  1%)
         ipa free inline summary            :   0.01 (  0%)   0.00 (  0%)   0.00 (  0%)       0 kB (  0%)
         cfg construction                   :   0.04 (  0%)   0.00 (  0%)   0.03 (  0%)    2185 kB (  0%)
         cfg cleanup                        :   0.63 (  2%)   0.02 (  1%)   0.65 (  2%)    4734 kB (  0%)
         trivially dead code                :   0.16 (  0%)   0.00 (  0%)   0.09 (  0%)       0 kB (  0%)
         df scan insns                      :   0.24 (  1%)   0.01 (  0%)   0.22 (  1%)       8 kB (  0%)
         df multiple defs                   :   0.21 (  1%)   0.01 (  0%)   0.23 (  1%)       0 kB (  0%)
         df reaching defs                   :   0.75 (  2%)   0.00 (  0%)   0.74 (  2%)       0 kB (  0%)
         df live regs                       :   2.00 (  5%)   0.00 (  0%)   2.05 (  5%)       0 kB (  0%)
         df live&initialized regs           :   0.69 (  2%)   0.00 (  0%)   0.76 (  2%)       0 kB (  0%)
         df must-initialized regs           :   0.61 (  2%)   0.24 ( 11%)   0.83 (  2%)       0 kB (  0%)
         df use-def / def-use chains        :   0.25 (  1%)   0.00 (  0%)   0.26 (  1%)       0 kB (  0%)
         df reg dead/unused notes           :   0.87 (  2%)   0.00 (  0%)   0.79 (  2%)   14516 kB (  1%)
         register information               :   0.10 (  0%)   0.00 (  0%)   0.15 (  0%)       0 kB (  0%)
         alias analysis                     :   0.40 (  1%)   0.00 (  0%)   0.34 (  1%)   28831 kB (  2%)
         alias stmt walking                 :   0.72 (  2%)   0.07 (  3%)   0.64 (  1%)    5194 kB (  0%)
         register scan                      :   0.05 (  0%)   0.00 (  0%)   0.05 (  0%)     217 kB (  0%)
         rebuild jump labels                :   0.08 (  0%)   0.00 (  0%)   0.10 (  0%)       0 kB (  0%)
         preprocessing                      :   0.60 (  1%)   0.59 ( 26%)   1.38 (  3%)  194467 kB ( 10%)
         parser (global)                    :   0.22 (  1%)   0.23 ( 10%)   0.38 (  1%)  102668 kB (  6%)
         parser struct body                 :   0.27 (  1%)   0.06 (  3%)   0.35 (  1%)   62614 kB (  3%)
         parser function body               :   0.35 (  1%)   0.09 (  4%)   0.38 (  1%)   70207 kB (  4%)
         parser inl. func. body             :   0.06 (  0%)   0.04 (  2%)   0.07 (  0%)    7795 kB (  0%)
         parser inl. meth. body             :   0.16 (  0%)   0.04 (  2%)   0.22 (  1%)   32985 kB (  2%)
         template instantiation             :   0.64 (  2%)   0.14 (  6%)   0.78 (  2%)  160006 kB (  9%)
         constant expression evaluation     :   0.01 (  0%)   0.00 (  0%)   0.04 (  0%)     348 kB (  0%)
         early inlining heuristics          :   0.12 (  0%)   0.01 (  0%)   0.09 (  0%)   50683 kB (  3%)
         inline parameters                  :   0.16 (  0%)   0.00 (  0%)   0.16 (  0%)    9128 kB (  0%)
         integration                        :   1.01 (  3%)   0.13 (  6%)   1.20 (  3%)  272019 kB ( 15%)
         tree gimplify                      :   0.09 (  0%)   0.02 (  1%)   0.10 (  0%)   43912 kB (  2%)
         tree eh                            :   0.15 (  0%)   0.00 (  0%)   0.17 (  0%)   49453 kB (  3%)
         tree CFG construction              :   0.02 (  0%)   0.00 (  0%)   0.03 (  0%)   24163 kB (  1%)
         tree CFG cleanup                   :   0.77 (  2%)   0.02 (  1%)   0.86 (  2%)     570 kB (  0%)
         tree tail merge                    :   0.10 (  0%)   0.00 (  0%)   0.09 (  0%)    1409 kB (  0%)
         tree VRP                           :   0.68 (  2%)   0.00 (  0%)   0.76 (  2%)   30167 kB (  2%)
         tree Early VRP                     :   0.08 (  0%)   0.00 (  0%)   0.08 (  0%)    4515 kB (  0%)
         tree copy propagation              :   0.19 (  0%)   0.00 (  0%)   0.20 (  0%)     286 kB (  0%)
         tree PTA                           :   0.65 (  2%)   0.00 (  0%)   0.69 (  2%)    5326 kB (  0%)
         tree PHI insertion                 :   0.01 (  0%)   0.00 (  0%)   0.04 (  0%)    5166 kB (  0%)
         tree SSA rewrite                   :   0.29 (  1%)   0.02 (  1%)   0.27 (  1%)   28108 kB (  2%)
         tree SSA other                     :   0.04 (  0%)   0.01 (  0%)   0.05 (  0%)     357 kB (  0%)
         tree SSA incremental               :   0.38 (  1%)   0.02 (  1%)   0.39 (  1%)   13003 kB (  1%)
         tree operand scan                  :   0.27 (  1%)   0.05 (  2%)   0.21 (  0%)   41554 kB (  2%)
         dominator optimization             :   0.62 (  2%)   0.03 (  1%)   0.70 (  2%)   26865 kB (  1%)
         backwards jump threading           :   0.00 (  0%)   0.00 (  0%)   0.01 (  0%)    1082 kB (  0%)
         tree SRA                           :   0.07 (  0%)   0.00 (  0%)   0.03 (  0%)     757 kB (  0%)
         isolate eroneous paths             :   0.02 (  0%)   0.00 (  0%)   0.00 (  0%)       0 kB (  0%)
         tree CCP                           :   0.38 (  1%)   0.01 (  0%)   0.38 (  1%)    6460 kB (  0%)
         tree split crit edges              :   0.01 (  0%)   0.00 (  0%)   0.02 (  0%)    6860 kB (  0%)
         tree reassociation                 :   0.07 (  0%)   0.00 (  0%)   0.06 (  0%)      95 kB (  0%)
         tree PRE                           :   0.49 (  1%)   0.07 (  3%)   0.59 (  1%)   29233 kB (  2%)
         tree FRE                           :   0.31 (  1%)   0.06 (  3%)   0.37 (  1%)    5463 kB (  0%)
         tree code sinking                  :   0.05 (  0%)   0.00 (  0%)   0.05 (  0%)    1998 kB (  0%)
         tree linearize phis                :   0.06 (  0%)   0.00 (  0%)   0.06 (  0%)     235 kB (  0%)
         tree backward propagate            :   0.02 (  0%)   0.00 (  0%)   0.02 (  0%)       0 kB (  0%)
         tree forward propagate             :   0.15 (  0%)   0.00 (  0%)   0.19 (  0%)    3598 kB (  0%)
         tree phiprop                       :   0.00 (  0%)   0.01 (  0%)   0.01 (  0%)     162 kB (  0%)
         tree conservative DCE              :   0.17 (  0%)   0.04 (  2%)   0.18 (  0%)     121 kB (  0%)
         tree aggressive DCE                :   0.09 (  0%)   0.00 (  0%)   0.18 (  0%)    3761 kB (  0%)
         tree buildin call DCE              :   0.01 (  0%)   0.00 (  0%)   0.02 (  0%)      38 kB (  0%)
         tree DSE                           :   0.10 (  0%)   0.01 (  0%)   0.13 (  0%)    2485 kB (  0%)
         PHI merge                          :   0.02 (  0%)   0.00 (  0%)   0.01 (  0%)     202 kB (  0%)
         complete unrolling                 :   0.01 (  0%)   0.00 (  0%)   0.00 (  0%)     242 kB (  0%)
         tree slp vectorization             :   0.14 (  0%)   0.00 (  0%)   0.16 (  0%)   40876 kB (  2%)
         tree iv optimization               :   0.02 (  0%)   0.00 (  0%)   0.00 (  0%)     484 kB (  0%)
         tree SSA uncprop                   :   0.02 (  0%)   0.00 (  0%)   0.03 (  0%)       0 kB (  0%)
         tree switch conversion             :   0.01 (  0%)   0.00 (  0%)   0.00 (  0%)       0 kB (  0%)
         gimple CSE sin/cos                 :   0.01 (  0%)   0.00 (  0%)   0.00 (  0%)       3 kB (  0%)
         gimple widening/fma detection      :   0.04 (  0%)   0.00 (  0%)   0.04 (  0%)       0 kB (  0%)
         tree strlen optimization           :   0.05 (  0%)   0.00 (  0%)   0.04 (  0%)     192 kB (  0%)
         dominance frontiers                :   0.06 (  0%)   0.00 (  0%)   0.04 (  0%)       0 kB (  0%)
         dominance computation              :   0.70 (  2%)   0.00 (  0%)   0.78 (  2%)       0 kB (  0%)
         control dependences                :   0.03 (  0%)   0.00 (  0%)   0.02 (  0%)       0 kB (  0%)
         out of ssa                         :   0.09 (  0%)   0.00 (  0%)   0.09 (  0%)    1047 kB (  0%)
         expand vars                        :   0.61 (  2%)   0.00 (  0%)   0.59 (  1%)   11361 kB (  1%)
         expand                             :   0.24 (  1%)   0.02 (  1%)   0.27 (  1%)  110705 kB (  6%)
         post expand cleanups               :   0.11 (  0%)   0.00 (  0%)   0.09 (  0%)   11138 kB (  1%)
         varconst                           :   0.00 (  0%)   0.00 (  0%)   0.01 (  0%)       9 kB (  0%)
         forward prop                       :   0.28 (  1%)   0.00 (  0%)   0.32 (  1%)    7463 kB (  0%)
         CSE                                :   0.47 (  1%)   0.01 (  0%)   0.50 (  1%)    6406 kB (  0%)
         dead code elimination              :   0.15 (  0%)   0.00 (  0%)   0.16 (  0%)       0 kB (  0%)
         dead store elim1                   :   0.25 (  1%)   0.00 (  0%)   0.25 (  1%)    7807 kB (  0%)
         dead store elim2                   :   0.15 (  0%)   0.01 (  0%)   0.13 (  0%)   12268 kB (  1%)
         loop init                          :   0.30 (  1%)   0.00 (  0%)   0.32 (  1%)    3678 kB (  0%)
         loop invariant motion              :   0.00 (  0%)   0.00 (  0%)   0.01 (  0%)       1 kB (  0%)
         loop fini                          :   0.01 (  0%)   0.00 (  0%)   0.01 (  0%)       0 kB (  0%)
         CPROP                              :   0.49 (  1%)   0.00 (  0%)   0.49 (  1%)   12212 kB (  1%)
         PRE                                :   3.67 (  9%)   0.04 (  2%)   3.69 (  9%)   17514 kB (  1%)
         CSE 2                              :   0.28 (  1%)   0.01 (  0%)   0.29 (  1%)    2791 kB (  0%)
         branch prediction                  :   0.13 (  0%)   0.00 (  0%)   0.13 (  0%)     823 kB (  0%)
         combiner                           :   0.48 (  1%)   0.00 (  0%)   0.51 (  1%)   19027 kB (  1%)
         if-conversion                      :   0.08 (  0%)   0.00 (  0%)   0.07 (  0%)    3838 kB (  0%)
         integrated RA                      :   1.09 (  3%)   0.00 (  0%)   1.14 (  3%)   72103 kB (  4%)
         LRA non-specific                   :   0.52 (  1%)   0.01 (  0%)   0.47 (  1%)    3373 kB (  0%)
         LRA virtuals elimination           :   0.14 (  0%)   0.00 (  0%)   0.11 (  0%)    9546 kB (  1%)
         LRA reload inheritance             :   0.04 (  0%)   0.00 (  0%)   0.04 (  0%)     822 kB (  0%)
         LRA create live ranges             :   0.30 (  1%)   0.00 (  0%)   0.39 (  1%)    1330 kB (  0%)
         LRA hard reg assignment            :   0.01 (  0%)   0.00 (  0%)   0.03 (  0%)       0 kB (  0%)
         LRA rematerialization              :   0.10 (  0%)   0.00 (  0%)   0.05 (  0%)       0 kB (  0%)
         reload CSE regs                    :   0.49 (  1%)   0.00 (  0%)   0.53 (  1%)   15987 kB (  1%)
         load CSE after reload              :   2.73 (  7%)   0.00 (  0%)   2.72 (  6%)   11924 kB (  1%)
         ree                                :   0.07 (  0%)   0.00 (  0%)   0.10 (  0%)      74 kB (  0%)
         thread pro- & epilogue             :   0.18 (  0%)   0.00 (  0%)   0.22 (  1%)     446 kB (  0%)
         if-conversion 2                    :   0.08 (  0%)   0.00 (  0%)   0.06 (  0%)      23 kB (  0%)
         split paths                        :   0.01 (  0%)   0.00 (  0%)   0.00 (  0%)      16 kB (  0%)
         combine stack adjustments          :   0.01 (  0%)   0.00 (  0%)   0.03 (  0%)       0 kB (  0%)
         peephole 2                         :   0.09 (  0%)   0.00 (  0%)   0.11 (  0%)     878 kB (  0%)
         hard reg cprop                     :   0.19 (  0%)   0.00 (  0%)   0.15 (  0%)      11 kB (  0%)
         scheduling 2                       :   1.08 (  3%)   0.02 (  1%)   1.13 (  3%)    8034 kB (  0%)
         machine dep reorg                  :   0.09 (  0%)   0.00 (  0%)   0.09 (  0%)    2338 kB (  0%)
         reorder blocks                     :   0.33 (  1%)   0.00 (  0%)   0.31 (  1%)    4597 kB (  0%)
         shorten branches                   :   0.09 (  0%)   0.00 (  0%)   0.10 (  0%)       0 kB (  0%)
         final                              :   0.19 (  0%)   0.00 (  0%)   0.20 (  0%)   21653 kB (  1%)
         tree if-combine                    :   0.01 (  0%)   0.00 (  0%)   0.00 (  0%)     386 kB (  0%)
         straight-line strength reduction   :   0.04 (  0%)   0.00 (  0%)   0.03 (  0%)      26 kB (  0%)
         store merging                      :   0.02 (  0%)   0.00 (  0%)   0.01 (  0%)     868 kB (  0%)
         initialize rtl                     :   0.00 (  0%)   0.00 (  0%)   0.01 (  0%)      12 kB (  0%)
         address lowering                   :   0.01 (  0%)   0.00 (  0%)   0.00 (  0%)       0 kB (  0%)
         early local passes                 :   0.01 (  0%)   0.00 (  0%)   0.00 (  0%)       0 kB (  0%)
         rest of compilation                :   0.59 (  1%)   0.00 (  0%)   0.55 (  1%)    7917 kB (  0%)
         remove unused locals               :   0.17 (  0%)   0.00 (  0%)   0.16 (  0%)     416 kB (  0%)
         address taken                      :   0.11 (  0%)   0.01 (  0%)   0.14 (  0%)       0 kB (  0%)
         rebuild frequencies                :   0.05 (  0%)   0.00 (  0%)   0.04 (  0%)     138 kB (  0%)
         repair loop structures             :   0.00 (  0%)   0.00 (  0%)   0.01 (  0%)       0 kB (  0%)
         TOTAL                              :  40.32          2.26         42.69        1857845 kB

    Mon problème est que je ne comprends pas la plupart des termes utilisés dans le rapport de compilation (ipa cp, tree eh,…). J’aimerais au moins comprendre en quoi consiste l’étape phase opt and generate parce qu’elle représente 66% du temps de compilation.

    Dans la documentation de gcc, il n’y a quasiment aucune information sur l’option -ftime-report

    https://gcc.gnu.org/onlinedocs/gcc/Developer-Options.html#Developer-Options

    -ftime-report
    
        Makes the compiler print some statistics about the time consumed by each pass when it finishes.

    C’est un peu surprenant d’avoir une description aussi peu exhaustive pour une commande aussi complexe.

    Quelqu'un saurait où trouver plus d'information sur la sortie de cette commande ? Ça me serait d'une aide précieuse ! :pirate:

    Merci d'avance !

    -
    Edité par Autechre 12 septembre 2022 à 0:18:15

    • Partager sur Facebook
    • Partager sur Twitter
      12 septembre 2022 à 2:12:02

      ⅔ des étapes concerne la manipulation et la transformation de l'AST (une représentation des sources après parsing). Puisque tu as activé les optimisations, il y en a plein. Tu peux comparer le nombre de sans optimisation et avec -fsyntax-only

      « opt and generate » est la génération d'un .o ou d'un exe. 37s me semble particulièrement excessif, je suis curieux de savoir ce que tu compile et vers quelle architecture ?

      • Partager sur Facebook
      • Partager sur Twitter
        12 septembre 2022 à 19:36:29

        Je compile des grosses fonctions qui manipulent des données dans des tableaux mais je n'en sais pas beaucoup plus. Je compile vers du x86_64.

        Ah ok donc ça veut dire ça « opt and generate » ! Est-ce que tu sais où trouver une source fiable pour trouver la signification des autres termes ?

        • Partager sur Facebook
        • Partager sur Twitter
          12 septembre 2022 à 23:25:35

          Je ne me suis jamais intéressé plus que ça aux éléments que retourne -ftime-report, il ne donne pas suffisamment de détail pour savoir précisément ce qu'il faut changer. Habituellement je m’intéresse plus au coût d'instanciation des templates avec -ftime-trace de clang.

          Le problème avec le temps de compilation est que cela est très dépendant des options de compilation et des sources. Les optimisations comme -O3 vont considérablement augmenter le temps de compilation (+20% facile), alors qu'on peut avoir l'inverse avec d'autre (par exemple, -flto peut accélérer la compilation, mais le linkage sera considérablement allongé). Pour la génération elle-même, les symboles vont aussi jouer (un -g et encore +20%), peut-être qu'un -fvisibility=hidden -Wl,--gc-sections -Wl,--strip-all peut avoir des effets ? Il faut aussi bien séparer l'étape de compilation et de liaison pour savoir ce qui prend du temps.

          Mais à la fin il y a très peu de levier disponible. Même lorsque l'origine vient du code C++ (ce qui est souvent le cas), encore faut-il savoir dans quoi taper pour un résultat très aléatoire.

          • Partager sur Facebook
          • Partager sur Twitter

          Comment comprendre l'output de g++ -ftime-report ?

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown