Есть ли какая-то польза от одновременной передачи всех исходных файлов компилятору?

Я читал об "оптимизации всей программы" (wpo) и "генерации кода времени связи" (ltcg).

Интересно, будет ли выполняться дополнительный межмодульный анализ, если я сразу передам компилятору все исходники из cli (например, "g++ a.cpp b.cpp")? Или это просто активирует один из этих флагов?

Есть ли разница между компиляторами для этого? Например, может ли компилятор Intel извлечь выгоду из такой практики, а другие компиляторы — нет?


person onqtam    schedule 06.03.2014    source источник
comment
Как и любая оптимизация, это сильно зависит от компилятора (версии).   -  person Benjamin Bannier    schedule 06.03.2014


Ответы (3)


Интересно, будет ли выполняться дополнительный межмодульный анализ, если я сразу передам компилятору все исходники из cli (например, "g++ a.cpp b.cpp")?

Для GCC нет, это не включает WPO, каждая единица перевода обрабатывается отдельно, изолированно. Я на 99% уверен, что то же самое верно для Clang, и на 90% уверен, что это верно для большинства других компиляторов.

В GCC, чтобы включить межмодульную оптимизацию, вам нужно явно запросить ее через переключатель -flto, который по-прежнему обрабатывает каждую единицу перевода изолированно, но дополнительная информация записывается в объектный файл, а затем, когда они связаны вместе, выполняются дальнейшие проходы оптимизации. для получения конечного результата.

person Jonathan Wakely    schedule 06.03.2014
comment
Конечно. +1 и удаление комментариев сейчас. - person Ali; 07.03.2014

По крайней мере, для GCC, да (если вы укажете правильные флаги компилятора).

Компилятор выполняет оптимизацию на основе имеющихся у него знаний о программе. Использование флага -funit-at-a-time позволит компилятору учитывать информацию, полученную от более поздних функций в файле, при компиляции функции. Компиляция нескольких файлов одновременно в один выходной файл (и использование -funit-at-a-time) позволит компилятору использовать информацию, полученную из всех файлов, при компиляции каждого из них.

Источник: параметры оптимизации GCC

Хотя компиляция всех файлов по отдельности и включение LTO концептуально должны дать очень похожие (или идентичные) результаты.

person Damon    schedule 07.03.2014
comment
эта опция сейчас устарела - ссылка на документацию, которую вы дали, предназначена для gcc 3.4, а текущий gcc - 4.8 или даже 4.9 - несколько на 10 лет новее :) - person onqtam; 07.03.2014
comment
Хм, это все еще существует в gcc-6.1.0 документации... Мы уверены, что эта информация устарела? - person NHDaly; 30.04.2016

Компилятор Intel C++ (ICC) поддерживает это как часть межпроцедурной оптимизации. Как упомянул Джонатан, каждый исходный файл компилируется с помощью IPO и сохраняется в фиктивном объектном файле. Для связывания фиктивных объектных файлов необходимо использовать инструмент связывания Intel. На этапе компоновки компилятор вызывается в последний раз (при сборке с IPO) для выполнения межпроцедурной оптимизации всех фиктивных объектных файлов. Более подробная информация доступна по адресу https://software.intel.com/en-us/node/459446.

person Anoop - Intel    schedule 21.04.2014
comment
Ссылка устарела, вот новая: ссылка - person andreee; 08.12.2015