Підготовка до портежам-2. Питання оптимізації, Linux, Операційні системи, статті

Олексій Федорчук

Мінлива USE – ефективний спосіб настройки Gentoo під завдання користувача. Однак редагуванням файлу / etc / make.conf можна добитися більшого – задати глобально умови компіляції. Тобто, по простому кажучи, ті прапори компілятора gcc, які при ручному складанні програм звичайно задаються в командному рядку утиліти make.

Розгляд прапорів компілятора gcc саме по собі далеко виходить за рамки цього запису (див. бібліографію). Наша сьогоднішня мета суто практична – домогтися найбільшої оптимізації як базової системи, так і всіх компільованих додатків під конкретне залізо, благо поточна (3.2.x) версія gcc дозволяє зробити це для будь-яких процесорів

Отже, повертаємося до файлу / etc / make.conf, в якому бачимо три рядки, що описують прапори компіляції. За замовчуванням, в свіжовстановленому з тарбаллов, системі вони мають вигляд на кшталт:

CHOST='i686-pc-linux-gnu' CFLAGS='-march=pentium4 -mcpu=pentium4 -O3 -pipe' CXXFLAGS='-march=pentium4 -mcpu=pentium4 -O3 -pipe'

Перший рядок визначає архітектуру хост-машини, тобто комп’ютера, на якому компіляція виконується. А оскільки, якщо інше не зазначено явним чином, тип цільової машини приймається збігається з хостом, то характеризує і комп’ютер, для якого компілюється система. Виняток – випадки крос-платформної компіляції, тоді й host, і target потрібно визначати окремо. З типом все просто – для всіх процесорів від PentiumPro і вище (включаючи Athlon’и різного роду і Pentium4) рядок за замовчуванням відображає дійсність. Для Pentium просто тут слід було б поставити

CHOST='i586-pc-linux-gnu'

і так далі, але збирати на таких машинах Gentoo – заняття дуже нудне.

А наступні два рядки і містять прапори, що визначають умови оптимізації для деяких процесорів. Верхня з них дієва для складання исходников на Сі просто, нижня – для Сі + +.

Розглянемо ці прапори у зворотному звичайному порядку (справа наліво). Прапор-pipe наказує використовувати при компіляції т.зв. програмні канали замість тимчасових файлів для передачі даних між різними стадіями компіляції. Наскільки я розумію, вона не впливає на швидкодію генерованого коду, але сприяє прискоренню самого процесу компіляції. І, отже, не зайвою не буде.

Прапор-O # задає власне рівень оптимізації – від самого нижчого, O (або O1, що ідентично) до вищого – O3 (рівень O0 означає відсутність будь-якої оптимізації). Власне, кожен з цих прапорів – якась сукупність опцій, що сприяють швидкодії згенерованого коду, але для нас це не суттєво.

Як можна бачити, за замовчуванням в Gentoo пропонується найвищий рівень оптимізації (O3). З чим важко не погодитися – який же російський не любить швидкої їзди. Правда, у швидкої їзди є зворотний сторона – теоретично розмірковуючи, не кожен додаток (особливо тих, код яких в основному написаний досить давно) зобов’язана збиратися при надзвичайно оптимізації.

Не будучи программером, не можу сказати, яким чином вирішується ця проблема в Gentoo. Але факт залишається фактом: абсолютно всі потрібні мені програми збиралися благополучно при прапорі-O3. Типовий приклад – Віконна система X. Скільки я не намагався збирати вручну первозданний (з www.xfree86.org) Її исходник з прапором-O3 – рано чи пізно, але регулярно отримував повідомлення про помилку. А з Gentoo-портежей – компілюється без сучка, без задирки, і при ще більш жорстких умовах оптимізації. Не для того чи існують Gentoo-специфічні патчи? Буду вдячний за роз’яснення від професіоналів.

Так що сміливо залишаємо умолчальне прапор-O3 і переходимо до двох наступним. Сенс їх близький і зводиться до вказівки конкретного процесора, під який проводиться складання. Як значення обох прапорів можуть виступати (в gcc 3.2 і вище, і не виходячи за межі PC-архітектури) абсолютно все Intel-сумісні процесори, від i386, K6, Duron до Athlon-XP,-MP і Pentium4. Повний список підтримуваних каменів можна подивитися в коментарях до файлу / etc / make.conf або, ще краще – на man (1) gcc.

У чому відмінність прапорів-march і-mcpu? Перший генерує код з урахуванням особливостей зазначеного процесора, без можливості запуску на більш молодших моделях. Другий робить те ж саме, але зберігає сумісність з братами меншими. Тобто при складанні системи на настільній машині і для неї ж видається надмірним. Так що в реальності можна обмежитися вказівкою лише-march = модель.

В принципі, цими трьома прапорами можна і обмежитися. Однак на freehackers.org можна виявити сторінку, спеціально присвячену прапорів оптимізації для дистрибутива Gentoo (до слова відмічу, що вказаний сайт функціонує під керуванням саме цього дистрибутива). Так от, там в числі безпечних (safe) наведено, причому для всіх типів процесорів, ще один прапор – fomit-frame-pointer. Не візьмуся пояснювати точне його значення, але з класичного опису Річарда Столлман (див. бібліографію) можна зрозуміти, що його наявність сприяє виключенню деяких необов’язкових команд і таким чином також сприяє швидкодії. Так що, ймовірно, нехтувати їм не слід.

В результаті рядки з gcc = прапорами оптимізації для Pentiun4 візьмуть наступний вигляд:

CFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"

Якою і можна прийняти як оптимальний в звичайних умовах. У разі реліктового (за ціною, але не по продуктивності) Pentium-III, значення-march = слід змінити на pentium3, для Athlon різних видів – На athlon (athlon-tbird, athlon-xp, athlon-mp), і так далі.

На тому ж freehackers.org можна виявити пропозиції та більш жорсткої оптимізації, а саме – вказівка ​​прапорів-ffast-math (оптимізація з порушенням деяких правил ANSI і IEEE),-fforce-addr,-funroll-loops і деякі інші. За відсутністю власного досвіду, не можу нічого сказати про їх дієвості. Але те, що вони не віднесені до safe-прапорам, каже, що використовувати їх слід обережно. І не особливо дивуватися, отримавши повідомлення про помилку після пари годин складання якогось важкого програми.

Бібліографія питання

Перш ніж приступати до оптимізації, дуже не шкідливо почитати вступну частину класичної праці Річарда Столлман співтовариші “Компілятор GNU CC”, російський переклад якого можна знайти на багатьох сайтах з добірками документації, наприклад, на Linux.Yaroslavl. А конкретні рекомендації стосовно складання Gentoo-портежей є, як уже було сказано, на двох сторінках freehackers.org, Перша з яких присвячена безпечним прапорам, А друга – сильно оптимизирующим.

Спасибі учаснику Gentoo-форуму universal’у за наведені вище посилання. Буду також вдячний за всі приклади конкретного застосування всяких сильно оптимізують прапорів.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*