Я распределяю программу C++ с make-файлом для версии Unix, и я задаюсь вопросом, какие параметры компилятора я должен использовать для получения самого быстрого кода (это попадает в категорию программ, которые могут использовать всю вычислительную мощность, которую они могут получить и все еще возвратиться для больше), учитывая, что я не знаю заранее, какие аппаратные средства, операционную систему или gcc версию пользователь будет иметь, и я хочу прежде всего остального удостовериться, что это, по крайней мере, работает правильно над каждой главной подобной Unix операционной системой.
К настоящему времени я имею g++ -O3 -Wno-write-strings
, есть ли какие-либо другие опции, которые я должен добавить? В Windows компилятор Microsoft имеет опции для вещей как быстрое поколение временного кода соглашения о вызовах и ссылки, которые стоит использовать, там какие-либо эквиваленты на gcc?
(Я предполагаю, что это примет значение по умолчанию к 64-разрядному на 64-разрядной платформе, исправьте меня если это не так.)
Трудно сказать, не зная особенностей вашей программы. O3 покрывает большинство оптимизаций. Остальные варианты доступны «по цене». Если вы можете терпеть некоторое случайное округление и ваш код не зависит от стандартов с плавающей запятой IEEE, вы можете попробовать -Ofast. Это игнорирует соответствие стандартам и может дать вам более быстрый код.
Остальные флаги оптимизации могут только улучшить производительность одних программ, но могут даже нанести ущерб другим. Посмотрите на доступные флаги в документации gcc по флагам оптимизации и сравните их.
Другой вариант - включить C99 (-std = c99) и встроить соответствующие функции. Это своего рода искусство, вы не должны встраивать все, но немного поработав, вы можете заставить свой код работать быстрее (хотя и за счет более крупного исполняемого файла).
Если скорость действительно важна, я бы посоветовал либо вернуться к компилятору Microsoft, либо попробовать компилятор Intel. Я осознал, насколько медленным может быть некоторый скомпилированный код gcc, особенно когда он включает math.h.
РЕДАКТИРОВАТЬ: Ой, подождите, вы сказали C ++? Тогда не обращайте внимания на мой абзац C99, вы уже можете встроить :)
gcc -O3 не гарантируется самым быстрым. -O2 часто является лучшей отправной точкой. После этого профильная оптимизация и опробование конкретных опций: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
Это долгое чтение, но, вероятно, оно того стоит.
Обратите внимание, что «Генерация кода времени связи» (MSVC), также известная как «Оптимизация времени связи», доступна в gcc 4.5+
Кстати, для Win64 нет специального соглашения о вызове «fastcall». Существует только "the" соглашение о вызове: http://msdn.microsoft.com/en-us/magazine/cc300794.aspx
Я бы попробовал оптимизацию с помощью профиля:
-fprofile-generate
Включите опции обычно используется для инструментирования приложения для создания профиля, полезного для последующей перекомпиляции с профилем оптимизация на основе обратной связи. Вы должны использовать-fprofile-generate
как при компиляции и при компоновке вашей программы. Следующие опции включены:-fprofile-arcs
,-fprofile-values
,-fvpt
.
Вы также должны дать компилятору подсказки об архитектуре, на которой будет работать программа.
Например, если программа будет работать только на сервере, и вы можете скомпилировать ее на той же машине, что и сервер, вы можете просто использовать -march=native
.
В противном случае вам нужно определить, какие функции будут у всех ваших пользователей, и передать соответствующий параметр в GCC.
(Очевидно, вы ориентируетесь на 64-битные системы, поэтому GCC, вероятно, уже будет включать больше оптимизаций, чем для обычных x86.)
.Попробуйте -oFast вместо -o3
Также вот список флагов, которые вы, возможно, захотите включить выборочно.
-ffloat-store
-fexcess-precision = style
-ffast-math
-fno-rounding-math
-fno-signaling-nans
-fcx-limited-range
-fno-math-errno
-funsafe-math-optimizations
-fassociative-math
-freciprocal-math
-ffinite-math-only
-fno-signed-zeros
-fno-trapping-math
-frounding-math
-fsingle-precision-constant
-fcx-fortran-rules
Доступен полный список флагов и их подробное описание здесь