More Related Content
Similar to Soft labs. достижима ли в c++ эффективность языка среднего уровня
Similar to Soft labs. достижима ли в c++ эффективность языка среднего уровня (20)
More from LuxoftTraining (20)
Soft labs. достижима ли в c++ эффективность языка среднего уровня
- 1. DevLabs
Достижима ли в C++
эффективность языка
«среднего уровня»?
© Luxoft Training 2013
Алексей Петров
education@luxoft.com
1
- 4. Разрешите представиться
Алексей Петров — тренер и консультант, экспертпрактик в области информационного обеспечения
автоматизированных систем, архитектуры и
разработки программного обеспечения на языках
высокого уровня:
1998 — первая программа на C++
2009 — первый тренинг по C++
2012 — начало сотрудничества с Luxoft Training
© Luxoft Training 2013
и НИУ МГТУ им. Н.Э. Баумана
4
- 5. О чем пойдет речь?
C++ сегодня. Соображения эффективности
Кэш-память в архитектуре ЭВМ: зачем и что делать?
Пример оптимизации кода по производительности
© Luxoft Training 2013
Основные направления оптимизации исходного кода
5
- 6. Неформальное введение. C++ сегодня
Актуальное состояние:
Наработанная десятилетиями мощная кодовая база —
требует решения «сопровождать или переписывать»
Поддержка C++ нескольких парадигм программирования
Активное использование языков C / C++ в практике
программирования высокопроизводительных приложений
Неослабевающий интерес индустрии и популярность языка
среди разработчиков — 3 – 4-е место в TIOBE Index c 2001 г.
© Luxoft Training 2013
Перспективы:
Предсказуемое поступательное развитие языка —
стандарты C++11 / C++14 / C++17
Ожидаемое внедрение полноценных средств поддержки
параллельных вычислений, работы с дисковыми, сетевыми
ресурсами и т.д.
6
- 7. Соображения эффективности
C++ — компилируемый язык:
сохранивший эффективность своего C-подмножества:
более эффективный, чем языки с промежуточной
трансляцией и интерпретируемые языки.
В активе C++ — множество оптимизирующих
компиляторов для основных программноаппаратных платформ:
GCC: g++;
Intel® Composer XE Suites: Intel® C++ Compiler и др.
© Luxoft Training 2013
Язык и инструментальные средства позволяют
писать код эффективно.
7
- 9. Кэш-память в архитектуре
современных ЭВМ: зачем?
Проблема:
многократное отставание системной
шины [и модулей оперативной памяти
(DRAM)] от ядра ЦП по внутренней
частоте; простой ЦП.
Решение:
включение в архитектуру небольших
модулей сверхоперативной памяти
(SRAM), полностью контролируемой
ЦП (не пользователем и ОС!).
© Luxoft Training 2013
Условия эффективности:
локальность данных и кода в
пространстве-времени.
Схема организации кэш-памяти:
см. рис.
9
- 10. Кэш-память в архитектуре
современных ЭВМ: что делать?
Обеспечивать локальность данных и кода в
пространстве и времени:
совместно хранить совместно используемые данные или код;
не нарушать эмпирические правила написания эффективного
исходного кода.
© Luxoft Training 2013
Обеспечивать эффективность загрузки кэшпамяти данных и кода:
полагаться на оптимизирующие возможности компилятора;
помогать компилятору в процессе написания кода.
Знать основы организации аппаратного обеспечения.
Экспериментировать!
10
- 11. Пример: постановка задачи
Задача. Рассчитать сумму
столбцов заданной
целочисленной матрицы.
Оптимизировать
найденное решение с
точки зрения загрузки кэшпамяти данных.
Найти:
Варианты решения:
❶
© Luxoft Training 2013
Дано:
❷
или
11
- 12. Пример: порядок анализа вариантов
Размерность задачи:
набор данных: 28 x 28 (216 элементов, 218 байт);
количество тестов: 100;
выбираемое время: минимальное.
Инфраструктура тестирования:
x86: Intel® Core™ i5 460M, 2533 МГц, L1d: 2 x 32 Кб;
x86-64: AMD® E-450, 1650 МГц, L1d: 2 x 32 Кб / ядро;
ОС: Ubuntu Linux 12.04 LTS; компилятор: GCC 4.8.x.
Порядок обеспечения независимости тестов —
2-фазная программная инвалидация памяти L1d:
последовательная запись массива (106 элементов, ≈222 байт);
рандомизированная модификация элементов.
© Luxoft Training 2013
12
- 14. Пример: результаты оптимизации
Время решения задачи за счет оптимизации обхода
данных (без применения SSE-расширений)
снижается в 2 – 3 раза:
для ЦП Intel x86: от 1,5 до 2,2 раза;
для ЦП AMD x86-64: от 1,8 до 3,8 раза.
При компиляции с флагами -О0, -O1 результат
характеризуется высокой повторяемостью на ЦП с
выбранной архитектурой (Intel x86 / AMD x86-64):
относительный рост эффективности колеблется в пределах
20 – 25%%.
© Luxoft Training 2013
Применение векторных SIMD-инструкций из наборов
команд SSE, SSE2, SSE3 позволяет улучшить
полученный результат еще на 15 – 20%%.
14
- 15. Почему оптимизация работы с кэш-памятью
того стоит?
Несложная трансформация вычислительноемких
фрагментов кода позволяет добиться серьезного
роста скорости выполнения.
разбиение на квадраты (англ. square blocking) и пр.
Причина — высокая «стоимость» кэш-промахов:
на рис. — оценки для одного из ЦП Intel.
© Luxoft Training 2013
ЦП @ 3 ГГц:
1 такт ≈ 0,33 нс → 10 см
15
- 16. Преимущества встроенного замера
времени. Реализация класса-таймера
Преимущества встроенного
замера:
полный контроль над запуском и
© Luxoft Training 2013
остановом таймеров, счетчиков;
минимальные накладные расходы;
более надежные результаты;
возможность получения
результатов, не достижимых
стандартными инструментами.
Timer::Timer() : _start_time(0L), _end_time(0L),
if(!_scheduled) {
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(0, &mask);
_total_time(0L), _min_time(0L) {
// attach this (NULL) process to CPU #0
_scheduled = (sched_setaffinity((pid_t)NULL, sizeof(mask), &mask) == 0);
}
}
16
- 18. Основные направления оптимизации
Предсказание переходов:
устранение ветвлений;
развертывание (линеаризация) циклов;
встраивание функций (методов) и др.
Критические секции:
устранение цепочек зависимости для внеочередного
исполнения инструкций;
использование поразрядных операций, INC (++), DEC (--),
векторизация (SIMD) и т.д.
© Luxoft Training 2013
Обращение к памяти:
выполнение потоковых операций;
выравнивание и упаковка данных и пр.
18
- 19. Выравнивание данных
Вопрос выравнивания:
актуален для переменных простых и составных типов;
актуален для объектов хранения как в стеке функций, так и в
куче процесса.
Проблема: данные выровнены слабее, чем это
необходимо для эффективной загрузки в кэш-память:
длина линии L1d в современных ЦП — 64 байта.
Решение:
принудительное выравнивание: GCC-атрибут aligned в
© Luxoft Training 2013
определении типа или объекта данных и пр.
// выравнивание, регулируемое на уровне объекта
uint64_t qwd __attribute((aligned(64)));
// выравнивание, регулируемое на уровне типа
typedef int __attribute((aligned(128))) al128int_t;
al128int_t aln;
19
- 20. Упаковка переменных составных типов
Вопрос упаковки данных:
характерен для структур (struct) и классов (class);
обусловлен наличием у элементов структур (атрибутов
классов) индивидуальных характеристик выравнивания.
Проблема: смежные (перечисленные подряд, в том
числе на разных уровнях иерархии наследования)
элементы физически не «примыкают» друг к другу.
Причины:
Потери: 4 байта из 32
(13%)
архитектура ЦП (напр., x86
© Luxoft Training 2013
или x86-64);
оптимизирующие действия
компилятора;
выбранный программистом
typedef struct {
// для x86
int
id;
// 4 байта
char
name[15]; // 15 байт
double
amount;
// 8 байт
bool
active;
// 1 байт
} account;
// 28 байт (не 32 байта!)
порядок следования элементов.
20
- 21. Реорганизация структур данных
Направления:
декомпозиция типов данных на более мелкие, которые при
Желательно:
переносить наиболее востребованные элементы структуры
© Luxoft Training 2013
решении задачи используются полностью либо не
используются вообще;
устранение лакун, обусловленных характеристиками
выравнивания типов их элементов.
(класса) к началу;
обходить структуру в порядке определения элементов, если
иное не требуется задачей или прочими обстоятельствами.
Недостатки:
снижение удобства чтения и сопровождения кода;
риск размещения совместно используемых элементов на
разных линиях кэш-памяти.
21
- 22. Устранение ветвлений
Проблема:
статистическое смещение условия в ложную сторону;
нелинейное исполнение кода;
загрязнение кэш-памяти L1i неиспользуемым кодом;
трудности с предсказанием переходов.
Желательно:
изымать реже исполняемый код с основного вычислительного
© Luxoft Training 2013
пути;
реорганизовать блоки так, чтобы в заголовке операторов
фигурировала проверка на более вероятный исход, а среди
операндов логической операции первыми следовали более
предсказуемые, для && — ложные, для || — истинные.
Альтернативные решения:
использование функции __builtin_expect и др.
22
- 23. Встраивание функций и методов
Преимущества:
способность компилятора оптимизировать бóльшие кодовые
фрагменты;
порождаемый код способен лучше задействовать
конвейерную микроархитектуру ЦП.
Недостатки:
увеличение объема кода и бóльшая нагрузка на кэш-память
команд всех уровней (L1i, L2i, …);
возможное общее снижение производительности.
© Luxoft Training 2013
Желательно:
всегда встраивать функции, вызываемые однократно;
избегать встраивания функций, многократно вызываемых из
разных точек программы.
23
- 24. Выводы
Язык C++ не уступает в эффективности
«родительскому» языку C
Грамматика современных диалектов C++ и ее
расширения переносимыми компиляторами (напр.
GCC) позволяют выражать тонкие аспекты работы с
памятью на всех уровнях
© Luxoft Training 2013
Правильное использование прагматики языка
позволяет добиться серьезной оптимизации кода, на
которую самостоятельно не способны современные
компиляторы (иногда ограниченные в действиях
стандартом на язык программирования)
24
- 25. Дополнительные материалы и информация
Автор выражает благодарность за участие в подготовке материалов
г-же Эльвире Джураевой (кафедра «Системы обработки
информации и управления», Московский государственный
технический университет им. Н.Э. Баумана).
При подготовке презентации использовались:
1. AMD E-Series E-450 specifications. URL: http://www.cpuworld.com/CPUs/Bobcat/AMD-E%20Series%20E-450.html
© Luxoft Training 2013
2. Intel® Developer Zone: Intel® Composer XE Suites. URL:
http://software.intel.com/ru-ru/intel-composer-xe
3. Standard C++: Current Status. URL: http://isocpp.org/std/status
4. TIOBE Index for December 2013. URL:
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
25
- 26. © Luxoft Training 2013
Рекомендуемая литература
1. Drepper, U. What Every Programmer Should Know About Memory
(Nov. 2007). — Имеется русский перевод: http://ruslinux.net/lib.php?name=/MyLDP/hard/memory/memory.html
2. Fog, A. Optimizing Software in C++: An Optimization Guide for
Windows, Linux and Mac platforms (Oct. 2013). URL:
http://www.agner.org/optimize/optimizing_cpp.pdf
3. Goedecker, S., Hoisie, A. Performance Optimization of Numerically
Intensive Codes (SIAM, 2001).
4. Intel® 64 and IA-32 Architectures Optimization Reference Manual
(July 2013). URL:
http://www.intel.com/content/dam/www/public/us/en/documents/manu
als/64-ia-32-architectures-optimization-manual.pdf
5. Wise, D.S., Frens, J.D. Auto-Blocking Matrix-Multiplication or Tracking
BLAS3 Performance from Source Code. In Proc. 1997 ACM Symp. on
Principles and Practice of Parallel Programming, SIGPLAN Not. 32, 7
(July 1997), 206-216.
26
- 29. Информационные ресурсы Luxoft Training
Внутренние ресурсы
Расписание, ку
рсы, тренеры IntHR
Luxtown
Условия
обучения, л
Luxtown
огистика, ко
нтакты
Информация об учебном центре
www.luxoft-training.ru/about
Расписание
www.luxoft-training.ru/timetable
Каталог курсов
www.luxoft-training.ru/training/catalog_directions
Контакты
© Luxoft Training 2013
www.luxoft-training.ru/contacts
www.facebook.com/TrainingCenterLuxoft
29
Editor's Notes
- Первый слайд всего курса.
- *Слайд опционаленДля модуля, который представляет отдельную презентацию (т.е. читается в отдельный день)
- *Слайд опционаленДля презентации, содержащей несколько модулей (т.е. разделитель частей презентации)
- *Слайд опционаленДля презентации, содержащей несколько модулей (т.е. разделитель частей презентации)
- *Слайд опционаленДля презентации, содержащей несколько модулей (т.е. разделитель частей презентации)