@ Карта сайта News Автора!

Bog BOS: Компилятор gcc: установка и использование

Последние изменения:
2024.11.11: sysadmin: Linux: пространства имён
2024.11.06: sysadmin: настройка TCP/IP в Linux: виртуальный интерфейс и виртуальный мост
2024.10.25: sysadmin: Linux VFS, атрибуты, расширенные атрибуты, ACL
2024.10.22: sysadmin: Монтирование файловых систем: bind, shared и OverlayFS

Последнее изменение файла: 2011.06.09
Скопировано с www.bog.pp.ru: 2024.11.21

Bog BOS: Компилятор gcc: установка и использование

GCC (Gnu Compilers Collection) позволяет компилировать программы на C (C89), C++ (G++), Objective-C, Ada (GNAT), Fortran, Java (gcj). Имеется не до конца интегрированный препроцессор с Pascal.

Версии GCC

Версии языка C

GCC 3.2 поддерживает следующие версии C (по умолчанию C89 с расширениями: -std=gnu89):

Установка 4.5.0 на CentOS 5.4

Сборка gcc 4.5.0 (только C и C++) из gcc-core-4.5.0.tar.bz2 и gcc-g++-4.5.0.tar.bz2 (руководство, спецификации RPM для Fedora):

  1. распаковать исходные тексты gcc-core-4.5.0.tar.bz2, gcc-g++-4.5.0.tar.bz2 и gcc-testsuite-4.5.0.tar.bz2 в worktable (в общую gcc-4.5.0, 350MB)
  2. убедиться, что необходимые инструменты установлены, кроме указанных ниже исключений
  3. удалить слишком старый пакет gmp-devel (оставив пакет gmp - нужен gcc44 и php)
  4. собрать новую версию GMP 4.3.2 из исходных текстов в /usr/local (/usr/local/lib и /usr/local/lib64 должны быть в /etc/ld.so.conf):
  5. собрать PPL 0.10.2 из исходных текстов в /usr/local
  6. собрать polylib 5.22.5 в /usr/local
  7. собрать CLooG-PPL 0.15.9 из исходных текстов в /usr/local
  8. положить MPFR 2.4.2 внутрь gcc-4.5.0 под именем mpfr
  9. положить MPC 0.8.1 внутрь gcc-4.5.0 под именем mpc
  10. создать ~/worktable/gcc-4.5.0-objdir
  11. cd ~/worktable/gcc-4.5.0-objdir
  12. ~/worktable/gcc-4.5.0/configure --help (описание ключей)
  13. 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
  14. make [-j 20] bootstrap (1900 MB)
  15. make install
  16. [SELinux: chcon -t -v -v texrel_shlib_t /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/*.so*]
  17. /usr/local/lib и /usr/local/lib64 в /etc/ld.so.conf и ldconfig
  18. проблема: /usr/bin/ld: cannot find -lgcc_s (необходимость каждый раз указывать -L/usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64 не радует)
  19. ln -s /usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64/libgcc_s.so /usr/local/lib64/libgcc_s.so
  20. ln -s /usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64/libgcc_s.so.1 /usr/local/lib64/libgcc_s.so.1

Установка 4.4.1 на Fedora 10

Сборка gcc 4.4.1 (только C и C++) из gcc-core-4.4.1.tar.bz2 и gcc-g++-4.4.1.tar.bz2 (руководство, спецификации RPM для Fedora):

  1. убедиться, что необходимые инструменты установлены
  2. в частности, пришлось установить
  3. распаковать исходные тексты gcc-core-4.4.1.tar.bz2, gcc-g++-4.4.1.tar.bz2 и gcc-testsuite-4.4.1.tar.bz2 в /worktable (в общую gcc-4.4.1, 320MB)
  4. создать /worktable/gcc-4.4.1-objdir
  5. cd /worktable/gcc-4.4.1-objdir
  6. /worktable/gcc-4.4.1/configure --help (описание ключей)
  7. /worktable/gcc-4.4.1/configure --program-suffix=-4.4.1 --enable-version-specific-runtime-libs --enable-languages=c,c++ --disable-nls --with-cloog --with-ppl --enable-threads=posix -enable-__cxa_atexit --disable-libunwind-exceptions --with-arch_32=i686 --with-tune=generic
  8. make [-j 4] bootstrap (1900 MB)
  9. make install
  10. [SELinux: chcon -t -v -v texrel_shlib_t /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.4.1/*.so*]
  11. /usr/local/lib и /usr/local/lib64 в /etc/ld.so.conf и ldconfig
  12. проблема: /usr/bin/ld: cannot find -lgcc_s (необходимость каждый раз указывать -L/usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64 не радует)
  13. ln -s /usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64/libgcc_s.so /usr/local/lib64/libgcc_s.so
  14. ln -s /usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64/libgcc_s.so.1 /usr/local/lib64/libgcc_s.so.1

Установка 4.3.3 на CentOS 5.3

Сборка gcc 4.3.3 (только C и C++) из gcc-core-4.3.3.tar.bz2 и gcc-g++-4.3.3.tar.bz2:

  1. убедиться, что необходимые инструменты установлены
  2. [в частности, пришлось установить MPFR 2.4.1 с сайта ]
  3. распаковать gcc-core-4.3.3.tar.bz2, gcc-g++-4.3.3.tar.bz2 и gcc-testsuite-4.3.3.tar.bz2 в /worktable
  4. создать /worktable/gcc-4.3.3-objdir
  5. cd /worktable/gcc-4.3.3-objdir
  6. /worktable/gcc-4.3.3/configure --help (описание ключей)
  7. /worktable/gcc-4.3.3/configure --program-suffix=-4.3.3 --enable-version-specific-runtime-libs --enable-languages=c,c++ --disable-nls --with-mpfr-include=/usr/local/include --with-mpfr-lib=/usr/local/lib
  8. make [-j 4] bootstrap (1400 MB)
  9. make install
  10. [SELinux: chcon -t -v -v texrel_shlib_t /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.3.3/*.so*]
  11. /usr/local/lib и /usr/local/lib64 в /etc/ld.so.conf и ldconfig
  12. проблема: /usr/bin/ld: cannot find -lgcc_s (необходимость каждый раз указывать -L/usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64 не радует)
  13. ln -s /usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64/libgcc_s.so /usr/local/lib64/libgcc_s.so
  14. ln -s /usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64/libgcc_s.so.1 /usr/local/lib64/libgcc_s.so.1

Установка 4.3.1 на FC6

Сборка gcc 4.3.1 (только C и C++) из gcc-core-4.3.1.tar.bz2:

  1. убедиться, что необходимые инструменты установлены
  2. в частности, пришлось установить MPFR 2.3
  3. распаковать gcc-core-4.3.1.tar.bz2, gcc-g++-4.3.1.tar.bz2 и gcc-testsuite-4.3.1.tar.bz2 в /worktable
  4. создать /worktable/gcc-4.3.1-objdir
  5. cd /worktable/gcc-4.3.1-objdir
  6. /worktable/gcc-4.3.1/configure --help (описание ключей)
  7. /worktable/gcc-4.3.1/configure --program-suffix=-4.3.1 --enable-version-specific-runtime-libs --enable-languages=c,c++ --disable-nls --with-mpfr-include=/usr/local/include --with-mpfr-lib=/usr/local/lib
  8. make bootstrap (820 MB)
  9. make install
  10. chcon -t texrel_shlib_t /usr/local/lib/gcc/i686-pc-linux-gnu/4.3.1/*.so*
  11. ldconfig

Установка 3.2.2

Сборка gcc 3.2.2 (только C) из gcc-core-3.2.2.tar.bz2 и binutils-2.13.2.tar.bz2:

  1. распаковать gcc-3.2.2 (gcc-core-3.2.2) в /worktable
  2. распаковать binutils-2.13.2; поддиректории bfd, binutils, etc, gas, gprof, intl, ld, opcodes, texinfo перенести в gcc-3.2.2; поддиректории include и libiberty в binutils новее, чем в gcc, так что надо добавить или заменить их, но аккуратно
  3. создать /worktable/gcc-3.2.2-objdir
  4. cd /worktable/gcc-3.2.2-objdir
  5. /worktable/gcc-3.2.2/configure --program-suffix=-3.2.2 --disable-nls
  6. make bootstrap (230 MB)
  7. make install

А вот поставить gcc-3.3 и binutils-2.13.2.1 на RH 7.2 не удалось.

Некоторые ключи компиляции

Для компиляции под 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:

Ключ -march=pentium4 уменьшил скорость.

Ключ -O добавляет оптимизацию (с ключом -fno-guess-branch-probability, 18576 KSymbols/sec):

Ключ -O2 добавляет оптимизацию (с ключом -fno-guess-branch-probability, 19047 KSymbols/sec):

Ключ -O3 (больше в этой версии не бывает!) добавляет оптимизацию (с ключом -fno-guess-branch-probability, 19442 KSymbols/sec):

Дополнительные ключи оптимизации:

Уменьшение размера рабочего массива на 100 КБ, чтобы освободить место в кеше (специально зарезервировал поначалу с избытком, чтобы было что уменьшать ;) не дало результата в отличие от Pentium III с его маленьким кешем.

Для использования статистики предсказания переходов необходимо предварительно скомпилировать программу с ключом -fprofile-arcs, затем выполнить программу для сбора статистики вероятностей переходов (результаты помещаются в файлы с суффиксами .da в исходной директории, бинарный формат). Затем надо заново скомпилировать с программу с теми же самыми ключами компиляции, только заменив ключ -fprofile-arcs на -fbranch-probabilities. Следует заметить, что оптимальный результат (22937 KSymbols/sec) будет достигаться только при выполнении программы с теми же самыми ключами и с теми же исходными данными. На Pentium III выигрыш был больше.

Автоматическое распараллеливание: -floop-parallelize-all (4.5) -ftree-parallelize-loops=8 (4.4).

MMX, SSE, SSE2, 3DNOW!

Встроенные векторные команды (MMX, SSE, SSE2, SSE3, SSSE3, SSE4.0, 3DNOW!):

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

Ссылки

@ Карта сайта News Автора!

Bog BOS: Компилятор gcc: установка и использование

Последние изменения:
2024.11.11: sysadmin: Linux: пространства имён
2024.11.06: sysadmin: настройка TCP/IP в Linux: виртуальный интерфейс и виртуальный мост
2024.10.25: sysadmin: Linux VFS, атрибуты, расширенные атрибуты, ACL
2024.10.22: sysadmin: Монтирование файловых систем: bind, shared и OverlayFS



Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru