| lynoxod ( @ 2009-04-22 10:30:00 |
Похоже, проект я закончил. Так что можно и побухтеть.
Сегодня речь пойдёт о компилируемых языках и отчётах компилятора.
Если вы хотите сделать ваше приложение быстрее, не спешите натравливать на него профилировщик. И даже не думайте лезть в ассемблер. Для начала ваш главный друг и помощник - компилятор. Это именно тот инструмент, который может менять производительность вашей программы в разы. Сегодня у нас будет курс ускоренного бойца по поводу как готовить компилятор 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)+почему не смог векторизовать.
Сегодня речь пойдёт о компилируемых языках и отчётах компилятора.
Если вы хотите сделать ваше приложение быстрее, не спешите натравливать на него профилировщик. И даже не думайте лезть в ассемблер. Для начала ваш главный друг и помощник - компилятор. Это именно тот инструмент, который может менять производительность вашей программы в разы. Сегодня у нас будет курс ускоренного бойца по поводу как готовить компилятор 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)+почему не смог векторизовать.