Май 24 2010

GCC

Published by

в gentoo-linux настройки для всех собираемых программ указаны в /etc/make.conf
он имеет примерно следующий вид:

CFLAGS="-O2 -march=core2 -fno-align-functions -fno-align-labels -mfpmath=sse -msse4.1 -finline-functions --param l2-cache-size=512 -fomit-frame-pointer -pipe -Wno-all"
CXXFLAGS="${CFLAGS}"
ICCCFLAGS="-O3 -fomit-frame-pointer -xSSE4.1 -g0 -w -gcc"
ICCCXXFLAGS="${ICCCFLAGS}"
CHOST="i686-pc-linux-gnu"
EMERGE_DEFAULT_OPTS="-j3"
GENTOO_MIRRORS="http://mirror.yandex.ru/gentoo-distfiles/ ftp://ftp-stud.hs-esslingen.de/pub/Mirrors/gentoo/ ftp://sunsite.informatik.rwth-aachen.de/pub/Linux/gentoo/ http://mirror.yandex.ru/gentoo-distfiles/"
USE=" glibc-omitfp a52 aac -wifi win32codecs vdpau accessibility acpi alsa bluetooth cdio cdr cleartype \
consolekit ctype cue dbus disk-partition djvu \
dvd ebook embedded emerald encode gst-ffmpeg gst-flac mp3enc gst-bad gst-ugly faac fat ffmpeg filter \
flac flash flv fuse gif gmplayer gnutls policykit gstreamer \
gtk gui -hal hddtemp icq secure-delete id3tag jack jabber -cups jpeg kde lame \
lm_sensors lzma mad mmap mng mp3 mpeg chm mplayer nas musepack shine skins stream twolame udev upnp vcdinfo wma-fixed \
mysql ntfs objc objc++ objc-gc unicode -firefox3 ogg enca wav emovix libsamplerate openal cuda profiler opengl phonon \
plugins png qt3support qt4 quicktime smp -ipv6 -multilib -hardened rar sdl semantic-desktop \
sql mmx sse sse2 sse3 ssse3 webkit wmf lcms pdf vcd exif -handbook -debug threads nsplugin extras sse4.1 cairo glib svg taglib theora tiff truetype unsupported vorbis \
wavpack webkit X X509 xcomposite xinerama cdda cddax faad dirac ggi reiserfs windeco matroska -xinerama optimisememory schroedinger sdl-image cmipci usb -kdeprefix xv xvid zip -3dnow -3dnowext -mmxext x264"

VIDEO_CARDS="nvidia"
LINGUAS="ru en"
source /usr/local/portage/layman/make.conf
ACCEPT_KEYWORDS="~x86 "
ACCEPT_LICENSE="*"
FEATURES="parallel-fetch metadata-transfer candy"
PORTAGE_NICENESS="20"

CFLAGS= указаны опции компилятора GCC, используемые для сборки всего софта
CFLAGS для отдельного ebuild Пересборка части мира

Для gcc версий 3.x и выше существует только 5 уровней оптимизации: -O0 (без оптимизации), -O1, -O2 и -O3 (O3 — самый высокий уровень), а так же -Os.
Примечание: Если вы используете несколько -O опций, то только последняя объявленная будет оказывать влияние на процесс компиляции.

-O0
Отключает оптимизацию. Только переменные, обьявленные register, сохраняются в регистрах.

-O(-O1)
Включает оптимизацию. Пытается уменьшить размер кода и ускорить работу программы. Соответственно увеличивается время компиляции. При указании -O активируются следующие флаги:

-fauto-inc-dec -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse -fguess-branch-probability -fif-conversion2 -fif-conversion -finline-small-functions
-fipa-pure-const -fipa-reference -fmerge-constants -fsplit-wide-types -ftree-builtin-call-dce
-ftree-ccp -ftree-ch -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-fre -ftree-sra -ftree-ter
-funit-at-a-time

На тех машинах, которые способны поддерживать отладку даже без указателя на стек функции, также включается опция -fomit-frame-pointer.
На других машинах могут быть включены и другие флаги.

-O2
Оптимизирует еще больше. GCC выполняет почти все поддерживаемые оптимизации, которые не включают уменьшение времени исполнения за счет увеличения длины кода. Компилятор не выполняет раскрутку циклов или подстановку функций, когда вы указываете -O2. По сравнению с -O, эта опция увеличивает как время компиляции, так и эффективность сгенерированного кода.
-O2 включает все флаги оптимизации наследованые от -O. Также включает следущие флаги оптимизации:

