Оптимизация с использованием данных профилятора. Часть 2
Давайте посмотрим как это может работать.
Шаг 1: Компилируем программу с несколькими флагами позволяющими сопоставить собранные метрики с исходным кодом:
Шаг 2: Исполняем собранную программу с профилятором:
Шаг 3: Так как perf это внешняя для llvm утилита, нам нужно сконвертировать результат ее работы в формат понятный для компилятора. Для этого в llvm есть утилита
Шаг 4: Перекомпилируем исходную программу с собранной статистикой:
Давайте глянем на собранную статистику профилятора. Для этого в llvm есть другая утилита
Команда выше покажет нам следующее:
Имея эту информацию на руках компилятор может понять что функция bar вызывается намного чаще чем функция foo и проработать эффективнее. Важное замечание: Если сценарий использования программы в реальной жизни резко меняется, то результат сбора PGO данных может повлиять негативно на производительность программы, так что чаще всего в реальной жизни PGO данные пере-собираются в реальном времени.
В следующей части я попробую собрать сам clang вместе и без PGO и сравню производительность сборки какого нибудь примера.
На последок видео о котором я говорил в начале: https://www.youtube.com/watch?v=3RtMMHkVsDg
Давайте посмотрим как это может работать.
Шаг 1: Компилируем программу с несколькими флагами позволяющими сопоставить собранные метрики с исходным кодом:
clang++ -O2 -gline-tables-only -fdebug-info-for-profiling -funique-internal-linkage-names sample.cc -o sample
Шаг 2: Исполняем собранную программу с профилятором:
sudo perf record -b -e BR_INST_RETIRED.NEAR_TAKEN:uppp ./sample 1
Шаг 3: Так как perf это внешняя для llvm утилита, нам нужно сконвертировать результат ее работы в формат понятный для компилятора. Для этого в llvm есть утилита
llvm-profgen:llvm-profgen --binary=./sample --output=sample.prof --perfdata=perf.data
Шаг 4: Перекомпилируем исходную программу с собранной статистикой:
clang++ -O2 -fprofile-sample-use=sample.prof sample.cc -o sample_pgo
Давайте глянем на собранную статистику профилятора. Для этого в llvm есть другая утилита
llvm-profdata которая позволяет объединять статистики, смотреть их содержимое и многое другое:llvm-profdata show --sample sample.prof
Команда выше покажет нам следующее:
Function: main: 1965000, 0, 7 sampled lines
Samples collected in the function's body {
…
6: 82500, calls: _Z3bari:82500
…
}
Имея эту информацию на руках компилятор может понять что функция bar вызывается намного чаще чем функция foo и проработать эффективнее. Важное замечание: Если сценарий использования программы в реальной жизни резко меняется, то результат сбора PGO данных может повлиять негативно на производительность программы, так что чаще всего в реальной жизни PGO данные пере-собираются в реальном времени.
В следующей части я попробую собрать сам clang вместе и без PGO и сравню производительность сборки какого нибудь примера.
На последок видео о котором я говорил в начале: https://www.youtube.com/watch?v=3RtMMHkVsDg
YouTube
How Profile-Guided Optimization Makes Your Code Faster Without Any Code Changes - Stephan Dollberg
#Programming #Cpp #CppOnSea
2021 Program: https://cpponsea.uk/2021/schedule/
C++ On Sea Website: https://cpponsea.uk/
C++ On Sea Twitter: https://twitter.com/cpponsea
Streamed & Edited By Digital Medium Ltd: https://events.digital-medium.co.uk
-----…
2021 Program: https://cpponsea.uk/2021/schedule/
C++ On Sea Website: https://cpponsea.uk/
C++ On Sea Twitter: https://twitter.com/cpponsea
Streamed & Edited By Digital Medium Ltd: https://events.digital-medium.co.uk
-----…
🔥7