Разворачивание циклов. Вместо итерирования по 1 шагу, можно сделать итерирование через 1, но на каждой итерации обрабатывать i-ую и i+1-ую операцию. В векторицации этот подход развернулся ещё больше.
Высокоуровневый оптимизатор (high level) часть компилятора, которая задействуется при достаточно высоком уровне оптимизации (3, 4). Ориентирован на максимальную скорость исполнения.
Проводится на 2ух уровнях:
- На уровне компиляции исходных файлов в объектные (пример: встраивание ф-ций)
- На уровне связывания нескольких объектных файлов в исполняемый (пример: исключение функций; чтобы не включать всю стандартную библиотеку языка, происходит связывание только с используемыми участками кода)
Для GCC: -fipa-***
в межпроцедурном анализе много опций.
На этапе компиляции мало данных, но если запустить, то можно собрать информацию в виде статистики.
Сборка разбивается на несколько этапов:
- Инструментальная компиляция, в итоге поражается файл который при выполнении будет записывать профиль своей работы. Важно запускать файл в тех условиях, когда производительность особо важна (репрезентативность и релевантность собранных данных).
- Запуск приложения и сбор профиля. Профиль это двоичный файл, содержимое которого определяет компилятор. Он содержит статистические данные по работе кода.
- Выполняем компиляцию и компоновку "с обратной связью", т.е. на вход подаются исходники и профиль.
PGO позволяет выявить ,блокирующую операцию загрузки данных и выполнить эту операцию спекулятивно (__builtin_prefetch
). Если не угадать с типичными данными, подобная операция может приводить к тому, что полезные данные вытесняются из кэша бесполезными.
Ключи компилятора (gcc):
-fprofile-generate
-fprofile-use
Мутаторы -- инструмент кода для сбора статистики изнутри приложения.
Системные методы оптимизации:
- векторизация
- оптимизация высокого уровня
- межпроцедурная оптимизация
- ведомая профилем оптимизация (можем не угадать с данными)