Существует ли метод для автоматического нахождения лучших параметров компилятора (на данной машине), которые приводят к самому быстрому исполняемому файлу?
Естественно, я использую g++ -O3
, но существуют дополнительные флаги, которые могут сделать код выполненным быстрее, например. -ffast-math
и другие, некоторые из которых аппаратно-зависимы.
Делает любой знает некоторый код, я могу вставить мой configure.ac
файл (автоинструменты GNU), так, чтобы флаги были добавлены к Make-файлу автоматически ./configure
команда?
В дополнение к автоматическому определению лучших флагов я интересовался бы некоторыми полезными флагами компилятора, которые хороши для использования в качестве значения по умолчанию для наиболее оптимизированных исполняемых файлов.
Обновление: Большинство людей предлагает просто попробовать различные флаги и выбрать лучшие опытным путем. Для того метода у меня был бы последующий вопрос: существует ли утилита, которая перечисляет все флаги компилятора, которые возможны для машины, на которой я работаю (например, тестирует, если инструкции SSE доступны и т.д.)?
Гм - да. Это возможно. Изучите оптимизацию на основе профиля .
См. Также параметры -mcpu = native
/ -mtune = native
gcc.
Погуглив, я нашел этот сценарий: gcccpuopt .
На одной из моих машин (32 бит) он выводит:
-march=pentium4 -mfpmath=sse
На другой машине (64 бит) он выводит:
$ ./gcccpuopt
Warning: The optimum *32 bit* architecture is reported
-m32 -march=core2 -mfpmath=sse
Итак, это не идеально, но может быть полезно.
Существует ли метод автоматического поиска лучших параметров компилятора (на данной машине), которые приводят к максимально быстрому выполнению исполняемого файла?
Нет.
Вы можете скомпилировать свою программу с большим набором опций компилятора, затем протестировать каждую версию, а затем выбрать ту, которая является «самой быстрой», но она вряд ли надежна и, вероятно, бесполезна для вашей программы.
Это решение, которое мне подходит, но его настройка занимает некоторое время. В "Python Scripting for Computational Science" Ханса Петтера Лангтангена (отличная книга, на мой взгляд) приведен пример использования короткого скрипта Python для проведения численных экспериментов с целью определения наилучших вариантов компилятора для вашего C / Fortran / ... программа. Это описано в главе 1.1.11 «Вложенные гетерогенные структуры данных».
Исходный код примеров из книги находится в свободном доступе по адресу http://folk.uio.no/hpl/scripting/index.html (я не уверен в лицензии, поэтому не буду воспроизведите здесь любой код), и, в частности, вы можете найти код для аналогичного числового теста в коде в TCSE3-3rd-examples.tar.gz в файле src / app / wavesim2D / F77 / compile.py, который вы могли бы использовать в качестве основы для написания сценария, подходящего для конкретной системы / языка (C ++ в вашем случае).
I не думаю, что вы можете сделать это во время настройки, но есть по крайней мере одна программа, которая пытается оптимизировать флаги опций gcc для конкретного исполняемого файла и машины. См., Например, http://www.coyotegulch.com/products/acovea/ .
Возможно, вы сможете использовать это, зная свои целевые машины, чтобы найти хороший набор опций для вашего кода.
Оптимизация приложения - это в основном ваша работа, а не компилятор.
Вот пример того, о чем я говорю.
Как только вы это сделаете, ЕСЛИ ваше приложение привязано к вычислениям, с горячими точками в вашем коде (не в коде библиотеки), ТО оптимизация компилятора для скорости будет иметь некоторое значение, поэтому вы можете попробовать различные комбинации флагов.
некоторые компиляторы предоставляют опцию "-fast" для автоматического выбора наиболее агрессивной оптимизации для данного хоста компиляции. http://en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler
К сожалению, g++ не предоставляет подобных флагов.
как продолжение вашего следующего вопроса, для g++ вы можете использовать опцию -mtune
вместе с -O3
, что даст вам достаточно быстрые настройки по умолчанию. Затем необходимо определить тип процессора вашего компилирующего узла. Возможно, вы захотите посмотреть в архиве макросов autoconf, чтобы увидеть, что кто-то написал необходимые тесты. В противном случае, если вы используете linux, вы должны разобрать /proc/cpuinfo
, чтобы получить тип процессора