lynoxod ([info]lynoxod) wrote,
@ 2009-04-22 10:30:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Похоже, проект я закончил. Так что можно и побухтеть.

Сегодня речь пойдёт о компилируемых языках и отчётах компилятора.

Если вы хотите сделать ваше приложение быстрее, не спешите натравливать на него профилировщик. И даже не думайте лезть в ассемблер. Для начала ваш главный друг и помощник - компилятор. Это именно тот инструмент, который может менять производительность вашей программы в разы. Сегодня у нас будет курс ускоренного бойца по поводу как готовить компилятор Intel С++.
(Если вдруг кто заинтересуется, можно будет и про gcc и ms' рассказать, но при условии, что заинтересовавшийся сумеет объяснить, зачем ему это:)

 Итак, в какой-то момент вы осознали что "всё тормозит".

Тут, по-хорошему, должен быть абзац о том, как в этом убедиться, как выделить проблему и сформулировать цели. Это шаг номер ноль. Но не в этот раз.

Первым шагом будет откомпилироваться Intel'овским компилятором. (Где взять - это каждый решает сам%, как заинтегрировать в VS или Eclipse написано в гугле и на интеловском сайте). Маркетологи утверждают, что по их опросникам получается, что для половины пользователей, сделавших этот шаг на пути увеличения производительности их программ, он становится последним. Скорость работы становится достаточной. Не силён комментировать. Для AMD, как ни странно, тоже имеет смысл. (Про это можно говорить отдельно).

Шаг второй. Если всё ещё медленно, пробуем подстроить компилятор под задачу.
Компилятор сложная, большая и умная программа. Её писало много часов много людей, которые много знают о том, как работают процессоры, какие оптимизации умеет современный compute science. При этом пользователю предоставляется множество ручек настройки.
Они как-то разведены в графических интерфейсах, но в любой IDE есть поле, куда можно просто дописать ключи компиляции. Всего ключей много, большинство описано в ДОКУМЕНТАЦИИ. Мне её пересказывать неинтересно.

Для тех, кому сильно лениво:)
Полезно хотя бы знать что есть агригрированные ключи, упровляющие оптимизацией "в общем"
(это в линуксовой нотации, для винды <-> заменять на </>)
Есть Уровень оптимизации.
     -О0  --  оптимизации отключены, включается при отладке
     -О1  --  оптимизация по размеру, бывает полезно, например, для БД
     -О2  --  уровень оптимизации по умолчанию
     -О3  --  добавляет еще немного оптимизаций циклов и математики к О2
     -xO  -  оптимизация под неинтелловскую архитектуру
    Каждая из этих опций (кроме О0) включает множество оптимизаций, таких как
    векторизация, инлайнинг, раскрутка циклов, вынос инвариантов и многие другие.
    Еще есть собирательная опция
    -fast -- её значение может меняться с версией компилятора, но когда я
    последний раз смотрел, "-fast" означало "-O3 -ipo -xP"

 
Понятно, что это лишь поверхность. Ручек тонкой настройки много и они неспроста. Но они влияют на код не столь драматично как О3 против О0. Сейчас посмотрел старые папки, самая длинная строка компиляции содержала 12 ключей компилятору и две линкеру. Это давало +11% к чистому О3 на приложении. (Пример может быть не очень показательным, но порядок примерно такой. Другое дело, что есть области где и 1% стоит больших денег).

Есть еще директивы компилятору и интринсики. Но не в этот раз.

В этот немного про отчёты компиляции.

Волшебные ключики -opt-report (/Qopt-report для Windows). Опция включает печать отчётов на stderr. Можно указать уровень детализации от 1 до 3. Можно stderr перенаправлять, можно использовать -opt-report-file (/Qopt-report-file).

