Страница 1 из 2
Оптимизация при компиляции ядра
Добавлено: 26 сен 2005, 23:12
Victor Gr.
Добрый день!
Дорос уже до перекомпиляции ядра под свои нужды. Выкидываением всего ненужного и вставлением всего нужного. Цель - оптимизировать его под себя и по скорости выполнения.
Всё отлично. Оно даже собралось.
Debian Sarge 3.1 r0a. Но... Собралось странно, на стадии make modules_install install промелькнуло какое-то сообщение об initrd и в папку /boot новый initrd не записался.
Удалось завести ядро со старым initrd, но это, сами понимаете не дело
vmlinuz-2.6.12, а initrd - 2.4.27
.
Но это ладно, разберемся. Суть вопроса не в этом.
А в том, что, уже скомпилировав ядро, до меня дошло, что я его не оптимизировал. Т.е. всё что сделал - это выбрал свой тип процессора.
А как мне указать для gcc о типе процессора, об -О3, об ММХ, SSE? Где ему об этом сказать?
Или можно это всё написать в файле, например, /etc/make.conf? Такое я видел во FreeBSD. Как в Линуксе? В частности, в Дебиане?
И какие флаги следует задавать? чтобы ядро работало стабильно и максимально быстро?
Ну, и ещё вопрос о версии компилятора. У меня в системе gcc 3.3.5. А что, если поставить более свежий? Что-нибудь даст, в плане оптимизации компиляции?
Спасибо, Друзья!
Добавлено: 26 сен 2005, 23:58
Llama
Victor Gr., я думаю, что разработчики ядра - достаточно вменяемые люди, и все нормальные флаги уже вставлены. Если хочется своего - то см. структуру Makefile в корневом каталоге исхожников, хотя ядро - это последнее место кудя я стал бы лезть с флагами...
Стабильно и максимально быстро - это абсолютно взаимоисключающие друг друга понятия.
Что касается использования MMX и SSE, то специфика ядра ОСв том, что эти расширения там абсолютно бесполезны.
Что касается типа процессора - то достаточно выбрать в конфиге ядра свой - соответсвубщие опции компилятору будут переданы, более того будут задествованы некоторые спцифичные для процессора фичи, что всяко полезнее разных флагов.
С компилятором опять же играться можно, но пользы мало. Любая ненулевая версия компилятора практически всегда соберет ядро, ну и естественно чем больше третья циферка - тем здоровее. Т.е. ИМХО gcc 3.3.5 предпочтительнее нежели gcc 4.0
Добавлено: 27 сен 2005, 01:00
red f0x
Victor Gr., извиняюсь, но зачем оптимизировать? Всё и так достаточно оптимизировано. И сам по себе код писали люди продвинутые и при сборке компилер оптимизирует ехе-код. ИМХО дальше не зачем. Ну можешь ты поставить в make -O7, и что ты получишь? Такая оптимизация не сделает из твоего компутера супрекомпутер.
Флаги можно выставлять в самом makefile - HOSTCFLAGS=-Wall -O2... . Вот эта строка. Но зачем?
Добавлено: 27 сен 2005, 13:13
Victor Gr.
Ну, оптимизировать всегда хочется. И здесь с вами согласен. Если уже нет возможности найти ещё 10% прибавки, то и заниматься этим не буду
.
Впрочем, интересно - правда ли в ядре совершенно не нужны инструкции MMX и SSE? Все привыкли к тому, что это мультимедийные расширения. А ведь они вполне применимы и в мирных целях. Так, MMX - это блок существенно ускоряющий пакетную обработку целых чисел, а SSE - дробных. Так разве это не может помочь ядру?
Как подтверждение своих слов приведу цитату проекта русского программиста:
===============================================
vMMX Library 1.5
Для компиляции нужен processor pack
Заточеная под MMX и SSE библиотека.
Есть следующие функции:
* MMXmemcpy(), SSEmemcpy() - копирование памяти
* MMXstrcmp(), SSEstrcmp() - сравнение строк
* MMXmemset(), SSEmemset() - установка памяти в некоторое значение или обнуление ( по умолчанию )
* MMXstrlen(), SSEstrlen() - вычисление длины строки
Для работы SSE функциями нужен iPIII или AMD Athlon, так как используется расширение SSE для MMX.
При отсутствие поддерки SSE или MMX вызываются простейшие функции, так что в программе можно писать SSExxx() а во время выполнения будет определён проц и поддерживаемые расширения. Все функции работают быстрее своих Сишных аналогов в 3-5 раз... Если появятся какие-нибудь пожелания или комментарии пишите на мыло...
===============================================
Разница достигала от 135 до 450%.
Почему бы не использовать?
http://vudz.by.ru/projects/vMMX.shtml - только почему-то открывается через раз.
Класс?
Добавлено: 27 сен 2005, 13:19
Llama
btw, мне кажется, что на i386 для копирования используется вообще DMA, если я не ошибаюсь...
Добавлено: 27 сен 2005, 13:20
Victor Gr.
А вот ещё вопрос!
На стадии компиляции make bzImage выдавались вот такие сообщения:
kernel/intermodule.c:179 : warning: `inter_module_register` is deprecated.
То же с inter_module_unregister, inter_module_put и в
power/pm.c:259 : pm_register и т. д.
Ну, это всего-лишь warning и компиляция продолжалась, но "is deprecated" мне показалось странным. Ядро 2.6.12.
Как эти функции отлючить и на что они могут повлиять?
Спасибо!
Добавлено: 27 сен 2005, 13:22
Victor Gr.
Llama, странно, если так. DMA ведь далеко не стандартная вещь в компьтерах. И вообще, по-моему, DMA применяется только в дисках. Хотя, здесь правда, могу очень ошибаться.
Добавлено: 27 сен 2005, 13:38
Llama
не... нетак. DMA - то direct memory access, применяется не только в дисках.
PS: использование DMA для копирования - это только мое предположение, подверждать в коде лениво )
Добавлено: 27 сен 2005, 13:54
poligraph
Добавлено: 27 сен 2005, 14:02
Victor Gr.
poligraph, спасибо! То что нужно!
Llama, я (под Windows) запустил пробный эксешник с оптимизированными функциями. Правда, все функции отработали в 2 раза быстрее!
Добавлено: 27 сен 2005, 14:13
Victor Gr.
Прочёл. Захватывающе!, но удивили некоторые вещи:
"Оптимизация под Pentium (Pro/II/III) будет работать только с компиляторами egcs и pgcc."
А gcc??
И можно ли скопилировать ядро этими компиляторами?
И ещё,
-funroll-loops
-ffast-math
-malign-double
-mcpu=pentiumpro
-march=pentiumpro
-fomit-frame-pointer
-fno-exceptions
-fforce-mem
-fforce-addr
Все эти вещи уже учтены в Makefile для ядра, я так понимаю? Там где они вообще дают пользу и не вредят стабильности.
Ну, а для компиляции стороннего софта можно ли их использовать безболезненно? Или придётся экспериментировать?
И ещё... X-Stranger в своей статье рекомендует использовать -O9. Такое вообще допустимо?, ведь все советуют не выше, чем -О3.
Добавлено: 27 сен 2005, 14:19
Llama
использровать можно все флаги которые найдешь в man gcc. Статья древняя, еще тех времен, когда всякие мутанты поганили gcc до такого состояния, что он не мог собрать ядро, соответсвенно в дистрибутив вклядывался "другой" gcc чтобы только собирать ядро. Славились этим RH во время 6.x - 7.1, Mandrake ну и их разнообразные клоны... GCC 2.96 - вот это ж был глюк... Всем глюкам - глюк
На а -mcpu=pentiumpro имел сысл во времена Pentium II но никак не Pentium4. Вобщем, читай man gcc до просветления. У меня яджро собраное с -O3 иногда работало, впрочем давно с таким уже не играюсь...
Добавлено: 27 сен 2005, 14:36
Victor Gr.
Llama, да. Прошу прощения за pentiumpro. Скопировал, не исправляя. У меня P3.
А по объему занимаемой в памяти можно ли как-то оптимизировать?
-Os - Включает все флаги из -O2, которые не увеличивают размер.
Это относится только к размеру файла, или к размеру кода в ОЗУ тоже?
Добавлено: 27 сен 2005, 14:50
Llama
Оптимизация по размеру идет в ущерб производиельности. ИМХО оптимизировать по размеру ядро смысле нет, разве что памяти <32Mb
Добавлено: 27 сен 2005, 21:07
mend0za
egcs - это было ещё задолго до 2.96
ещё до того как Cygnus (авторы egcs) стали частью RedHat и наломали дров в ALpha-версии gcc-3.x, известной как 2.96