web-dev-qa-db-ja.com

CMakeでリンク時最適化(LTO)を有効にするにはどうすればよいですか?

最新のcmakeビルドがあり、すべてのビルド構成(Debug、MinSizeRel、RelWithDebugInfo、Release、General)を試しています。生成されたmakefileに文字列-lto、または機能がまだ存在しないか、マニュアルを手動で変更する必要がある場合(その場合、LTOまたはリンク時の最適化のテキスト検索)で結果が得られないため、公式ドキュメントのどこにもLTOを有効にする方法がありません。 。

最悪の場合GCCのみでサポートされる可能性のあるフラグを手動で指定せずに、LTOを「すべて」(すべてのコンパイラーに対して)有効にする方法はありますか?

26
CoffeDeveloper

編集:2015年10月28日現在、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     

関連するCMakeの問題: https://gitlab.kitware.com/cmake/cmake/issues/15245


CMakeにはINTERPROCEDURAL_OPTIMIZATIONターゲットのプロパティ。一部のプラットフォームではLTOが有効になるようです。

リンク: http://www.cmake.org/cmake/help/v3.0/prop_tgt/INTERPROCEDURAL_OPTIMIZATION.html

ターゲットのMyLibで有効にするには:

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

朗報! CMake v3.9最後にLTOをサポート


これがどのように機能するかを示すコード例です:

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()

GCCの場合、これは-flto -fno-fat-lto-objectsをターゲットのコンパイルコマンドに追加します。


コンパイラサポートの確認

モジュール CheckIPOSupported は、かどうかのチェックを提供します手続き間最適化(IPO/LTO)は、コンパイラーでサポートされているかどうかにかかわらず、

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

引数が渡されない場合(= check_ipo_supported())、サポートされていないことを示すエラーが発生します。それ以外の場合、result変数はYESまたはNOに設定されます。詳細はモジュールのドキュメントで説明されています。


LTOの有効化

LTOは、単一ターゲットまたはすべてのターゲットのデフォルト

単一ターゲットのLTO

ターゲットのLTOを有効にするには INTERPROCEDURAL_OPTIMIZATIONTRUEに設定します。これは、 set_property() コマンドによって実行されます。

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

デフォルトとしてのLTO

CMAKE_INTERPROCEDURAL_OPTIMIZATIONTRUEに設定することで、デフォルトでLTOを有効にすることができます。

set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)

これにより、この行の後に作成されたすべてのターゲットに対してINTERPROCEDURAL_OPTIMIZATIONが有効になります。以前に作成されたものは影響を受けません。


こちらもご覧ください

51
ollo

はい、ソースコードによると、gcc/clangコンパイラのLTOはサポートされていません。インテル®コンパイラーのみをサポートしています。

Cmake 3.4.3のgrep出力がいくつかあります。

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)

ご覧のとおり、Intelプラットフォームモジュールしかありません。

そのため、この非常に便利な機能の機能リクエストを作成しました: https://cmake.org/Bug/view.php?id=15939

2
Pavel Odintsov

現時点では、gccとclangの両方がltoをサポートしています。 (参照: https://clang.llvm.org/docs/CommandGuide/clang.htmlhttps://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html )cmakeを使用して有効にできます:set(CMAKE_INTERPROCEDURAL_OPTIMIZATION True)ただし、バージョンcmake> = 3.9が必要です。ポリシーが設定されている可能性があり、LTOがコンパイラ/ツールチェーンでサポートされているかどうかを確認します(CMAKE_IPO_AVAILABLEを確認してください)そうでなければエラーをスローします)

そして、gcc/clangのフラグを設定します(fccの-fltoおよび-ffat-lto-files> 4.7またはclangの-flto = full/thin)

0
Olga Krishtal