web-dev-qa-db-fra.com

Comment activer l'optimisation du temps de liaison (LTO) avec CMake?

J'ai la construction cmake la plus récente et j'essaie toutes les configurations de construction (Debug, MinSizeRel, RelWithDebugInfo, Release, General) Je ne vois nulle part (recherche de texte) dans les makefiles générés la chaîne -lto, donc ou la fonctionnalité n'est toujours pas présente, ou elle nécessite une inversion manuelle (dans ce cas, une recherche de texte pour LTO ou l'optimisation du temps de liaison) sur la documentation ne donne aucun résultat, donc je ne vois nulle part dans la documentation officielle un moyen d'activer LTO .

Existe-t-il un moyen d'activer LTO "globalement" (pour tous les compilateurs) sans spécifier manuellement des indicateurs qui ne pourraient au pire être pris en charge que par GCC?

26
CoffeDeveloper

Edit: au 28 octobre 2015 sur CMake IRC

jcelerier | I have a question about INTERPROCEDURAL_OPTIMIZATION
jcelerier | it sounds like it should enable -flto on gcc
+ngladitz | jcelerier: its only implemented for the intel compiler
jcelerier | ngladitz: ah, okay
jcelerier | are there other switches for pgo / lto ?
jcelerier | or must it be done by hand ?
+ngladitz | there currently is no first class support otherwise     

Problème lié à CMake: https://gitlab.kitware.com/cmake/cmake/issues/15245


CMake a le INTERPROCEDURAL_OPTIMIZATION propriété sur les cibles, ce qui semble pouvoir activer le LTO sur certaines plates-formes.

Lien: http://www.cmake.org/cmake/help/v3.0/prop_tgt/INTERPROCEDURAL_OPTIMIZATION.html

Pour l'activer sur une cible MyLib:

add_library(MyLib ...)
...
set_property(TARGET MyLib PROPERTY INTERPROCEDURAL_OPTIMIZATION True)
11

Bonnes nouvelles! CMake v3.9 enfin supporte LTO.


Exemple

Voici un exemple de code pour montrer comment cela fonctionne:

cmake_minimum_required(VERSION 3.9.4)

include(CheckIPOSupported)
check_ipo_supported(RESULT supported OUTPUT error)

add_executable(example Example.cpp)

if( supported )
    message(STATUS "IPO / LTO enabled")
    set_property(TARGET example PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
else()
    message(STATUS "IPO / LTO not supported: <${error}>")
endif()

Pour GCC, cela ajoute -flto -fno-fat-lto-objects Aux commandes de compilation des cibles.


Vérification de la prise en charge du compilateur

Le module ( CheckIPOSupported permet de vérifier si optimisation interprocédurale (IPO/LTO) est pris en charge par le compilateur ou non:

check_ipo_supported([RESULT <result>] [OUTPUT <output>]
                    [LANGUAGES <lang>...])

Si aucun argument n'est passé (= check_ipo_supported()) une erreur est déclenchée pour indiquer qu'elle n'est pas prise en charge, sinon la variable result est définie sur YES ou NO. Plus de détails sont décrits dans la documentation du module.


Activation de LTO

Le LTO est activé soit pour cible unique ou comme par défaut pour toutes les cibles.

LTO pour une cible unique

Pour activer le LTO pour un ensemble cible INTERPROCEDURAL_OPTIMIZATION à TRUE. Cela se fait par la commande set_property() :

set_property(TARGET name-target-here
             PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)

LTO par défaut

Il est possible d'activer LTO par défaut en définissant CMAKE_INTERPROCEDURAL_OPTIMIZATION à TRUE:

set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)

Cela activera INTERPROCEDURAL_OPTIMIZATION Pour toutes les cibles créées après cette ligne. Ceux créés auparavant ne sont pas affectés.


Voir également

51
ollo

Oui, selon le code source, il n'y a pas de support pour LTO pour les compilateurs gcc/clang. Ils prennent en charge uniquement le compilateur Intel.

J'ai une sortie grep pour cmake 3.4.3:

grep -HiR 'INTERPROCEDURAL_OPTIMIZATION' *
Help/manual/cmake-properties.7.rst:  
/prop_dir/INTERPROCEDURAL_OPTIMIZATION_CONFIG
Help/manual/cmake-properties.7.rst:  
/prop_dir/INTERPROCEDURAL_OPTIMIZATION
Help/manual/cmake-properties.7.rst:  
/prop_tgt/INTERPROCEDURAL_OPTIMIZATION_CONFIG
Help/manual/cmake-properties.7.rst:  
/prop_tgt/INTERPROCEDURAL_OPTIMIZATION
Help/prop_dir/INTERPROCEDURAL_OPTIMIZATION.rst:INTERPROCEDURAL_OPTIMIZATION
Help/prop_dir/INTERPROCEDURAL_OPTIMIZATION_CONFIG.rst:INTERPROCEDURAL_OPTIMIZATION_<CONFIG    
Help/prop_dir/INTERPROCEDURAL_OPTIMIZATION_CONFIG.rst:This is a
per-configuration version of INTERPROCEDURAL_OPTIMIZATION.
Help/prop_tgt/INTERPROCEDURAL_OPTIMIZATION.rst:INTERPROCEDURAL_OPTIMIZATION
Help/prop_tgt/INTERPROCEDURAL_OPTIMIZATION_CONFIG.rst:INTERPROCEDURAL_OPTIMIZATION_<CONFIG    
Help/prop_tgt/INTERPROCEDURAL_OPTIMIZATION_CONFIG.rst:This is a
per-configuration version of INTERPROCEDURAL_OPTIMIZATION.
Modules/Platform/Linux-Intel.cmake:    # INTERPROCEDURAL_OPTIMIZATION
Source/cmCommonTargetGenerator.cxx: 
if(this->GetFeatureAsBool("INTERPROCEDURAL_OPTIMIZATION"))
Source/cmGeneratorTarget.cxx:          
"INTERPROCEDURAL_OPTIMIZATION", config))
Source/cmMakefileLibraryTargetGenerator.cxx: 
if(this->GetFeatureAsBool("INTERPROCEDURAL_OPTIMIZATION") &&
Tests/IPO/CMakeLists.txt:set_property(DIRECTORY PROPERTY
INTERPROCEDURAL_OPTIMIZATION 1)

Comme vous pouvez le voir, nous n'avons que le module de plate-forme Intel.

J'ai donc créé une demande de fonctionnalité pour cette fonctionnalité extrêmement utile: https://cmake.org/Bug/view.php?id=15939

2
Pavel Odintsov

Pour le moment, gcc et clang supportent lto. (Voir: https://clang.llvm.org/docs/CommandGuide/clang.htmlhttps://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html ) Vous pouvez l'activer via cmake: set (CMAKE_INTERPROCEDURAL_OPTIMIZATION True) Cependant, vous devez avoir la version cmake> = 3.9, et je pense que vous pouvez définir une politique et vérifier si LTO est pris en charge par le compilateur/la chaîne d'outils (vérifiez CMAKE_IPO_AVAILABLE et jeter une erreur sinon)

Et définissez des indicateurs pour gcc/clang (-flto et -ffat-lto-files pour fcc> 4.7 ou -flto = full/thin pour clang)

0
Olga Krishtal