The presentation deals with the practical examples of the optimization levels in the context of the C++ language features and dwell upon the data-oriented design evaluation methods.
The presentation materials were co-authored with Oleksandr Markov (Senior Software Engineer, Consultant, GlobalLogic, Kharkiv) and was delivered by Oleksandr Antsyferov (Senior Software Engineer, Consultant, GlobalLogic, Kharkiv) at GlobalLogic Kharkiv C++ TechTalk #1 on May 16, 2018.
3. 4
Порядок обхода матрицы
• Задействовано одинаковое количество
памяти
• Одинаковое количество операций
• Разница в производительности в 15 раз
4. 5
Вопросы
• Справедливо ли это утверждение?
• Какой процент производительности должен меня интересовать?
• Каковы причины такой разницы в производительности?
• Влияют ли эти причины на другие аспекты работы продукта?
7. 8
Вопросы
• Справедливо ли это утверждение?
• Какой процент производительности должен меня интересовать?
• Каковы причины такой разницы в производительности?
• Влияют ли эти причины на другие аспекты работы продукта?
9. 1010
“We should forget about small
efficiencies, say about 97% of the
time: premature optimization is the
root of all evil. Yet we should not
pass up our opportunities in that
critical 3% statement)”
Knuth, Donald (December 1974)
10. 1111
“In established engineering
disciplines a 12% improvement,
easily obtained, is never considered
marginal and I believe the same
viewpoint should prevail in software
engineering”
Knuth, Donald (December 1974)
11. 12
Вопросы
• Справедливо ли это утверждение?
• Какой процент производительности должен меня интересовать?
• Каковы причины такой разницы в производительности?
• Влияют ли эти причины на другие аспекты работы продукта?
12. 13
Векторизация
• Плюсы
- повышение
производительности
• Минусы
- не все алгоритмы подходят
для векторизации
- зачастую требует ручного
труда программиста
- завязана на целевую
архитектуру и может
требовать нескольких
альтернативных реализаций
13. 14
Векторизация
• Оптимизирующие компиляторы делают автоматическую векторизацию
по мере своих способностей
• Использовать директивы компилятора для указания мест подлежащих
автоматической векторизации
• Использовать флаги компиляции для получения сообщений отладки о
результатах автоматической векторизации
• Писать алгоритмы используя встроенные функции компилятора или
ассемблерные вставки
21. 22
Вопросы
• Справедливо ли это утверждение?
• Какой процент производительности должен меня интересовать?
• Каковы причины такой разницы в производительности?
• Влияют ли эти причины на другие аспекты работы продукта?
27. 28
Пространственная локальность
• Предсказуемое расположение данных в памяти
• Предсказуемое расположения исполняемого кода в памяти
• Оптимальное использования системы кэширования центрального
процессора
28. 29
Проблемы объектно-ориентированный подход
• Поощряет создание иерархии классов удобных для понимания
программистом
• Приводит к неоптимальной пространственной локальности данных в
связи с тем что порядок объявления полей класса напрямую влияет на
их порядок в памяти
• Сосредотачивает исходный код вокруг данных вместо программного.
29. 30
Данно-ориентированный дизайн (DOD)
• Рассматривать программный продукт, как сущность решающую задачу
трансформации данных
• Пространственная локальность данных в памяти выходит на первый план
• Статистические характеристики данных учитываются при их переборе и
трансформации
• Код пишется для наиболее вероятного случая согласно решаемой
задачи в предметной области
34. 35
Итоги
• Рассматривать линейный массив или комбинацию линейных массивов,
как первый вариант при выборе контейнеров
• Использовать максимальное количество данных попавших в кэш линию
• Следить за отсутствием False Sharing
35. 36
Итоги
• Следить за тем, что исполняемый код помещается в кэш инструкции
- чем может мешать перебор коллекции с вызовом виртуальных функций членов
класса
• Быстрые пути выполнения кода без проверок
- срезать медленные пути выполнения до вхождения в “быстрый” путь
• Profiler guided optimization