Как PGO применяются к исходному коду? Как это влияет на CFG?

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

Я имею в виду, что если вы включите оптимизацию PGO в GCC или CLang, например, то будут применены все оптимизации (Inlining, Virtual Call Speculation, Separa Code Separation и т. Д.), Верно!?

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

Итак, могут ли они изменить CFG (график потока управления) до такой степени, что некоторые частоты базового блока будут потеряны?

Например, если PGO с именем "B" применяется после PGO с именем "A", и "A" изменил исходный код, так что некоторые частоты базовых блоков теряются, как применяется "B" (при условии, что оба являются PGO что зависит от частот BB)?

(Извините за мой плохой английский)

1 ответ

Решение

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

Целью PGO является повышение эффективности традиционных оптимизаций, включая встраивание, спекуляцию виртуальными вызовами и редко выполняемое разделение кода. Таким образом, они все еще применяются. Вы правильно догадались, они применяются в некотором последовательном порядке.

Некоторые из этих оптимизаций изменяют CFG кода. Однако компилятор отслеживает исходные базовые блоки, которые были профилированы, даже если их расположение в промежуточном коде изменилось. В PGO компилятор никогда не удаляет основные блоки. Однако компилятор может либо оставить базовый блок таким же, изменить его местоположение, развернуть базовый блок более чем в один базовый блок или вставить новые базовые блоки. Что бы он ни делал, он отслеживает исходные профилированные базовые блоки и их статистику выполнения, чтобы дальнейшая оптимизация знала, как использовать профиль. Если был вставлен новый базовый блок, он будет оптимизирован в обычном режиме без использования профиля.

Другие вопросы по тегам