Оптимизация при компиляции ядра

Здесь обсуждаются все вопросы, не попадающие под другие категории
Аватара пользователя
Victor Gr.
Неотъемлемая часть форума
Сообщения: 891
Зарегистрирован: 13 авг 2004, 15:39
Откуда: Минск
Контактная информация:

Оптимизация при компиляции ядра

Сообщение 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. А что, если поставить более свежий? Что-нибудь даст, в плане оптимизации компиляции?

Спасибо, Друзья!

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

Victor Gr., я думаю, что разработчики ядра - достаточно вменяемые люди, и все нормальные флаги уже вставлены. Если хочется своего - то см. структуру Makefile в корневом каталоге исхожников, хотя ядро - это последнее место кудя я стал бы лезть с флагами...
Стабильно и максимально быстро - это абсолютно взаимоисключающие друг друга понятия.
Что касается использования MMX и SSE, то специфика ядра ОСв том, что эти расширения там абсолютно бесполезны.
Что касается типа процессора - то достаточно выбрать в конфиге ядра свой - соответсвубщие опции компилятору будут переданы, более того будут задествованы некоторые спцифичные для процессора фичи, что всяко полезнее разных флагов.
С компилятором опять же играться можно, но пользы мало. Любая ненулевая версия компилятора практически всегда соберет ядро, ну и естественно чем больше третья циферка - тем здоровее. Т.е. ИМХО gcc 3.3.5 предпочтительнее нежели gcc 4.0
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
red f0x
Неотъемлемая часть форума
Сообщения: 338
Зарегистрирован: 08 мар 2004, 01:41

Сообщение red f0x »

Victor Gr., извиняюсь, но зачем оптимизировать? Всё и так достаточно оптимизировано. И сам по себе код писали люди продвинутые и при сборке компилер оптимизирует ехе-код. ИМХО дальше не зачем. Ну можешь ты поставить в make -O7, и что ты получишь? Такая оптимизация не сделает из твоего компутера супрекомпутер.
Флаги можно выставлять в самом makefile - HOSTCFLAGS=-Wall -O2... . Вот эта строка. Но зачем?
Ну какая работа со строками может быть в языке, название которого является не строкой, а символом? (c) Sergue E. Leontiev

Аватара пользователя
Victor Gr.
Неотъемлемая часть форума
Сообщения: 891
Зарегистрирован: 13 авг 2004, 15:39
Откуда: Минск
Контактная информация:

Сообщение 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 - только почему-то открывается через раз.

Класс?

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

btw, мне кажется, что на i386 для копирования используется вообще DMA, если я не ошибаюсь...
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
Victor Gr.
Неотъемлемая часть форума
Сообщения: 891
Зарегистрирован: 13 авг 2004, 15:39
Откуда: Минск
Контактная информация:

Сообщение 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.

Как эти функции отлючить и на что они могут повлиять?

Спасибо!

Аватара пользователя
Victor Gr.
Неотъемлемая часть форума
Сообщения: 891
Зарегистрирован: 13 авг 2004, 15:39
Откуда: Минск
Контактная информация:

Сообщение Victor Gr. »

Llama, странно, если так. DMA ведь далеко не стандартная вещь в компьтерах. И вообще, по-моему, DMA применяется только в дисках. Хотя, здесь правда, могу очень ошибаться.

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

не... нетак. DMA - то direct memory access, применяется не только в дисках.
PS: использование DMA для копирования - это только мое предположение, подверждать в коде лениво )
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
poligraph
Неотъемлемая часть форума
Сообщения: 304
Зарегистрирован: 15 мар 2004, 18:17

Сообщение poligraph »

Когда-то X-Stranger писал
http://msk.nestor.minsk.by/kg/2001/32/kg13208.html

Аватара пользователя
Victor Gr.
Неотъемлемая часть форума
Сообщения: 891
Зарегистрирован: 13 авг 2004, 15:39
Откуда: Минск
Контактная информация:

Сообщение Victor Gr. »

poligraph, спасибо! То что нужно!

Llama, я (под Windows) запустил пробный эксешник с оптимизированными функциями. Правда, все функции отработали в 2 раза быстрее!

Аватара пользователя
Victor Gr.
Неотъемлемая часть форума
Сообщения: 891
Зарегистрирован: 13 авг 2004, 15:39
Откуда: Минск
Контактная информация:

Сообщение 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.

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

использровать можно все флаги которые найдешь в man gcc. Статья древняя, еще тех времен, когда всякие мутанты поганили gcc до такого состояния, что он не мог собрать ядро, соответсвенно в дистрибутив вклядывался "другой" gcc чтобы только собирать ядро. Славились этим RH во время 6.x - 7.1, Mandrake ну и их разнообразные клоны... GCC 2.96 - вот это ж был глюк... Всем глюкам - глюк ;)
На а -mcpu=pentiumpro имел сысл во времена Pentium II но никак не Pentium4. Вобщем, читай man gcc до просветления. У меня яджро собраное с -O3 иногда работало, впрочем давно с таким уже не играюсь...
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
Victor Gr.
Неотъемлемая часть форума
Сообщения: 891
Зарегистрирован: 13 авг 2004, 15:39
Откуда: Минск
Контактная информация:

Сообщение Victor Gr. »

Llama, да. Прошу прощения за pentiumpro. Скопировал, не исправляя. У меня P3.

А по объему занимаемой в памяти можно ли как-то оптимизировать?
-Os - Включает все флаги из -O2, которые не увеличивают размер.

Это относится только к размеру файла, или к размеру кода в ОЗУ тоже?

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

Оптимизация по размеру идет в ущерб производиельности. ИМХО оптимизировать по размеру ядро смысле нет, разве что памяти <32Mb
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
mend0za
Неотъемлемая часть форума
Сообщения: 2332
Зарегистрирован: 30 авг 2002, 12:33
Откуда: Minsk

Сообщение mend0za »

egcs - это было ещё задолго до 2.96

ещё до того как Cygnus (авторы egcs) стали частью RedHat и наломали дров в ALpha-версии gcc-3.x, известной как 2.96
И увидел я зверя, выходящего из тундры. И число его было 3.14159265358979324...

Ответить