Подтвердить что ты не робот

Параметры gcc для быстрого кода

Я распространяю программу на С++ с make файлом для версии Unix, и мне интересно, какие параметры компилятора я должен использовать для получения самого быстрого кода (он относится к категории программ, которые могут использовать всю вычислительную мощность они могут получить и по-прежнему возвращаться для большего), учитывая, что я заранее не знаю, какое оборудование, операционная система или версия gcc у пользователя будет иметь, и я хочу прежде всего, чтобы убедиться, что она, по крайней мере, работает правильно на всех основных Unix-подобная операционная система.

До сих пор у меня есть g++ -O3 -Wno-write-strings, есть ли другие варианты, которые я должен добавить? В Windows компилятор Microsoft имеет опции для таких вещей, как быстрое выключение вызова и генерация кода времени ссылки, которые стоит использовать, есть ли какие-либо эквиваленты в gcc?

(Я предполагаю, что он по умолчанию будет 64-битным на 64-битной платформе, пожалуйста, исправьте меня, если это не так.)

4b9b3361

Ответ 1

Не зная каких-либо особенностей вашей программы, трудно сказать. O3 охватывает большую часть оптимизаций. Остальные варианты идут "по цене". Если вы можете терпеть случайное округление, и ваш код не зависит от стандартов с плавающей точкой IEEE, вы можете попробовать -Ofast. Это игнорирует соответствие стандартам и может дать вам более быстрый код.

Остальные флаги оптимизации могут только повысить производительность определенных программ, но могут даже нанести ущерб другим. Посмотрите доступные флажки в документации gcc на флажках оптимизации и сравните их.

Другой вариант - включить C99 (-std = c99) и встроенные соответствующие функции. Это немного искусства, вы не должны встраивать все, но с небольшой работой вы можете заставить свой код работать быстрее (хотя и за счет большего исполняемого файла).

Если скорость действительно проблема, я бы предложил либо вернуться к компилятору Microsoft, либо попробовать Intel. Я пришел к пониманию того, насколько медленным может быть скомпилированный код gcc, особенно когда он включает math.h.

EDIT: О, подождите, вы сказали С++? Затем проигнорируйте мой абзац C99, вы можете вставить уже:)

Ответ 2

Я бы попробовал оптимизацию с помощью профиля:

-fprofile-generate Включить параметры обычно используется для инструментов приложение для создания профиля полезно для последующей перекомпиляции с профилем оптимизация на основе обратной связи. Вы должны используйте -fprofile-generate как при компиляции и при связывании программа. Следующие параметры: включено: -fprofile-arcs, -fprofile-values, -fvpt.

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

(По-видимому, вы нацеливаетесь на 64-разрядные, поэтому GCC, вероятно, уже включит больше оптимизаций, чем для общего x86.)

Ответ 3

-oFast


Попробуйте -oFast вместо -o3

Также приведен список флагов, которые вы можете захотеть выборочно включить.

-ffloat-store

-fexcess точность = стиль

-ffast-математик

-fno-загон математики

-fno-сигнализации-Nans

-fcx ограниченного диапазона

-fno-математика-ERRNO

-funsafe-математическая-Оптимизация

-fassociative-математик

-freciprocal-math

-ffinite-математические только

-fno-подписанными-нули

-fno-улавливать-математике

-frounding-математик

-fsingle точность постоянной

-fcx-Fortran-правила с

Полный список флагов и их подробное описание доступны здесь

Ответ 4

Рассмотрите возможность использования -fomit-frame-pointer, если вам не требуется отладка с помощью gdb (yuck). Это даст компилятору еще один регистр для использования для переменных (иначе этот регистр будет потрачен впустую на бесполезные указатели на кадры).

Также вы можете использовать что-то вроде -march=core2 или в целом -march=native, чтобы позволить компилятору использовать более новые инструкции и далее настраивать код для указанной архитектуры, но для этого вы должны быть уверены, что ваш код не ожидается работать на более старых процессорах.

Ответ 5

gcc -O3 не гарантированно будет самым быстрым. -O2 часто является лучшей отправной точкой. После этого оптимизируйте профилирование и попробуйте определенные опции: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Это долго читается, но, вероятно, стоит того.

Обратите внимание, что в Gcc 4.5 +

доступно "Генерация временного кода канала" (MSVC), ака "Оптимизация времени связи",

Кстати, нет специального соглашения о вызове fastcall для Win64. Существует только "конвенция о вызове": http://msdn.microsoft.com/en-us/magazine/cc300794.aspx

Ответ 6

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

Для получения дополнительной информации см. https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Ответ 7

На x86-64 нет "fastcall" - оба Win64 и Linux ABI определяют вызов на основе регистров ( "fastcall" ) как единственное соглашение о вызове (хотя Linux использует больше регистров).