С помощью -opt-report-phase можно указать для какой фазы надо отчёт. Фаз много. Для начала полезными могут быть
            hlo        -- High Level Optimizer - всякие оптимизации циклов и памяти,
            hpo       -- тут расскажут про векторизацию и параллелизацию,
            ipo_inl  -- про инлайнинг
(имя фазы пишется без пробела, слитно с ключом)

Подробности можно узнать по ключу -opt-report-help (/Qopt-report-help) - расскажет о всех публичных фазах.

Удобно использовать -opt-report-routine name для того, что бы отчёт генерировался только для функций с подстрокой name в имени.

Для векторизации есть отдельный ключ -vec-report [n].
n устанавливает болтливость: 0 - молчать, 1 - говорить что смог векторизовать, 2 - (1)+что не смог, 3 - (2)+почему не смог векторизовать.



(8 comments) - (Post a new comment)


[info]gati
2009-04-22 07:24 am UTC (link)
>(имя фазы пишется без пробела, слитно с ключом)

для такого лучше пример реального ключа добавить.
А то не совсем понятно.

(Reply to this) (Thread)


[info]lynoxod
2009-04-23 02:44 am UTC (link)
Дейвствительно. Чтобы там не править, напишу тут:
f.e. /Qopt-report-phasehlo

(Reply to this) (Parent)


[info]sim0nsays
2009-04-22 05:44 pm UTC (link)
Про директивы компилятору хочу.
И практических примеров, мол, вот мы оптимизяли такую-то поебень, сделали N (вот столько процентов бонуса), а потом M и L (еще столько-то).

Ну и фраза

Маркетологи утверждают, что по их опросникам получается, что для половины пользователей, сделавших этот шаг на пути увеличения производительности их программ, он становится последним.

Конечно, шедевральна, спасибо :)

(Reply to this) (Thread)


[info]lynoxod
2009-04-23 02:42 am UTC (link)
:)
Про директивы - ага, расскажу как-нибудь.

С примерами сложнее "было приложение, сто мегабайт кода, заставили компилироваться, вычистили десяток багов автоматическими средствами, еще десяток по ходу работы в рукопашную.
Сняли профили. Посмотрели параллелизацию на уровне задач/данных. Переделали схему межпроцессорной параллелизации, сделали нормальный баланс и синхронизацию. Провалидировали.
Перешли к тому, что творится на одной ноде. Посмотрели в чём проблемы, порешали их:) (Пару опций компилятору про плавающую точку, директивами чего-нибудь подсказали, переписали/навтыкали/поубирали параллелизацию на уровне циклов, бывало алгоритмы переделывать приходилось).
Опять общие профили чтоб проверить, не перекосили ли мы общую работу ускорением однопроцессорной работы.

До кодогенерации в таких задачах не опускались, обычно. Максимум файлили пару трекеров на компилятор. (Это если можно исходники править:)

Ну вот и раскрыл все секреты:)

(Reply to this) (Parent)


[info]egorick
2009-04-25 11:20 pm UTC (link)
ааааа, шедевр)))

Никит, ну как не стыдно так вводить людей в заблуждение, а? :) Розовых облаков нарисовал, шо просто утонуть можно))

(Reply to this) (Parent)(Thread)


[info]lynoxod
2009-04-27 06:55 am UTC (link)
Ты про маркетологов?
Не, серъезно. Сам слышал.
(они же не уточняли, может эти 50% поняли что это бесперспективно, или это специально подобранные 50%, которым сказали а вот смотрите как круто и они прониклись. Ну в общем, _я_ не вру%)

(кстати, об розовых - cloud computing нынче модно, говорят:)

(Reply to this) (Parent)(Thread)


[info]egorick
2009-04-27 07:18 am UTC (link)
ага, модно, только каждый под этим понимает что-то сугубо своё и разводит всякие спекуляции :)

(Reply to this) (Parent)(Thread)


[info]lynoxod
2009-04-29 03:30 am UTC (link)
Вот по этому и модно:)

(Reply to this) (Parent)


(8 comments) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…