-fthread-jumps
-falign-functions -falign-jumps -falign-loops -falign-labels -fcaller-saves -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks
-fdelete-null-pointer-checks -fexpensive-optimizations -fgcse -fgcse-lm -findirect-inlining -foptimize-sibling-calls -fpeephole2
-fregmove -freorder-blocks -freorder-functions -frerun-cse-after-loop -fsched-interblock -fsched-spec -fschedule-insns -fschedule-insns2 -fstrict-aliasing
-fstrict-overflow -ftree-switch-conversion -ftree-pre -ftree-vrp

-O3
Оптимизирует еще немного. Включает все оптимизации -O2 и также включает флаги 

-finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload -ftree-vectorize

Примечание: Как правило, это отрицательно сказывается на времени компиляции, а иногда и на производительности программ.

-Os
Включает оптимизацию по размеру. -Os флаг активирует все флаги оптимизации из -O2, в основном те, которые не увеличивают размер выходного файла. В дальнейшем выполняются оптимизации по уменьшению размера кода.
-Os выключает следущие флаги оптимизации:

-falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks
-freorder-blocks-and-partition -fprefetch-loop-arrays -ftree-vect-loop-version

-Ofast
только в gcc >=4.6
включает все флаги -O3, а также -ffast-math


Примечание: Более полное описание флагов -Ox, -fflag смотрите в man gcc, так как они специфичны для каждой из версий


общие правила:

наибольший приоритет имеют опции объявленные последними — например:
в -O2 есть  -falign-labels, чтобы её отключить, надо указать -fno-align-labels ПОСЛЕ -O2

(это широко используется при написании ebuild-ов, в которых объявляются свои опции сборки не зависимо от таковых в системе)

опции начинающиеся с -f, -m, -W можно отключить, добавив префикс no-,например:

-fno-align-labels - отключает -falign-labels, -mno-3dnow отключает -m3dnow, -Wno-all отключает -Wall

(есть некоторые исключения, но они очень редки)


  • -pipe — передавать промежуточные данные по конвейеру (в оперативной памяти,а не через винт)
  • —param l2-cache-size=X (размер кэша 2-го уровня в килобайтах)
    можно посмотреть с помощью lscpu(но указывать лучше не реальный размер, а меньше.)
  • -fomit-frame-pointer — опция,которая говорит, что для доступа к переменным нужно использовать стек. С этой опцией практически невозможна отладка.
  • -funroll-loops — выполняется оптимизация развертыванием циклов. Осуществляется для циклов, число итераций которых может быть определено во время компиляции или во время выполнения.
  • -funroll-all-loops — выполняется оптимизация развертыванием циклов. Развертывает все циклы — обычно программы, скомпилированные с этой опцией, медленнее запускаются.
  • -ffast-math — эта опция разрешает GCC нарушать некоторые ANSI или IEEE правила и/или спецификации в интересах оптимизации кода по скорости выполнения. Например, это позволяет компилятору предполагать, что параметры к функции sqrt — неотрицательные числа.
    (с этой опцией не соберается dev-db/sqlite)
  • -malign-double — контролирует, выравнивает ли GCC double, long double и long long переменные на двусловной границе или однословной границе.
    Выравнивание double переменных на двусловной границе создает код, который выполняется на Pentium-процессорах несколько быстрее, расходуя больше памяти.
  • -march=X -mtune=X, при помощи этих опций создается код, оптимизированный под определенный CPU. Для Intel процессоров желательно задать -mtune=generic
  • -fno-align-labels — отключает -falign-labels, которая выравнивает каждый ярлык в коде (в основном начало каждого блока)(используется по умолчанию в -O2, -O3). Это всегда, кроме редких исключений, замедляет код и, следовательно, не должно использоваться. отсюда(давали профит на gcc-4.4.*, на 4.5 уже регресс)
  • -finline-functions — IPO

SIMD

-mmmx -msse -msse2 -msse3 -mssse3 -msse4.1 -m3dnow — наборы инструкций поддерживаемых процессором

посмотреть для своего процессора можно в выводе

cat /proc/cpuinfo | tr " " "\012" |grep -e sse -e mmx -e now -e pni | sort -u

или просто

cat /proc/cpuinfo

(pni == sse3)


только для 32-х бит:
Для реального генерирования этих инструкций в коде необходимо добавить ключи -ftree-vectorize и/или -mfpmath={387|sse|both}

если -mfpmath=sse, то после этого флага необходимо указать старшую из SIMD ( у меня это -msse4.1)

необходимо явно указать самую старшую из sse* для генерирования всех поддерживаемых процессором инструкций

обсуждение

так же для gcc <=4.4.x  для x86 стоит добавить -mstackrealign

в >=4.5 включено по умолчанию
в >=4.5 стоит добавить -fexcess-precision=fast

On x86 targets, code containing floating-point calculations may run significantly slower when compiled with GCC 4.5 in strict C99 conformance mode than they did with earlier GCC versions. This is due to stricter standard conformance of the compiler and can be avoided by using the option -fexcess-precision=fast; also see below.


в  gcc 4-ой ветке есть авто определение типа процессора  -march=native ,для Atom-ов  определение только в ветке >=4.5
проверить генерируемые инструкции можно с помощью вот этого скрипта

делаем исполняемым

запускаем как ./путь/до/скрипта /путь/до/проверяемого/бинарника

например

megabaks@localhost ~/perl $./analyze-x86 /usr/bin/mplayer

на выходе будет что-то типа

Checking vendor_id string... GenuineIntel
Disassembling /usr/bin/mplayer, please wait...
i486: 3684 i586:   16 ppro: 7047 mmx: 120560 sse: 5414 sse2: 4853 sse3:  755 sse4.1: 1003 sse4.2:    0

или с помощью приложенного файла распаковать и запустить

bash simd_count бинарник

быстрее скрипта выше в десятки раз

sh some_trash/simd_count /usr/bin/mplayer
cpuid: 8
nop: 6148
call: 21690
i486: 165
i586: 2
i686: 1490
mmx: 1626
sse: 6028
sse2: 7858
sse3: 317
ssse3: 2
3dnowext: 115

Graphite

  • -floop-interchange -floop-block -floop-strip-mine — оптимизация циклов — используются только в ветке GCC >=4.4.x собранного с graphite (новый оптимизатор циклов для gcc — для установки gcc с graphite в USE нужно добавить graphite, который потянет за собой ppl и cloog-ppl)
    подробнееhttp://gcc.gnu.org/gcc-4.4/changes.html
  • -floop-parallelize-all — ищет циклы, которые можно распараллелить и помечает их
    для распараллеливания отмеченных необходим ключ -ftree-parallelize-loops=n
  • -ftree-parallelize-loops=n — распараллеливание циклов в n потоков — имеет смысл только на многоядерных/многопроцессорных системах
    (с ними не собирается куча софта)
  • -fgraphite-identity — проверяет на сколько выгодны преобразования GIMPLE -> GRAPHITE -> GIMPLE, так же выкидывает лишний код из циклов.

графит может вызвать проблемы с некоторыми программами

но использование graphite даёт на некоторых приложения небольшой прирост производительности


CFLAGS для отдельного пакета
Пересборка части мира

MAKEOPTS= опции make

  • -j3

- количество запускаемых копий make ( в некоторых местах встречается как потоки ) — рекомендуется количество ядер +1 или 2*кол-во_ядер +1

  • -s — уменьшает количество выводимой make информации — немного ускоряет процесс сборки(если только терминал не скрыт)

но, т.к. есть ебилды с однопоточной сборкой, будет логично собирать не каждый пакет в несколько потоков, а несколько пакетов, каждый из которых в один поток — для этого в make.conf добавляем строку

EMERGE_DEFAULT_OPTS="-jX"

или дописываем через пробел -jX к уже существющим опциям


Стоит отметить, что не весь софт выигрывает при сборке под конкретный проц — например наиболее шустрым bzip2 и p7zip получаются при сборке под i686, даже если выполняются на core2
так же и с SIMD


P.S.
НЕ верьте выхлопу

gcc ... -Q ...--help=target,optimizers...

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

echo "int main() { return 0; }" |LANG=en gcc ваши_флаги -v -Q -x c - 2>&1 | tr "\n" " " | sed -e "s|.*options enabled:||" -e "s|Compiler.*||" -e 's| |\n|g' | sort -u

или просто

echo "int main() { return 0; }" |LANG=en gcc ваши_флаги -v -Q -x c - 2>&1

Посмотреть задаваемые -march и размеры кэшей(-march=native)

echo "int main() { return 0; }" |LANG=en gcc -march=native -v -E -x c - 2>&1

или

gcc -### -march=native -E /usr/include/stdlib.h 2>&1 | grep "/usr/libexec/gcc/.*cc1"

This page has the following sub pages.

One response so far

One Response to “GCC”

  1. asdon 04 Авг 2013 at 23:22

    я знаю можно использовать -mfpmath=sse+387 в 32битном режиме
    а вот можно ли использовать одновременно sse2 и 3dnow+ в 64битном режиме ?

Comments RSS

Leave a Reply


*

Powered by WordPress