1 © L
uxof
t Tra
inin
g 20
13
Алексей Петров
Достижима ли в C++ эффективность языка
«среднего уровня»?
DevLabs
2 © L
uxof
t Tra
inin
g 20
13
Достижима ли в C++ эффективность языка «среднего уровня»?
Алексей Петров
DevLabs
3 © L
uxof
t Tra
inin
g 20
13
Введение
4 © L
uxof
t Tra
inin
g 20
13
Разрешите представиться
Алексей Петров — тренер и консультант, эксперт-практик в области информационного обеспечения автоматизированных систем, архитектуры и разработки программного обеспечения на языках высокого уровня: 1998 — первая программа на C++
2009 — первый тренинг по C++
2012 — начало сотрудничества с Luxoft Trainingи НИУ МГТУ им. Н.Э. Баумана
5 © L
uxof
t Tra
inin
g 20
13
О чем пойдет речь?
C++ сегодня. Соображения эффективности
Кэш-память в архитектуре ЭВМ: зачем и что делать?
Пример оптимизации кода по производительности
Основные направления оптимизации исходного кода
6 © L
uxof
t Tra
inin
g 20
13
Неформальное введение. C++ сегодня
Актуальное состояние: Наработанная десятилетиями мощная кодовая база —
требует решения «сопровождать или переписывать»
Поддержка C++ нескольких парадигм программирования
Активное использование языков C / C++ в практике программирования высокопроизводительных приложений
Неослабевающий интерес индустрии и популярность языка среди разработчиков — 3 – 4-е место в TIOBE Index c 2001 г.
Перспективы: Предсказуемое поступательное развитие языка —
стандарты C++11 / C++14 / C++17
Ожидаемое внедрение полноценных средств поддержки параллельных вычислений, работы с дисковыми, сетевыми ресурсами и т.д.
7 © L
uxof
t Tra
inin
g 20
13
Соображения эффективности
C++ — компилируемый язык: сохранивший эффективность своего C-подмножества:
более эффективный, чем языки с промежуточной трансляцией и интерпретируемые языки.
В активе C++ — множество оптимизирующих компиляторов для основных программно-аппаратных платформ: GCC: g++;
Intel® Composer XE Suites: Intel® C++ Compiler и др.
Язык и инструментальные средства позволяют писать код эффективно.
8 © L
uxof
t Tra
inin
g 20
13
Кэш-память процессорав архитектуре… и в C++
9 © L
uxof
t Tra
inin
g 20
13
Кэш-память в архитектуресовременных ЭВМ: зачем?
Проблема: многократное отставание системной
шины [и модулей оперативной памяти (DRAM)] от ядра ЦП по внутренней частоте; простой ЦП.
Решение: включение в архитектуру небольших
модулей сверхоперативной памяти (SRAM), полностью контролируемой ЦП (не пользователем и ОС!).
Условия эффективности: локальность данных и кода в
пространстве-времени.
Схема организации кэш-памяти: см. рис.
Оперативная память
Системная шина
Кэш-память3-го уровня
Кэш 2-го уровня
Кэш команд
1го уровня
Кэш данных
1-го уровня
Ядро ЦП,
регистры
10 © L
uxof
t Tra
inin
g 20
13
Кэш-память в архитектуресовременных ЭВМ: что делать?
Обеспечивать локальность данных и кода в пространстве и времени: совместно хранить совместно используемые данные или код;
не нарушать эмпирические правила написания эффективного исходного кода.
Обеспечивать эффективность загрузки кэш-памяти данных и кода: полагаться на оптимизирующие возможности компилятора;
помогать компилятору в процессе написания кода.
Знать основы организации аппаратного обеспечения.
Экспериментировать!
11 © L
uxof
t Tra
inin
g 20
13
Пример: постановка задачи
𝐴= (𝑎𝑖𝑗 )Дано:
Найти: 𝐵=(𝑏 𝑗 )
Варианты решения:
Задача. Рассчитать сумму столбцов заданной целочисленной матрицы. Оптимизировать найденное решение с точки зрения загрузки кэш-памяти данных.
❷❶
или
12 © L
uxof
t Tra
inin
g 20
13
Пример: порядок анализа вариантов
Размерность задачи: набор данных: 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 байт);
рандомизированная модификация элементов.
13 © L
uxof
t Tra
inin
g 20
13
Пример: сравнительнаяэффективность вариантов
-O0
-O1
-O2
-O3
0 500000 1000000 1500000 2000000
1,790,547
1,079,601
1,014,795
1,056,003
980,592
398,505
279,510
279,435
Эффективность вариантов,такты ЦП AMD x86-64
Вариант 2Вариант 1
-O0
-O1
-O2
-O3
0 200000 400000 600000 800000 1000000
932,769
677,245
680,627
662,449
630,553
303,901
302,663
303,769
Эффективность вариантов,такты ЦП Intel x86
Вариант 2Вариант 1
14 © L
uxof
t Tra
inin
g 20
13
Пример: результаты оптимизации
Время решения задачи за счет оптимизации обхода данных (без применения 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%%.
Применение векторных SIMD-инструкций из наборов команд SSE, SSE2, SSE3 позволяет улучшить полученный результат еще на 15 – 20%%.
15 © L
uxof
t Tra
inin
g 20
13
Почему оптимизация работы с кэш-памятью того стоит?
Оперативная память
Кэш-память 2-го уровня
Кэш-память 1-го уровня
Регистровая память
1 10 100
24014
3
1
Время доступа, такты ЦП
Несложная трансформация вычислительноемких фрагментов кода позволяет добиться серьезного роста скорости выполнения. разбиение на квадраты (англ. square blocking) и пр.
Причина — высокая «стоимость» кэш-промахов: на рис. — оценки для одного из ЦП Intel.
ЦП @ 3 ГГц:1 такт ≈ 0,33 нс → 10 см
16 © L
uxof
t Tra
inin
g 20
13
Преимущества встроенного замера времени. Реализация класса-таймера
Преимущества встроенного замера: полный контроль над запуском и
остановом таймеров, счетчиков;
минимальные накладные расходы;
более надежные результаты;
возможность получения результатов, не достижимых стандартными инструментами.
Timer::Timer() : _start_time(0L), _end_time(0L), _total_time(0L), _min_time(0L) { if(!_scheduled) { cpu_set_t mask; CPU_ZERO(&mask); CPU_SET(0, &mask);
// attach this (NULL) process to CPU #0 _scheduled = (sched_setaffinity((pid_t)NULL, sizeof(mask), &mask) == 0); }}
17 © L
uxof
t Tra
inin
g 20
13
Что еще можно оптимизировать?
18 © L
uxof
t Tra
inin
g 20
13
Основные направления оптимизации
Предсказание переходов: устранение ветвлений;
развертывание (линеаризация) циклов;
встраивание функций (методов) и др.
Критические секции: устранение цепочек зависимости для внеочередного
исполнения инструкций;
использование поразрядных операций, INC (++), DEC (--), векторизация (SIMD) и т.д.
Обращение к памяти: выполнение потоковых операций;
выравнивание и упаковка данных и пр.
19 © L
uxof
t Tra
inin
g 20
13
Выравнивание данных
Вопрос выравнивания: актуален для переменных простых и составных типов;
актуален для объектов хранения как в стеке функций, так и в куче процесса.
Проблема: данные выровнены слабее, чем это необходимо для эффективной загрузки в кэш-память: длина линии L1d в современных ЦП — 64 байта.
Решение: принудительное выравнивание: GCC-атрибут aligned в
определении типа или объекта данных и пр.
// выравнивание, регулируемое на уровне объекта uint64_t qwd __attribute((aligned(64)));
// выравнивание, регулируемое на уровне типа typedef int __attribute((aligned(128))) al128int_t; al128int_t aln;
20 © L
uxof
t Tra
inin
g 20
13
Упаковка переменных составных типов
Вопрос упаковки данных: характерен для структур (struct) и классов (class);
обусловлен наличием у элементов структур (атрибутов классов) индивидуальных характеристик выравнивания.
Проблема: смежные (перечисленные подряд, в том числе на разных уровнях иерархии наследования) элементы физически не «примыкают» друг к другу.
Причины: архитектура ЦП (напр., x86
или x86-64);
оптимизирующие действиякомпилятора;
выбранный программистомпорядок следования элементов.
typedef struct { // для x86 int id; // 4 байта char name[15]; // 15 байт double amount; // 8 байт bool active; // 1 байт} account; // 28 байт (не 32 байта!)
Потери: 4 байта из 32 (13%)
21 © L
uxof
t Tra
inin
g 20
13
Реорганизация структур данных
Направления: декомпозиция типов данных на более мелкие, которые при
решении задачи используются полностью либо не используются вообще;
устранение лакун, обусловленных характеристиками выравнивания типов их элементов.
Желательно: переносить наиболее востребованные элементы структуры
(класса) к началу;
обходить структуру в порядке определения элементов, если иное не требуется задачей или прочими обстоятельствами.
Недостатки: снижение удобства чтения и сопровождения кода;
риск размещения совместно используемых элементов на разных линиях кэш-памяти.
22 © L
uxof
t Tra
inin
g 20
13
Устранение ветвлений
Проблема: статистическое смещение условия в ложную сторону;
нелинейное исполнение кода;
загрязнение кэш-памяти L1i неиспользуемым кодом;
трудности с предсказанием переходов.
Желательно: изымать реже исполняемый код с основного вычислительного
пути;
реорганизовать блоки так, чтобы в заголовке операторов фигурировала проверка на более вероятный исход, а среди операндов логической операции первыми следовали более предсказуемые, для && — ложные, для || — истинные.
Альтернативные решения: использование функции __builtin_expect и др.
23 © L
uxof
t Tra
inin
g 20
13
Встраивание функций и методов
Преимущества: способность компилятора оптимизировать бóльшие кодовые
фрагменты;
порождаемый код способен лучше задействовать конвейерную микроархитектуру ЦП.
Недостатки: увеличение объема кода и бóльшая нагрузка на кэш-память
команд всех уровней (L1i, L2i, …);
возможное общее снижение производительности.
Желательно: всегда встраивать функции, вызываемые однократно;
избегать встраивания функций, многократно вызываемых из разных точек программы.
24 © L
uxof
t Tra
inin
g 20
13
Выводы
Язык C++ не уступает в эффективности «родительскому» языку C
Грамматика современных диалектов C++ и ее расширения переносимыми компиляторами (напр. GCC) позволяют выражать тонкие аспекты работы с памятью на всех уровнях
Правильное использование прагматики языка позволяет добиться серьезной оптимизации кода, на которую самостоятельно не способны современные компиляторы (иногда ограниченные в действиях стандартом на язык программирования)
25 © L
uxof
t Tra
inin
g 20
13
Дополнительные материалы и информация
Автор выражает благодарность за участие в подготовке материалов г-же Эльвире Джураевой (кафедра «Системы обработки информации и управления», Московский государственный технический университет им. Н.Э. Баумана).
При подготовке презентации использовались:
1. AMD E-Series E-450 specifications. URL: http://www.cpu-world.com/CPUs/Bobcat/AMD-E%20Series%20E-450.html
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
26 © L
uxof
t Tra
inin
g 20
13
Рекомендуемая литература
1. Drepper, U. What Every Programmer Should Know About Memory (Nov. 2007). — Имеется русский перевод: http://rus-linux.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/manuals/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.
27 © L
uxof
t Tra
inin
g 20
13
Дополнительные материалы и информация
AMD x86-64, вар. 1
AMD x86-64, вар. 2
Intel x86, вар. 1
Intel x86, вар. 2 0
1000000
2000000
Эффективность оптимизации
-O0-O1-O2-O3
28 © L
uxof
t Tra
inin
g 20
13 ?Благодарю за
внимание!
Вопросы?
29 © L
uxof
t Tra
inin
g 20
13
IntHRLuxtown
Внешний ресурс
Информация об учебном центреwww.luxoft-training.ru/about
Расписание www.luxoft-training.ru/timetable
Каталог курсов www.luxoft-training.ru/training/catalog_directions
Контакты www.luxoft-training.ru/contacts
www.facebook.com/TrainingCenterLuxoft
Внутренние ресурсы
Расписание, курсы,
тренеры
Условия обучения,
логистика, контакты
Luxtown
Информационные ресурсы Luxoft Training