dev labs 2013. can c++ code effeciency be comparable to that of middle-level languages?

29
1 © Luxoft Training 2013 Алексей Петров Достижима ли в C++ эффективность языка «среднего уровня»? [email protected] DevLabs

Upload: alex-petrov

Post on 24-Jan-2015

440 views

Category:

Software


1 download

DESCRIPTION

На примере одной специализированной, но значимой для большинства высокопроизводительных систем точки оптимизации исходного кода — работы с кэш-памятью — доклад «Достижима ли в C++ эффективность языка "среднего уровня"?», сделанный на DEV Labs 2013, показывает, какими несложными приемами и техниками можно достичь желаемого уровня эффективности объектно-ориентированного кода, и развеивает миф о языке C++ как языке «архитектурной астронавтики», предлагая аудитории ряд действенных рецептов повышения производительности исходного кода.

TRANSCRIPT

Page 1: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

1 © L

uxoft

Tra

inin

g 2

013

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

Достижима ли в C++

эффективность языка

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

[email protected]

DevLabs

Page 2: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

2 © L

uxoft

Tra

inin

g 2

013

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

языка «среднего уровня»?

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

DevLabs

Page 3: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

3 © L

uxoft

Tra

inin

g 2

013

Введение

Page 4: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

4 © L

uxoft

Tra

inin

g 2

013

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

Алексей Петров — тренер и консультант, эксперт-

практик в области информационного обеспечения

автоматизированных систем, архитектуры и

разработки программного обеспечения на языках

высокого уровня:

1998 — первая программа на C++

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

2012 — начало сотрудничества с Luxoft Training

и НИУ МГТУ им. Н.Э. Баумана

Page 5: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

5 © L

uxoft

Tra

inin

g 2

013

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

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

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

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

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

Page 6: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

6 © L

uxoft

Tra

inin

g 2

013

Неформальное введение. C++ сегодня

Актуальное состояние:

Наработанная десятилетиями мощная кодовая база —

требует решения «сопровождать или переписывать»

Поддержка C++ нескольких парадигм программирования

Активное использование языков C / C++ в практике

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

Неослабевающий интерес индустрии и популярность языка

среди разработчиков — 3 – 4-е место в TIOBE Index c 2001 г.

Перспективы:

Предсказуемое поступательное развитие языка —

стандарты C++11 / C++14 / C++17

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

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

ресурсами и т.д.

Page 7: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

7 © L

uxoft

Tra

inin

g 2

013

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

C++ — компилируемый язык:

сохранивший эффективность своего C-подмножества:

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

трансляцией и интерпретируемые языки.

В активе C++ — множество оптимизирующих

компиляторов для основных программно-

аппаратных платформ:

GCC: g++;

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

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

писать код эффективно.

Page 8: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

8 © L

uxoft

Tra

inin

g 2

013

Кэш-память процессора

в архитектуре… и в C++

Page 9: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

9 © L

uxoft

Tra

inin

g 2

013

Кэш-память в архитектуре

современных ЭВМ: зачем?

Проблема:

многократное отставание системной

шины [и модулей оперативной памяти

(DRAM)] от ядра ЦП по внутренней

частоте; простой ЦП.

Решение:

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

модулей сверхоперативной памяти

(SRAM), полностью контролируемой

ЦП (не пользователем и ОС!).

Условия эффективности:

локальность данных и кода в

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

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

см. рис.

Оперативная

память

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

Кэш-память

3-го уровня

Кэш 2-го

уровня

Кэш

команд

1го

уровня

Кэш

данных

1-го

уровня

Ядро ЦП,

регистры

Page 10: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

10 © L

uxoft

Tra

inin

g 2

013

Кэш-память в архитектуре

современных ЭВМ: что делать?

Обеспечивать локальность данных и кода в

пространстве и времени:

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

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

исходного кода.

Обеспечивать эффективность загрузки кэш-

памяти данных и кода:

полагаться на оптимизирующие возможности компилятора;

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

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

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

Page 11: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

11 © L

uxoft

Tra

inin

g 2

013

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

𝐴 = 𝑎𝑖𝑗 Дано:

Найти: 𝐵 = 𝑏𝑗

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

Задача. Рассчитать сумму

столбцов заданной

целочисленной матрицы.

Оптимизировать

найденное решение с

точки зрения загрузки кэш-

памяти данных.

❷ ❶

или

Page 12: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

12 © L

uxoft

Tra

inin

g 2

013

Пример: порядок анализа вариантов

Размерность задачи:

набор данных: 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: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

13 © L

uxoft

Tra

inin

g 2

013

Пример: сравнительная

эффективность вариантов

1 790 547

1 079 601

1 014 795

1 056 003

980 592

398 505

279 510

279 435

0 500000 1000000 1500000 2000000

-O0

-O1

-O2

-O3

Эффективность вариантов, такты ЦП AMD x86-64

Вариант 1

Вариант 2

630 553

303 901

302 663

303 769

932 769

677 245

680 627

662 449

0 200000 400000 600000 800000 1000000

-O0

-O1

-O2

-O3

Эффективность вариантов, такты ЦП Intel x86

Вариант 1

Вариант 2

Page 14: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

14 © L

uxoft

Tra

inin

g 2

013

Пример: результаты оптимизации

Время решения задачи за счет оптимизации обхода

данных (без применения 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: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

15 © L

uxoft

Tra

inin

g 2

013

Почему оптимизация работы с кэш-памятью

того стоит?

240 14

3

1

1 10 100

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

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

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

Регистровая память

Время доступа, такты ЦП

Несложная трансформация вычислительноемких

фрагментов кода позволяет добиться серьезного

роста скорости выполнения.

разбиение на квадраты (англ. square blocking) и пр.

Причина — высокая «стоимость» кэш-промахов:

на рис. — оценки для одного из ЦП Intel.

ЦП @ 3 ГГц:

1 такт ≈ 0,33 нс → 10 см

Page 16: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

16 © L

uxoft

Tra

inin

g 2

013

Преимущества встроенного замера

времени. Реализация класса-таймера

Преимущества встроенного

замера:

полный контроль над запуском и

остановом таймеров, счетчиков;

минимальные накладные расходы;

более надежные результаты;

возможность получения

результатов, не достижимых

стандартными инструментами.

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: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

17 © L

uxoft

Tra

inin

g 2

013

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

Page 18: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

18 © L

uxoft

Tra

inin

g 2

013

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

Предсказание переходов:

устранение ветвлений;

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

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

Критические секции:

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

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

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

векторизация (SIMD) и т.д.

Обращение к памяти:

выполнение потоковых операций;

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

Page 19: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

19 © L

uxoft

Tra

inin

g 2

013

Выравнивание данных

Вопрос выравнивания:

актуален для переменных простых и составных типов;

актуален для объектов хранения как в стеке функций, так и в

куче процесса.

Проблема: данные выровнены слабее, чем это

необходимо для эффективной загрузки в кэш-память:

длина линии L1d в современных ЦП — 64 байта.

Решение:

принудительное выравнивание: GCC-атрибут aligned в

определении типа или объекта данных и пр.

// выравнивание, регулируемое на уровне объекта

uint64_t qwd __attribute((aligned(64)));

// выравнивание, регулируемое на уровне типа

typedef int __attribute((aligned(128))) al128int_t;

al128int_t aln;

Page 20: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

20 © L

uxoft

Tra

inin

g 2

013

Упаковка переменных составных типов

Вопрос упаковки данных:

характерен для структур (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: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

21 © L

uxoft

Tra

inin

g 2

013

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

Направления:

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

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

используются вообще;

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

выравнивания типов их элементов.

Желательно:

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

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

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

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

Недостатки:

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

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

разных линиях кэш-памяти.

Page 22: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

22 © L

uxoft

Tra

inin

g 2

013

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

Проблема:

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

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

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

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

Желательно:

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

пути;

реорганизовать блоки так, чтобы в заголовке операторов

фигурировала проверка на более вероятный исход, а среди

операндов логической операции первыми следовали более

предсказуемые, для && — ложные, для || — истинные.

Альтернативные решения:

использование функции __builtin_expect и др.

Page 23: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

23 © L

uxoft

Tra

inin

g 2

013

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

Преимущества:

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

фрагменты;

порождаемый код способен лучше задействовать

конвейерную микроархитектуру ЦП.

Недостатки:

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

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

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

Желательно:

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

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

разных точек программы.

Page 24: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

24 © L

uxoft

Tra

inin

g 2

013

Выводы

Язык C++ не уступает в эффективности

«родительскому» языку C

Грамматика современных диалектов C++ и ее

расширения переносимыми компиляторами (напр.

GCC) позволяют выражать тонкие аспекты работы с

памятью на всех уровнях

Правильное использование прагматики языка

позволяет добиться серьезной оптимизации кода, на

которую самостоятельно не способны современные

компиляторы (иногда ограниченные в действиях

стандартом на язык программирования)

Page 25: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

25 © L

uxoft

Tra

inin

g 2

013

Дополнительные материалы и информация

Автор выражает благодарность за участие в подготовке материалов

г-же Эльвире Джураевой (кафедра «Системы обработки

информации и управления», Московский государственный

технический университет им. Н.Э. Баумана).

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

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: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

26 © L

uxoft

Tra

inin

g 2

013

Рекомендуемая литература

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

Page 27: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

27 © L

uxoft

Tra

inin

g 2

013

Дополнительные материалы и информация

0

500000

1000000

1500000

2000000

AMD x86-64, вар. 1

AMD x86-64, вар. 2

Intel x86, вар. 1

Intel x86, вар. 2

Эффективность оптимизации

-O0

-O1

-O2

-O3

Page 28: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

28 © L

uxoft

Tra

inin

g 2

013

Благодарю за внимание!

Вопросы?

Page 29: DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?

29 © L

uxoft

Tra

inin

g 2

013

IntHR

Luxtown

Информация об учебном центре

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