Последнее изменение файла: 2011.06.09
Скопировано с www.bog.pp.ru: 2023.10.01
Bog BOS: Компилятор gcc: установка и использование
GCC (Gnu Compilers Collection) позволяет компилировать программы
на C (C89), C++ (G++), Objective-C, Ada (GNAT), Fortran, Java (gcj). Имеется не до конца
интегрированный препроцессор с Pascal.
Версии GCC
последняя стабильная версия - 4.5.0 (апрель 2010)
Fedora 10 - 4.3.2
Fedora 9 - 4.3.0
FC6 - 4.1.2
RHEL 5.4 - 4.1.2 и 4.4.0
RHEL 4 - 3.4.6
Red Hat Linux 8.0 - 3.2 (сменил на 3.2.2 т.к. обнаружил ошибки)
RH 7.3 - 2.96-112 (вернулись обратно)
RH 7.2 - 3.0.2, upgrade - 3.0.4
egcs - слит с gcc 2.95
pgcc - последняя версия 2.95.2, разработка остановлена
CC=gcc44 CXXFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ~/worktable/gcc-4.5.0/configure
--program-suffix=-4.5.0 --enable-version-specific-runtime-libs
--enable-languages=c,c++ --disable-nls
--with-cloog --with-ppl [--enable-lto при наличии libelf v0.8.12]
--enable-threads=posix -enable-__cxa_atexit --disable-libunwind-exceptions
--with-arch_32=i686 --with-tune=generic
make [-j 20] bootstrap (1900 MB)
make install
/usr/local/bin (множество программ с суффиксом "-4.5.0", в частности c++-4.5.0, cpp-4.5.0, gcc-4.5.0,
g++-4.5.0, c++-4.5.0, gccbug-4.5.0, gcov-4.5.0, x86_64-unknown-linux-gnu-gcc-4.5.0 )
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/include-fixed/ (обнаруженные в системе заголовки,
преобразуются к ANSI стандарту и складываются сюда; используются? кто отслеживает изменение оригинала?)
/usr/local/bin (множество программ с суффиксом "-4.4.1", в частности c++-4.4.1, cpp-4.4.1, gcc-4.4.1,
g++-4.4.1/c++-4.4.1, gccbug-4.4.1, gcov-4.4.1, x86_64-unknown-linux-gnu-gcc-4.4.1 )
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.4.1/include-fixed/ (обнаруженные в системе заголовки,
преобразуются к ANSI стандарту и складываются сюда; используются? кто отслеживает изменение оригинала?)
/usr/local/bin (множество программ с суффиксом "-4.3.3", в частности c++-4.3.3, cpp-4.3.3, gcc-4.3.3,
g++-4.3.3/c++-4.3.3, gccbug-4.3.3, gcov-4.3.3, x86_64-unknown-linux-gnu-gcc-4.3.3 )
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.3.3/include-fixed/ (обнаруженные в системе заголовки,
преобразуются к ANSI стандарту и складываются сюда; используются? кто отслеживает изменение оригинала?)
/usr/local/lib/gcc/i686-pc-linux-gnu/4.3.1/include-fixed/ (обнаруженные в системе заголовки,
преобразуются к ANSI стандарту и складываются сюда; используются? кто отслеживает изменение оригинала?)
Сборка gcc 3.2.2 (только C) из gcc-core-3.2.2.tar.bz2 и binutils-2.13.2.tar.bz2:
распаковать gcc-3.2.2 (gcc-core-3.2.2) в /worktable
распаковать binutils-2.13.2; поддиректории bfd, binutils, etc, gas, gprof,
intl, ld, opcodes, texinfo перенести в gcc-3.2.2;
поддиректории include и libiberty в binutils новее, чем в gcc,
так что надо добавить или заменить их, но аккуратно
-v --help (ключи всех фаз компиляции: препроцессор, компилятор, ассемблер, сборщик)
--target-help (выдать список ключей, управляющих генерацией кода: )
-pipe (использовать канал вместо временных файлов для обмена информацией между фазами)
-std=стандарт (список см. выше)
-g (включать отладочную информацию, ключ -g не мешает оптимизации,
но порядок команд может удивить)
-fbounds-check
-fbounded-pointers
-fstack-check
-p (генерировать код для профилирования программой prof)
-pg (генерировать код для профилирования программой gprof)
-fprofile-arcs (генерировать код для сбора статистики обхода ветвей - в файлы *.da)
-E (выполнять только фазу препроцессора)
-S (выполнять фазы препроцессора и компиляции)
-S -g (для получения осмысленного ассемблерного текста с номерами строк)
-c (выполнять фазы препроцессора, компиляции и ассемблера)
-o имя-выходного-файла
-save-temps (не удалять временные файлы по завершению компляции)
-Dмакро=значение
Для компиляции под Intel x86_64 необходимо указывать ключи:
-m64 -march=nocona.
Для компиляции под Intel 386 на машине с архитектурой x86_64
требуется установить пакет glibc-devel.i386 и указать ключ -m32.
Сборку также производить с помощью "cc -m32".
Условия измерения: процессор - P4 24x100 MHz; память разогнана;
алгоритм - сжимается без потерь 40000 кадров видео (jpeg-ls, T1=3, T2=7, T3=21, RESET=40,
Total bytes out: 5002245509 Symbols in: 21903907584 1.827 bps, 4.379 : 1);
алгоритм оптимизировался вручную несколькими поколениями разработчиков;
размер обрабатываемого файла - ~10 ГБ, так что кеширование файлов невозможно;
ввод с диска не является "узким местом", т.к. исходный материал также сжат.
Программа не использует плавающую точку, поэтому соответствующие ключи
оптимизации не расматривались.
Первым шагом в оптимизации (после того как руками было
сделано максимум возможного) является переход на новую версию компилятора
(или другой компилятор ;). Например,
переход с gcc 3.0 на 3.2 ускорил работу на 5%.
По умолчанию gcc 3.2.2 компилирует со следующими ключами,
имеющими отношение к оптимизации (их список можно получить
при компиляции с ключами: -S -fverbose-asm), что дает 13007 KSymbols/sec:
-fargument-alias (аргументы могут ссылаться на одно и то же место или на глобальные переменные)
-fbranch-count-reg
-ffunction-cse
-fgcse
-fgcse-sm
-fpcc-struct-return (обеспечивается совместимость с другими компиляторами за счет небольшого
уменьшения скорости)
-fpeephole
-fsched-interblock
-fsched-spec
-mcpu=pentiumpro
-march=i386
Ключ -march=pentium4 уменьшил скорость.
Ключ -O добавляет оптимизацию
(с ключом -fno-guess-branch-probability, 18576 KSymbols/sec):
-DG_DISABLE_ASSERT (отключает компиляцию assert для gnome и gtk)
-momit-leaf-frame-pointer (более мягкий метод, чем -fomit-frame-pointer)
-finline-limit=
Уменьшение размера рабочего массива на 100 КБ, чтобы освободить место в кеше
(специально зарезервировал поначалу с избытком, чтобы было что уменьшать ;)
не дало результата в отличие от Pentium III с его маленьким кешем.
Для использования статистики предсказания переходов
необходимо предварительно скомпилировать программу с ключом -fprofile-arcs,
затем выполнить программу для сбора статистики вероятностей переходов
(результаты помещаются в файлы с суффиксами .da в исходной директории, бинарный формат).
Затем надо заново скомпилировать с программу с теми же самыми ключами
компиляции, только заменив ключ -fprofile-arcs на -fbranch-probabilities.
Следует заметить, что оптимальный результат (22937 KSymbols/sec)
будет достигаться только при выполнении
программы с теми же самыми ключами и с теми же исходными данными.
На Pentium III выигрыш был больше.
Попытка воспользоваться векторными расширениями gcc привела меня к мысли,
что чтение документации Intel по архитектуре IA-32 неизбежно, а программирование на ассемблере проще
и эффективнее. Пример использования.