Transcript
Page 1: Soft labs. достижима ли в c++ эффективность языка среднего уровня

1 © L

uxof

t Tra

inin

g 20

13

Алексей Петров

Достижима ли в C++ эффективность языка

«среднего уровня»?

[email protected]

DevLabs

Page 2: Soft labs. достижима ли в c++ эффективность языка среднего уровня

2 © L

uxof

t Tra

inin

g 20

13

Достижима ли в C++ эффективность языка «среднего уровня»?

Алексей Петров

DevLabs

Page 3: Soft labs. достижима ли в c++ эффективность языка среднего уровня

3 © L

uxof

t Tra

inin

g 20

13

Введение

Page 4: Soft labs. достижима ли в c++ эффективность языка среднего уровня

4 © L

uxof

t Tra

inin

g 20

13

Разрешите представиться

Алексей Петров — тренер и консультант, эксперт-практик в области информационного обеспечения автоматизированных систем, архитектуры и разработки программного обеспечения на языках высокого уровня: 1998 — первая программа на C++

2009 — первый тренинг по C++

2012 — начало сотрудничества с Luxoft Trainingи НИУ МГТУ им. Н.Э. Баумана

Page 5: Soft labs. достижима ли в c++ эффективность языка среднего уровня

5 © L

uxof

t Tra

inin

g 20

13

О чем пойдет речь?

C++ сегодня. Соображения эффективности

Кэш-память в архитектуре ЭВМ: зачем и что делать?

Пример оптимизации кода по производительности

Основные направления оптимизации исходного кода

Page 6: Soft labs. достижима ли в 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

Ожидаемое внедрение полноценных средств поддержки параллельных вычислений, работы с дисковыми, сетевыми ресурсами и т.д.

Page 7: Soft labs. достижима ли в c++ эффективность языка среднего уровня

7 © L

uxof

t Tra

inin

g 20

13

Соображения эффективности

C++ — компилируемый язык: сохранивший эффективность своего C-подмножества:

более эффективный, чем языки с промежуточной трансляцией и интерпретируемые языки.

В активе C++ — множество оптимизирующих компиляторов для основных программно-аппаратных платформ: GCC: g++;

Intel® Composer XE Suites: Intel® C++ Compiler и др.

Язык и инструментальные средства позволяют писать код эффективно.

Page 8: Soft labs. достижима ли в c++ эффективность языка среднего уровня

8 © L

uxof

t Tra

inin

g 20

13

Кэш-память процессорав архитектуре… и в C++

Page 9: Soft labs. достижима ли в c++ эффективность языка среднего уровня

9 © L

uxof

t Tra

inin

g 20

13

Кэш-память в архитектуресовременных ЭВМ: зачем?

Проблема: многократное отставание системной

шины [и модулей оперативной памяти (DRAM)] от ядра ЦП по внутренней частоте; простой ЦП.

Решение: включение в архитектуру небольших

модулей сверхоперативной памяти (SRAM), полностью контролируемой ЦП (не пользователем и ОС!).

Условия эффективности: локальность данных и кода в

пространстве-времени.

Схема организации кэш-памяти: см. рис.

Оперативная память

Системная шина

Кэш-память3-го уровня

Кэш 2-го уровня

Кэш команд

1го уровня

Кэш данных

1-го уровня

Ядро ЦП,

регистры

Page 10: Soft labs. достижима ли в c++ эффективность языка среднего уровня

10 © L

uxof

t Tra

inin

g 20

13

Кэш-память в архитектуресовременных ЭВМ: что делать?

Обеспечивать локальность данных и кода в пространстве и времени: совместно хранить совместно используемые данные или код;

не нарушать эмпирические правила написания эффективного исходного кода.

Обеспечивать эффективность загрузки кэш-памяти данных и кода: полагаться на оптимизирующие возможности компилятора;

помогать компилятору в процессе написания кода.

Знать основы организации аппаратного обеспечения.

Экспериментировать!

Page 11: Soft labs. достижима ли в c++ эффективность языка среднего уровня

11 © L

uxof

t Tra

inin

g 20

13

Пример: постановка задачи

𝐴= (𝑎𝑖𝑗 )Дано:

Найти: 𝐵=(𝑏 𝑗 )

Варианты решения:

Задача. Рассчитать сумму столбцов заданной целочисленной матрицы. Оптимизировать найденное решение с точки зрения загрузки кэш-памяти данных.

