оптимизация с учетом профиля (C)
-
09-06-2019 - |
Вопрос
Кто-нибудь знает эту функцию компилятора?Похоже, GCC поддерживает это.Как это работает?Каков потенциальный выигрыш?В каком случае это хорошо?Внутренние петли?
(этот вопрос конкретный, а не об оптимизации в целом, спасибо)
Решение
Это работает путем размещения дополнительного кода для подсчета количества обращений к каждому кодовому пути.При повторной компиляции компилятор использует полученные знания о выполнении вашей программы, о которых раньше он мог только догадываться.Есть пара вещей, над которыми PGO может работать:
- Решение о том, какие функции должны быть встроены, а какие нет, зависит от того, как часто они вызываются.
- Принятие решения о том, как разместить подсказки о том, какую ветвь инструкции "if" следует спрогнозировать, основываясь на проценте вызовов, идущих в ту или иную сторону.
- Решение о том, как оптимизировать циклы, основано на том, сколько итераций выполняется при каждом вызове этого цикла.
Вы никогда по-настоящему не узнаете, насколько эти штуки могут помочь, пока не протестируете их.
Другие советы
PGO увеличивает скорость примерно на 5% при компиляции x264, проекта, над которым я работаю, и у нас есть встроенная система для этого (make fprofiled).Это хорошее бесплатное повышение скорости в некоторых случаях и, вероятно, больше помогает в приложениях, которые, в отличие от x264, в меньшей степени состоят из рукописной сборки.
Совет Джейсона в самый раз.Лучшее ускорение, которое вы получите, достигается за счет "обнаружения" того, что вы допускаете O (n2) алгоритм проскальзывает куда-то во внутренний цикл, или что вы можете кэшировать определенные вычисления вне дорогостоящих функций.
По сравнению с микрооптимизациями, которые может инициировать PGO, это большие выигрыши.Как только вы выполните оптимизацию такого уровня, PGO, возможно, сможет вам помочь.Однако нам никогда особо не везло с этим - стоимость инструментария была такова, что наше приложение стало неприемлемо медленным (на несколько порядков).
Мне нравится использовать Intel VTune в качестве профилировщика прежде всего потому, что он неинвазивен по сравнению с инструментальными профилировщиками, которые слишком сильно меняют поведение.
Самое интересное в оптимизации то, что прирост скорости достигается в самых неожиданных местах.
Это также причина, по которой вам нужен профилировщик, вместо того чтобы гадать, где кроются проблемы со скоростью.
Я рекомендую начать с профилировщика (gperf
если вы используете GCC) и просто начните просматривать результаты запуска вашего приложения с помощью некоторых обычных операций.