|
Bog BOS: Компилятор gcc: установка и использование
|
Последнее изменение файла: 2007.02.08
Скопировано с www.bog.pp.ru: 2008.04.21
Bog BOS: Компилятор gcc: установка и использование
GCC (Gnu Compilers Collection) позволяет компилировать программы
на C (C89), C++ (G++), Objective-C, Ada (GNAT), Fortran, Java (gcj). Имеется не до конца
интегрированный препроцессор с Pascal.
Версии GCC
- последняя стабильная версия - 3.2.2 (январь 2003)
- 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, разработка остановлена
GCC поддерживает следующие версии C (по умолчанию C89 с расширениями: -std=gnu89):
- "традиционный" (-traditional, K & R)
- ANSI X3.159-1989 (-ansi, -std=c89)
- ISO/IEC 9899:1990 (-std=iso9899:1990), с исправлениями 1994 и 1996 годов
- дополнения 1995 года (-std=iso9899:199409, AMD1, C94, C95, __STDC_VERSION__)
- ISO/IEC 9899:1999 (-std=c99, C99, поддерживается не полностью)
- расширения GNU (-std=gnu89, -std=gnu99 и т.д.)
Сборка 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,
так что надо добавить или заменить их, но аккуратно
- создать /worktable/gcc-3.2.2-objdir
- cd /worktable/gcc-3.2.2-objdir
- /worktable/gcc-3.2.2/configure --program-suffix=-3.2.2 --disable-nls
- make bootstrap (230 MB)
- make install
- /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.2.2/ (библиотеки, exe и include)
- /usr/local/bin (множество программ с суффиксом "-3.2.2", в частности gcc-3.2.2)
- /usr/local/i686-pc-linux-gnu/bin (программы без суффиксов nm, strip, ar, ranlib, as, ld; inode тот же)
- /usr/local/i686-pc-linux-gnu/lib/ldscripts
- /usr/local/include (bfd.h, ansidecl.h, symcat.h, bfdlink.h, dis-asm.h)
- /usr/local/lib/ (libgcc_s.so.1, libgcc_s.so, libiberty.a, libbfd.la, libbfd.a, libopcodes.la, libopcodes.a)
- /usr/local/man/man1 (документация к программам с суффиксом "-3.2.2" и почему-то cpp и gcov без суффикса)
- /usr/local/man/man7 (fsf-funding.7, gfdl.7, gpl.7)
- /usr/local/info (cpp.info*, gcc.info*, cppinternals.info, gccint.info*,
bfd.info*, binutils.info*, standards.info, configure.info*, as.info*, gprof.info*, ld.info*)
А вот поставить gcc-3.3 и binutils-2.13.2.1 на RH 7.2
не удалось.
- --help (общие ключи)
- -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.
Условия измерения: процессор - 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):
- -fcprop-registers
- -fdefer-pop
- -fgcse-lm
- -fguess-branch-probability (предсказание делается случайным образом!)
- -fkeep-static-consts
- -fmerge-constants
- -fthread-jumps
Ключ -O2 добавляет оптимизацию
(с ключом -fno-guess-branch-probability, 19047 KSymbols/sec):
- -fcaller-saves
- -fcse-follow-jumps
- -fcse-skip-blocks
- -fdelete-null-pointer-checks (может повлиять на логику работы программы)
- -fexpensive-optimizations
- -fforce-mem (иногда лучше убрать)
- -foptimize-register-move (AKA -fregmove)
- -foptimize-sibling-calls
- -fpeephole2
- -freorder-blocks
- -frerun-cse-after-loop
- -frerun-loop-opt
- -fschedule-insns2
- -fstrength-reduce
- -fstrict-aliasing (могут быть проблемы с union)
Ключ -O3 (больше в этой версии не бывает!) добавляет оптимизацию
(с ключом -fno-guess-branch-probability, 19442 KSymbols/sec):
- -frename-registers
- -finline (в листинге ключ отсутствует)
- -finline-functions (в листинге ключ отсутствует)
Дополнительные ключи оптимизации:
- -fomit-frame-pointer (проблемы с отладкой, 20152 KSymbols/sec)
- -fforce-addr (замедляет, выкидываем)
- -fsched-spec-load (20206 KSymbols/sec)
- -fsched-spec-load-dangerous (пользы никакой, а название пугает)
- -funroll-loops (20222 KSymbols/sec)
- -funroll-all-loops (замедляет, выкидываем)
- -fmove-all-movables (замедляет, выкидываем)
- -freduce-all-givs (замедляет, выкидываем)
- -falign-functions (пользы никакой)
- -falign-loops (пользы никакой)
- -falign-jumps (пользы никакой)
- -fssa (замедляет, выкидываем)
- -fssa-cpp (требуется -fssa, ошибка компилятора)
- -fssa-dce (требуется -fssa, замедляет, выкидываем)
- --param max-gcse-passes=проходов (8 проходов не увеличили скорость)
- -mno-push-args (пользы никакой)
- -maccumulate-outgoing-args (пользы никакой)
- -minline-all-stringops (замедляет?!, выкидываем)
- -mno-align-stringops (замедляет, выкидываем)
- -mcpu=pentium4 (будет работать на любых x86 процессорах, оптимизирован под P4,
21728 KSymbols/sec)
- -march=pentium4 (будет работать только на P4, 22205 KSymbols/sec)
- -fprefetch-loop-arrays (только для продвинутых архитектур типа pentium4,
22633 KSymbols/sec)
- -fdelayed-branch (неприменим для x86)
- -mmmx (пользы никакой)
- -msse (включает mmx, пользы никакой)
- -msse2 (включает mmx и sse, пользы никакой)
- -m3dnow
- -ffast-math (включает -funsafe-math-optimizations)
- -DNDEBUG (отключает компиляцию assert)
- -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 выигрыш был больше.
Встроенные векторные команды (MMX, SSE, SSE2, 3DNOW!):
|
Bog BOS: Компилятор gcc: установка и использование
|
Copyright © 1996-2008 Sergey E. Bogomolov; www.bog.pp.ru
(КГБ знает все, даже то что у Вас на диске ;)