❷❶

или

Page 12: Soft labs. достижима ли в c++ эффективность языка среднего уровня

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 байт);

рандомизированная модификация элементов.

Page 13: Soft labs. достижима ли в c++ эффективность языка среднего уровня

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

Page 14: Soft labs. достижима ли в c++ эффективность языка среднего уровня

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%%.

Page 15: Soft labs. достижима ли в c++ эффективность языка среднего уровня

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 см

Page 16: Soft labs. достижима ли в c++ эффективность языка среднего уровня

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); }}

Page 17: Soft labs. достижима ли в c++ эффективность языка среднего уровня

17 © L

uxof

t Tra

inin

g 20

13

Что еще можно оптимизировать?

Page 18: Soft labs. достижима ли в c++ эффективность языка среднего уровня

18 © L

uxof

t Tra

inin

g 20

13

Основные направления оптимизации

Предсказание переходов: устранение ветвлений;

развертывание (линеаризация) циклов;

встраивание функций (методов) и др.

Критические секции: устранение цепочек зависимости для внеочередного

исполнения инструкций;

использование поразрядных операций, INC (++), DEC (--), векторизация (SIMD) и т.д.

Обращение к памяти: выполнение потоковых операций;

выравнивание и упаковка данных и пр.

Page 19: Soft labs. достижима ли в c++ эффективность языка среднего уровня

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;

Page 20: Soft labs. достижима ли в c++ эффективность языка среднего уровня

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%)

Page 21: Soft labs. достижима ли в c++ эффективность языка среднего уровня

21 © L

uxof

t Tra

inin

g 20

13

Реорганизация структур данных

Направления: декомпозиция типов данных на более мелкие, которые при

решении задачи используются полностью либо не используются вообще;

устранение лакун, обусловленных характеристиками выравнивания типов их элементов.

Желательно: переносить наиболее востребованные элементы структуры

(класса) к началу;

обходить структуру в порядке определения элементов, если иное не требуется задачей или прочими обстоятельствами.

Недостатки: снижение удобства чтения и сопровождения кода;

риск размещения совместно используемых элементов на разных линиях кэш-памяти.

Page 22: Soft labs. достижима ли в c++ эффективность языка среднего уровня

22 © L

uxof

t Tra

inin

g 20

13

Устранение ветвлений

Проблема: статистическое смещение условия в ложную сторону;

нелинейное исполнение кода;

загрязнение кэш-памяти L1i неиспользуемым кодом;

трудности с предсказанием переходов.

Желательно: изымать реже исполняемый код с основного вычислительного

пути;

реорганизовать блоки так, чтобы в заголовке операторов фигурировала проверка на более вероятный исход, а среди операндов логической операции первыми следовали более предсказуемые, для && — ложные, для || — истинные.

Альтернативные решения: использование функции __builtin_expect и др.

Page 23: Soft labs. достижима ли в c++ эффективность языка среднего уровня

23 © L

uxof

t Tra

inin

g 20

13

Встраивание функций и методов

Преимущества: способность компилятора оптимизировать бóльшие кодовые

фрагменты;

порождаемый код способен лучше задействовать конвейерную микроархитектуру ЦП.

Недостатки: увеличение объема кода и бóльшая нагрузка на кэш-память

команд всех уровней (L1i, L2i, …);

возможное общее снижение производительности.

Желательно: всегда встраивать функции, вызываемые однократно;

избегать встраивания функций, многократно вызываемых из разных точек программы.

Page 24: Soft labs. достижима ли в c++ эффективность языка среднего уровня

24 © L

uxof

t Tra

inin

g 20

13

Выводы

Язык C++ не уступает в эффективности «родительскому» языку C

Грамматика современных диалектов C++ и ее расширения переносимыми компиляторами (напр. GCC) позволяют выражать тонкие аспекты работы с памятью на всех уровнях

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

Page 25: Soft labs. достижима ли в c++ эффективность языка среднего уровня

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

Page 26: Soft labs. достижима ли в c++ эффективность языка среднего уровня

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.

Page 27: Soft labs. достижима ли в c++ эффективность языка среднего уровня

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

Page 28: Soft labs. достижима ли в c++ эффективность языка среднего уровня

28 © L

uxof

t Tra

inin

g 20

13 ?Благодарю за

внимание!

Вопросы?

Page 29: Soft labs. достижима ли в c++ эффективность языка среднего уровня

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


Recommended