Файл “/etc/profile”.
Файл “/etc/profile” включает системное окружение всех исполняемых программ. Все настройки добавленные в этот файл отражаются на переменные окружения вашей системы. Так, помещение в этот файл флагов оптимизации – это хорошая идея. Чтобы выжать максимальную эффективность из ваших программ под x86, вы можете использовать при компиляции флаг –09, обозначающий полную оптимизацию. Многие программы содержат в Makefile опцию –02, но –09 обозначает высший уровень оптимизации при которой размер файла увеличивается, но увеличивается и скорость выполнения.
Замечание. Использование опции –09 не всегда приводит к наилучшим результатам. Это верно для x686 и выше процессоров, но для более старых процессоров не всегда так.
При компиляции можно использовать опцию -fomit-frame-pointer, которая говорит, что для доступа к переменным нужно использовать стек. К сожалению, с этой опцией практически невозможна отладка. Можно использовать переключатель -mcpu=cpu_type и -march=cpu_type при помощи которых создается код, оптимизированный для определенного CPU. Полученный код будет работать только на заданном процессоре или более новом. Приведенные ниже оптимизационные флаги запишите в файл /etc/profile. Они влияют только на программы, которые вы будете компилировать в дальнейшем и не оказывают на какого действия на существующую систему.
Шаг 1.
Для CPU i686 или PentiumPro, Pentium II, Pentium III
В файл “/etc/profile” добавьте следующую строку:
CFLAGS=’-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions’
Для CPU i586 или Pentium
В файл “/etc/profile” добавьте следующую строку:
CFLAGS=’-O3 -march=pentium -mcpu=pentium -ffast-math -funroll-loops -fomit-frame-pointer -fforce-mem -fforce-addr -malign-double -fno-exceptions’
For CPU i486
В файл “/etc/profile” добавьте следующую строку:
CFLAGS=’-O3 -funroll-all-loops -malign-double -mcpu=i486 -march=i486 -fomit-frame-pointer -fno-exceptions’
Шаг 2.
После выбора типа процессора добавьте в строку export файла “/etc/profile” переменные "CFLAGS LANG LESSCHARSET"
export PATH PS1 HOSTNAME HISTSIZE HISTFILESIZE USER LOGNAME MAIL INPUTRC CFLAGS LANG LESSCHARSET
Шаг 3.
Выйдете из системы и вновь в нее войдете, чтобы опции определенные переменной CFLAGS вступили в силу и все программы и другие “configure” утилиты стали ее учитывать. Оптимизация под Pentium (Pro/II/III) будет работать только с компиляторами egcs и pgcc. Egcc уже установлен на вашем сервере, поэтому об этом думать не надо.
Ниже приведено описание опций, которые мы использовали:
-funroll-loops
Выполняется оптимизация развертыванием циклов. Это осуществляется для циклов число итераций которых может быть определено во время компиляции или во время выполнения.
-funroll-all-loops
Выполняется оптимизация развертыванием циклов. Развертывает все циклы и обычно программы скомпилированные с этой опцией медленнее запускаются.
-ffast-math
Эта опция позволяет GCC нарушать некоторые ANSI или IEEE правила и/или спецификации в интересах оптимизации кода по скорости выполнения. Например, это позволяет компилятору предполагать, что параметры к функции sqrt - не-отрицательные числа и что значения не с плавающей запятой являются NaNs.
-malign-double
Контролирует, выравнивает ли GCC double, long double и long long переменные на двусловной границе или однословной границе. Выравнивание double переменных на двусловной границе создает код, который выполняется на “Pentium” процессорах несколько быстрее, расходуя больше памяти.
-mcpu=cpu_type
Определяет значание типа процессора при планировании используемых инструкций. При определении конкретного типа CPU, GCC будет использовать инструкции специфичные для него. Когда эта опция не определена, никогда не будут использоваться команды не работающие на i386 процессоре. "I586" эквивалентен "Pentium", "i686" эквивалентен "Pentium Pro". "K6" - AMD.
-march=cpu_type
Создает инструкции для CPU cpu_type. Выбор типов процессоров такой же как и для mcpu. Кроме того, использование `-march=cpu_type' подразумевает и `- mcpu=cpu_type'.
-fforce-mem
принуждает копировать операнды хранящиеся в памяти в регистры перед выполнением арифметических операций над ними. В результате получается более лучший код в котором все ссылки на ячейки памяти потенциально общие подвыражения. Когда они не являются общими подвыражениями, то комбинации команд должны устранить отдельную загрузку регистра.
-fforce-addr
вынуждает копировать постоянные адреса памяти в регистры перед выполением арифметических операций над ними. В результате может создаваться более хороший код, так же как и при -fforce-mem.
-fomit-frame-pointer
Не сохранять указатель на кадр (frame pointer) в регистре для функций, которые не нуждаются в этом. Это позволяет избежать инструкций на сохранение, определение и восстановление указателя на кадр (frame pointer); в то же время освобождая регистры для других функций. Это делает невозможным отладку на большинстве машин.
Замечание. Все возможности оптимизации, которые описаны в этой книге относятся к семейству процессоров Pentium II/III. Так, что вы должны при необходимости изменить флаги компиляции под ваш тип процессора.
Результаты тестирования быстродействия, суммирование по архитектурам.
В зависимости от типа вашего процессора и версии компилятора (gcc/egcs) опции оптимизации могут отличаться. Графики приведенные ниже помогут вам выбрать лучшие для вас флаги компиляции.
Версия компилятора установленного в Red Hat 6.1 и 6.2 - egcs 2.91.66. Но перед выбором опций оптимизации обязательно проверьте его версию, используя команду:
egcs –version
Все результаты тестирования могут быть получены с домашней страницы GCC, находящейся по адресу .
Сейчас приведем пример:
Для CPU Pentium II/III (i686) и компилятора egcs-2.91.66 лучшими опциями оптимизации будут:
CFLAGS=’-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions’
Для CPU pentium (i586) с компилятором egcs-2.91.66 лучшими опциями оптимизации будут:
CFLAGS=’-O3 -march=pentium -mcpu=pentium -ffast-math -funroll-loops -fomit-frame-pointer -fforce-mem -fforce-addr -malign-double -fno-exceptions’
Для CPU i486 с компилятором egcs-2.91.66 лучшими опциями оптимизации будут:
CFLAGS=’-O3 -funroll-all-loops -malign-double -mcpu=i486 -march=i486 -fomit-frame-pointer -fno-exceptions’