Вопрос

Кто-нибудь знает эту функцию компилятора?Похоже, GCC поддерживает это.Как это работает?Каков потенциальный выигрыш?В каком случае это хорошо?Внутренние петли?

(этот вопрос конкретный, а не об оптимизации в целом, спасибо)

Это было полезно?

Решение

Это работает путем размещения дополнительного кода для подсчета количества обращений к каждому кодовому пути.При повторной компиляции компилятор использует полученные знания о выполнении вашей программы, о которых раньше он мог только догадываться.Есть пара вещей, над которыми PGO может работать:

  • Решение о том, какие функции должны быть встроены, а какие нет, зависит от того, как часто они вызываются.
  • Принятие решения о том, как разместить подсказки о том, какую ветвь инструкции "if" следует спрогнозировать, основываясь на проценте вызовов, идущих в ту или иную сторону.
  • Решение о том, как оптимизировать циклы, основано на том, сколько итераций выполняется при каждом вызове этого цикла.

Вы никогда по-настоящему не узнаете, насколько эти штуки могут помочь, пока не протестируете их.

Другие советы

PGO увеличивает скорость примерно на 5% при компиляции x264, проекта, над которым я работаю, и у нас есть встроенная система для этого (make fprofiled).Это хорошее бесплатное повышение скорости в некоторых случаях и, вероятно, больше помогает в приложениях, которые, в отличие от x264, в меньшей степени состоят из рукописной сборки.

Совет Джейсона в самый раз.Лучшее ускорение, которое вы получите, достигается за счет "обнаружения" того, что вы допускаете O (n2) алгоритм проскальзывает куда-то во внутренний цикл, или что вы можете кэшировать определенные вычисления вне дорогостоящих функций.

По сравнению с микрооптимизациями, которые может инициировать PGO, это большие выигрыши.Как только вы выполните оптимизацию такого уровня, PGO, возможно, сможет вам помочь.Однако нам никогда особо не везло с этим - стоимость инструментария была такова, что наше приложение стало неприемлемо медленным (на несколько порядков).

Мне нравится использовать Intel VTune в качестве профилировщика прежде всего потому, что он неинвазивен по сравнению с инструментальными профилировщиками, которые слишком сильно меняют поведение.

Самое интересное в оптимизации то, что прирост скорости достигается в самых неожиданных местах.

Это также причина, по которой вам нужен профилировщик, вместо того чтобы гадать, где кроются проблемы со скоростью.

Я рекомендую начать с профилировщика (gperf если вы используете GCC) и просто начните просматривать результаты запуска вашего приложения с помощью некоторых обычных операций.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top