|
Bog BOS: Компилятор gcc: установка и использование
|
Последнее изменение файла: 2011.06.09
Скопировано с www.bog.pp.ru: 2024.11.23
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, разработка остановлена
GCC 3.2 поддерживает следующие версии 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 4.5.0 (только C и C++) из gcc-core-4.5.0.tar.bz2 и gcc-g++-4.5.0.tar.bz2
(руководство,
спецификации RPM для Fedora):
- распаковать исходные тексты 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)
- убедиться, что необходимые инструменты установлены,
кроме указанных ниже исключений
- удалить слишком старый пакет gmp-devel (оставив пакет gmp - нужен gcc44 и php)
- собрать новую версию GMP 4.3.2 из исходных текстов в /usr/local
(/usr/local/lib и /usr/local/lib64 должны быть в /etc/ld.so.conf):
- распаковать рядом (не внутри)
- CC=gcc44 ./configure --enable-cxx
- make -j 20
- make check
- make install: /usr/local/share/info/gmp.*, /usr/local/lib/libgmp.*, /usr/local/lib/libgmpxx.*,
/usr/local/include/gmp.h, /usr/local/include/gmpxx.h
- ldconfig
- собрать PPL 0.10.2 из исходных текстов в /usr/local
- распаковать рядом (не внутри)
- CC=gcc44 ./configure --enable-optimization --with-libgmp-prefix=/usr/local --with-libgmpxx-prefix=/usr/local
- make -j 20
- make check -j 20 (зацикливается в tests/BOX)
- make install: /usr/local/lib/libppl.*, /usr/local/bin/ppl-config, /usr/local/include/ppl.hh,
/usr/local/lib/libpwl.*, /usr/local/include/pwl.hh,
/usr/local/share/doc/pwl/, /usr/local/lib/libppl_c.*, /usr/local/bin/ppl_lcdd, /usr/local/share/man/man1/,
/usr/local/share/doc/ppl/, /usr/local/share/man/man3/; ldconfig)
- ldconfig
- собрать polylib 5.22.5 в /usr/local
- взять исходные тексты
- CC=gcc44 CXXFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ./configure
--enable-int-lib --enable-longint-lib --enable-longlongint-lib --with-libgmp=/usr/local
- make -j 20
- make check (Enumerate: arithmetic overflow error. You should rebuild PolyLib using GNU-MP?)
- make install: /usr/local/include/polylib/, /usr/local/lib/libpolylibgmp.*, /usr/local/lib/libpolylib64.*,
/usr/local/lib/libpolylib32.*, /usr/local/bin/ (c2p r2p findv disjoint_union_sep disjoint_union_adj
ehrhart_quick_apx ehrhart_upper_bound ehrhart_lower_bound ehrhart_rankinggmp ehrhart_uniongmp ppgmp
testehrhartgmp ehrhart_ranking64 ehrhart_union64 pp64 testehrhart64 ehrhart_ranking64 ehrhart_union64
pp64 testehrhart64 ehrhart_ranking32 ehrhart_union32 pp32 testehrhart32
- ldconfig
- собрать CLooG-PPL 0.15.9 из исходных текстов в /usr/local
- распаковать рядом (не внутри)
- CC=gcc44 CXXFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ./configure --with-ppl
--with-gmp-include=/usr/local/include --with-gmp-library=/usr/local/lib --with-bits=gmp
- make -j 20
- make check
- make install: /usr/local/lib/libcloog.*, /usr/local/include/cloog/, /usr/local/share/info/cloog.info
- ldconfig
- положить MPFR 2.4.2 внутрь gcc-4.5.0 под именем mpfr
- положить MPC 0.8.1 внутрь gcc-4.5.0 под именем mpc
- создать ~/worktable/gcc-4.5.0-objdir
- cd ~/worktable/gcc-4.5.0-objdir
- ~/worktable/gcc-4.5.0/configure --help
(описание ключей)
- 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/lib/libgcc_s.so.1
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64/libgcc_s.so.1
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/ (библиотеки 64 бит)
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/32/ (библиотеки 32 бит)
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/include/
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/finclude/ (пуст)
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/include/c++/
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/include/ssp/
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/include-fixed/ (обнаруженные в системе заголовки,
преобразуются к ANSI стандарту и складываются сюда; используются? кто отслеживает изменение оригинала?)
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/install-tools/
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/plugin/
- /usr/local/lib/libiberty.a
- /usr/local/lib64/libiberty.a
- /usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.5.0/ (cc1, cc1plus, collect2, install-tools/)
- /usr/local/share/man/man1 (документация к программам с суффиксом: cpp-4.5.0.1, g++-4.5.0.1,
gcc-4.5.0.1, gcov-4.5.0.1)
- /usr/local/share/man/man7 (fsf-funding.7, gfdl.7, gpl.7)
- /usr/local/share/info (без суффиксов: cpp.info, cppinternals.info, gcc.info, gccint.info,
gccinstall.info, libgomp.info)
- /usr/local/share/gcc-4.5.0/python/
- [SELinux: chcon -t -v -v texrel_shlib_t /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.5.0/*.so*]
- /usr/local/lib и /usr/local/lib64 в /etc/ld.so.conf и ldconfig
- проблема: /usr/bin/ld: cannot find -lgcc_s (необходимость каждый раз указывать
-L/usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64 не радует)
- ln -s /usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64/libgcc_s.so /usr/local/lib64/libgcc_s.so
- ln -s /usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64/libgcc_s.so.1 /usr/local/lib64/libgcc_s.so.1
Сборка gcc 4.4.1 (только C и C++) из gcc-core-4.4.1.tar.bz2 и gcc-g++-4.4.1.tar.bz2
(руководство,
спецификации RPM для Fedora):
- убедиться, что необходимые инструменты установлены
- в частности, пришлось установить
- GMP 4.2 (пакеты gmp и gmp-devel)
- MPFR 2.3.2 (пакеты mpfr и mpfr-devel)
- PPL 0.10 (пакеты ppl, ppl-devel, ppl-docs, ppl-static, ppl-utils, glpk)
- polylib 5.22.3 aka libpolylib64.so.7
(взять исходные тексты;
./configure (?--enable-int-lib ?--enable-longint-lib ?--enable-longlongint-lib); make; make test; make install;
ldconfig)
- CLooG-PPL 0.15 (взять исходные тексты 0.15.5;
./configure --with-ppl (--with-bits=gmp?);
make; make check; make install (libcloog.so.0.0.0);
- распаковать исходные тексты 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)
- создать /worktable/gcc-4.4.1-objdir
- cd /worktable/gcc-4.4.1-objdir
- /worktable/gcc-4.4.1/configure --help
(описание ключей)
- /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
- make [-j 4] bootstrap (1900 MB)
- make install
- /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/lib/libgcc_s.so.1
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64/libgcc_s.so.1
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.4.1/ (библиотеки 64 бит)
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.4.1/32/ (библиотеки 32 бит)
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.4.1/include/
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.4.1/finclude/ (пуст)
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.4.1/include/c++/
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.4.1/include/ssp/
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.4.1/include-fixed/ (обнаруженные в системе заголовки,
преобразуются к ANSI стандарту и складываются сюда; используются? кто отслеживает изменение оригинала?)
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.4.1/install-tools/
- /usr/local/lib/libiberty.a
- /usr/local/lib64/libiberty.a
- /usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.4.1/ (cc1, cc1plus, collect2, install-tools/)
- /usr/local/man/man1 (документация к программам с суффиксом: cpp-4.4.1.1, g++-4.4.1.1,
gcc-4.4.1.1, gcov-4.4.1.1)
- /usr/local/man/man7 (fsf-funding.7, gfdl.7, gpl.7)
- /usr/local/info (без суффиксов: cpp.info, cppinternals.info, gcc.info, gccint.info,
gccinstall.info, libgomp.info)
- [SELinux: chcon -t -v -v texrel_shlib_t /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.4.1/*.so*]
- /usr/local/lib и /usr/local/lib64 в /etc/ld.so.conf и ldconfig
- проблема: /usr/bin/ld: cannot find -lgcc_s (необходимость каждый раз указывать
-L/usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64 не радует)
- ln -s /usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64/libgcc_s.so /usr/local/lib64/libgcc_s.so
- ln -s /usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64/libgcc_s.so.1 /usr/local/lib64/libgcc_s.so.1
Сборка gcc 4.3.3 (только C и C++) из gcc-core-4.3.3.tar.bz2 и gcc-g++-4.3.3.tar.bz2:
- убедиться, что необходимые инструменты установлены
-
[в частности, пришлось установить MPFR 2.4.1 с сайта
- взять из каталога infrastructura
- распаковать
- прочитать INSTALL
- скачать и установить заплатки
- ./configure [--enable-thread-safe?]
- make
- make check
- make install
- /usr/local/lib/libmpfr.so*
- /usr/local/lib/libmpfr.a
- /usr/local/include/mpfr.h
- /usr/local/include/mpf2mpfr.h
- /usr/local/share/info/mpfr.info
- chcon -t texrel_shlib_t /usr/local/lib/libmpfr.so*
- ldconfig
]
- распаковать gcc-core-4.3.3.tar.bz2, gcc-g++-4.3.3.tar.bz2 и gcc-testsuite-4.3.3.tar.bz2 в /worktable
- создать /worktable/gcc-4.3.3-objdir
- cd /worktable/gcc-4.3.3-objdir
- /worktable/gcc-4.3.3/configure --help
(описание ключей)
- /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
- make [-j 4] bootstrap (1400 MB)
- make install
- /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/ (библиотеки 64 бит)
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib/libgcc_s.so.1
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64/libgcc_s.so.1
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.3.3/include/
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.3.3/include/c++/
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.3.3/include/ssp/
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.3.3/include-fixed/ (обнаруженные в системе заголовки,
преобразуются к ANSI стандарту и складываются сюда; используются? кто отслеживает изменение оригинала?)
- /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.3.3/install-tools/
- /usr/local/lib/libiberty.a
- /usr/local/lib/libiberty64.a
- /usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.3.3/ (cc1, cc1plus, collect2, install-tools/)
- /usr/local/man/man1 (документация к программам с суффиксом: cpp-4.3.3.1, g++-4.3.3.1,
gcc-4.3.3.1, gcov-4.3.3.1)
- /usr/local/man/man7 (fsf-funding.7, gfdl.7, gpl.7)
- /usr/local/info (без суффиксов: cpp.info, cppinternals.info, gcc.info, gccint.info,
gccinstall.info, libgomp.info)
- [SELinux: chcon -t -v -v texrel_shlib_t /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.3.3/*.so*]
- /usr/local/lib и /usr/local/lib64 в /etc/ld.so.conf и ldconfig
- проблема: /usr/bin/ld: cannot find -lgcc_s (необходимость каждый раз указывать
-L/usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64 не радует)
- ln -s /usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64/libgcc_s.so /usr/local/lib64/libgcc_s.so
- ln -s /usr/local/lib/gcc/x86_64-unknown-linux-gnu/lib64/libgcc_s.so.1 /usr/local/lib64/libgcc_s.so.1
Сборка gcc 4.3.1 (только C и C++) из gcc-core-4.3.1.tar.bz2:
- убедиться, что необходимые инструменты установлены
- в частности, пришлось установить MPFR 2.3
- взять из каталога infrastructura
- распаковать
- прочитать INSTALL
- скачать и установить заплатки
- ./configure [--enable-thread-safe?]
- make
- make check
- make install
- /usr/local/lib/libmpfr.so*
- /usr/local/lib/libmpfr.a
- /usr/local/include/mpfr.h
- /usr/local/include/mpf2mpfr.h
- /usr/local/share/info/mpfr.info
- chcon -t texrel_shlib_t /usr/local/lib/libmpfr.so*
- ldconfig
- распаковать gcc-core-4.3.1.tar.bz2, gcc-g++-4.3.1.tar.bz2 и gcc-testsuite-4.3.1.tar.bz2 в /worktable
- создать /worktable/gcc-4.3.1-objdir
- cd /worktable/gcc-4.3.1-objdir
- /worktable/gcc-4.3.1/configure --help
(описание ключей)
- /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
- make bootstrap (820 MB)
- make install
- /usr/local/bin (множество программ с суффиксом "-4.3.1", в частности cpp-4.3.1, gcc-4.3.1,
g++-4.3.1/c++-4.3.1, gccbug-4.3.1)
- /usr/local/lib/gcc/i686-pc-linux-gnu/4.3.1/ (библиотеки)
- /usr/local/lib/gcc/i686-pc-linux-gnu/4.3.1/include/
- /usr/local/lib/gcc/i686-pc-linux-gnu/4.3.1/include/c++/
- /usr/local/lib/gcc/i686-pc-linux-gnu/4.3.1/include-fixed/ (обнаруженные в системе заголовки,
преобразуются к ANSI стандарту и складываются сюда; используются? кто отслеживает изменение оригинала?)
- /usr/local/lib/gcc/i686-pc-linux-gnu/4.3.1/install-tools/
- /usr/local/lib/libiberty.a
- /usr/local/libexec/gcc/i686-pc-linux-gnu/4.3.1/ (cc1, cc1plus, collect2, install-tools/)
- /usr/local/man/man1 (документация к программам с суффиксом: cpp-4.3.1.1, g++-4.3.1.1,
gcc-4.3.1.1, gcov-4.3.1.1)
- /usr/local/man/man7 (fsf-funding.7, gfdl.7, gpl.7)
- /usr/local/info (без суффиксов: cpp.info, cppinternals.info, gcc.info, gccint.info,
gccinstall.info, libgomp.info)
- chcon -t texrel_shlib_t /usr/local/lib/gcc/i686-pc-linux-gnu/4.3.1/*.so*
- ldconfig
Сборка 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.
Для компиляции под 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):
- -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 выигрыш был больше.
Автоматическое распараллеливание: -floop-parallelize-all (4.5) -ftree-parallelize-loops=8 (4.4).
Встроенные векторные команды (MMX, SSE, SSE2, SSE3, SSSE3, SSE4.0, 3DNOW!):
Попытка воспользоваться векторными расширениями gcc привела меня к мысли,
что чтение документации Intel по архитектуре IA-32 неизбежно, а программирование на ассемблере проще
и эффективнее. Пример использования.
|
Bog BOS: Компилятор gcc: установка и использование
|
Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru