Рекомендации GCC и опции для самого быстрого кода

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

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

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

24
задан jww 23 September 2018 в 21:34
поделиться

4 ответа

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

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

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

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

РЕДАКТИРОВАТЬ: Ой, подождите, вы сказали C ++? Тогда не обращайте внимания на мой абзац C99, вы уже можете встроить :)

16
ответ дан 28 November 2019 в 23:10
поделиться

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

3
ответ дан 28 November 2019 в 23:10
поделиться

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

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

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

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

.
13
ответ дан 28 November 2019 в 23:10
поделиться

-oFast


Попробуйте -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

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

7
ответ дан 28 November 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: