SlideShare a Scribd company logo
DevLabs

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

© Luxoft Training 2013

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

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

© Luxoft Training 2013

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

2
© Luxoft Training 2013

Введение

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



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

© Luxoft Training 2013

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

4
О чем пойдет речь?
C++ сегодня. Соображения эффективности



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



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


© Luxoft Training 2013



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

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



Актуальное состояние:
 Наработанная десятилетиями мощная кодовая база —
требует решения «сопровождать или переписывать»

 Поддержка C++ нескольких парадигм программирования
 Активное использование языков C / C++ в практике
программирования высокопроизводительных приложений

 Неослабевающий интерес индустрии и популярность языка
среди разработчиков — 3 – 4-е место в TIOBE Index c 2001 г.

© Luxoft Training 2013



Перспективы:
 Предсказуемое поступательное развитие языка —
стандарты C++11 / C++14 / C++17
 Ожидаемое внедрение полноценных средств поддержки
параллельных вычислений, работы с дисковыми, сетевыми
ресурсами и т.д.
6
Соображения эффективности



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

В активе C++ — множество оптимизирующих
компиляторов для основных программноаппаратных платформ:
 GCC: g++;
 Intel® Composer XE Suites: Intel® C++ Compiler и др.


© Luxoft Training 2013



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

7
© Luxoft Training 2013

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

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



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



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

© Luxoft Training 2013



Условия эффективности:
 локальность данных и кода в
пространстве-времени.

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



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

© Luxoft Training 2013



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




Знать основы организации аппаратного обеспечения.
Экспериментировать!
10
Пример: постановка задачи





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

Найти:

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

❶
© Luxoft Training 2013

Дано:

❷
или

11
Пример: порядок анализа вариантов
Размерность задачи:
 набор данных: 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
© Luxoft Training 2013

Пример: сравнительная
эффективность вариантов

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

© Luxoft Training 2013

 Применение векторных SIMD-инструкций из наборов
команд SSE, SSE2, SSE3 позволяет улучшить
полученный результат еще на 15 – 20%%.
14
Почему оптимизация работы с кэш-памятью
того стоит?



Несложная трансформация вычислительноемких
фрагментов кода позволяет добиться серьезного
роста скорости выполнения.
 разбиение на квадраты (англ. square blocking) и пр.



Причина — высокая «стоимость» кэш-промахов:
 на рис. — оценки для одного из ЦП Intel.

© Luxoft Training 2013

ЦП @ 3 ГГц:
1 такт ≈ 0,33 нс → 10 см

15
Преимущества встроенного замера
времени. Реализация класса-таймера



Преимущества встроенного
замера:
 полный контроль над запуском и

© 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
© Luxoft Training 2013

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

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



Предсказание переходов:
 устранение ветвлений;
 развертывание (линеаризация) циклов;
 встраивание функций (методов) и др.



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

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



Обращение к памяти:
 выполнение потоковых операций;
 выравнивание и упаковка данных и пр.
18
Выравнивание данных



Вопрос выравнивания:
 актуален для переменных простых и составных типов;
 актуален для объектов хранения как в стеке функций, так и в
куче процесса.



Проблема: данные выровнены слабее, чем это
необходимо для эффективной загрузки в кэш-память:
 длина линии L1d в современных ЦП — 64 байта.

 Решение:
 принудительное выравнивание: GCC-атрибут aligned в
© Luxoft Training 2013

определении типа или объекта данных и пр.
// выравнивание, регулируемое на уровне объекта
uint64_t qwd __attribute((aligned(64)));
// выравнивание, регулируемое на уровне типа
typedef int __attribute((aligned(128))) al128int_t;
al128int_t aln;
19
Упаковка переменных составных типов



Вопрос упаковки данных:
 характерен для структур (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
Реорганизация структур данных



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





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

© Luxoft Training 2013





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

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

Недостатки:
 снижение удобства чтения и сопровождения кода;
 риск размещения совместно используемых элементов на
разных линиях кэш-памяти.
21
Устранение ветвлений





Проблема:
 статистическое смещение условия в ложную сторону;
 нелинейное исполнение кода;
 загрязнение кэш-памяти L1i неиспользуемым кодом;
 трудности с предсказанием переходов.
Желательно:
 изымать реже исполняемый код с основного вычислительного

© Luxoft Training 2013



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

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



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

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



Недостатки:
 увеличение объема кода и бóльшая нагрузка на кэш-память
команд всех уровней (L1i, L2i, …);

 возможное общее снижение производительности.
© Luxoft Training 2013



Желательно:
 всегда встраивать функции, вызываемые однократно;
 избегать встраивания функций, многократно вызываемых из
разных точек программы.
23
Выводы

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

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

© Luxoft Training 2013

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

24
Дополнительные материалы и информация
Автор выражает благодарность за участие в подготовке материалов
г-же Эльвире Джураевой (кафедра «Системы обработки
информации и управления», Московский государственный
технический университет им. Н.Э. Баумана).
При подготовке презентации использовались:
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
© 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
© Luxoft Training 2013

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

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

© Luxoft Training 2013

Вопросы?

28
Информационные ресурсы 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

More Related Content

PDF
06 vasenin roganov siis_2013
PPTX
Параллельное программирование на современных видеокартах
PDF
Архитектура и программирование потоковых многоядерных процессоров для научных...
PDF
О.В.Сухорослов "Многопотчное программирование. Часть 2"
PDF
Machine learning c использованием нейронных сетей, Дмитрий Лапин
PDF
Intel IPP Samples for Windows - работа над ошибками
PPTX
C++ Core Guidelines
ODP
Java 9 - кратко о новом
06 vasenin roganov siis_2013
Параллельное программирование на современных видеокартах
Архитектура и программирование потоковых многоядерных процессоров для научных...
О.В.Сухорослов "Многопотчное программирование. Часть 2"
Machine learning c использованием нейронных сетей, Дмитрий Лапин
Intel IPP Samples for Windows - работа над ошибками
C++ Core Guidelines
Java 9 - кратко о новом

What's hot (20)

PDF
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
PDF
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
PDF
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
PDF
C++ STL & Qt. Занятие 10.
PDF
О.В.Сухорослов "MapReduce"
ODP
Java: вчера, сегодня, завтра
PPTX
По ту сторону ООП: PEAK-Rules и PyProtocols
PDF
Введение в Deep Learning
PDF
О.В.Сухорослов "Распределенное программирование. Разбор ДЗ №2"
PDF
Практика Lock-free. RealTime-сервер
PDF
Григорий Демченко — Асинхронное программирование и сопрограммы
PDF
C++ STL & Qt. Занятие 11.
PPTX
Software craftsmanship 15 online: Reliability and Resiliency
PDF
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
PDF
Программирование на медиапроцессорах Philips Nexperia
PDF
C++ STL & Qt. Занятие 05.
PDF
C++ STL & Qt. Занятие 09.
PDF
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
PDF
C:\fakepath\lopc_midlet
PPTX
Асинхронность и сопрограммы
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
C++ STL & Qt. Занятие 10.
О.В.Сухорослов "MapReduce"
Java: вчера, сегодня, завтра
По ту сторону ООП: PEAK-Rules и PyProtocols
Введение в Deep Learning
О.В.Сухорослов "Распределенное программирование. Разбор ДЗ №2"
Практика Lock-free. RealTime-сервер
Григорий Демченко — Асинхронное программирование и сопрограммы
C++ STL & Qt. Занятие 11.
Software craftsmanship 15 online: Reliability and Resiliency
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Программирование на медиапроцессорах Philips Nexperia
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 09.
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
C:\fakepath\lopc_midlet
Асинхронность и сопрограммы
Ad

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

PDF
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...
PDF
C++ весна 2014 лекция 2
PPTX
С++ Optimization Techniques
PPT
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
PPTX
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
PDF
C++ осень 2013 лекция 1
PPTX
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
PDF
Поговорим про память
PDF
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
PDF
Методы оптимизации вычислений на CPU
PDF
Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
PDF
C++ осень 2012 лекция 1
PDF
C++ осень 2013 лекция 2
PPT
Низкоуровневая Оптимизация (Андрей Аксенов)
PPT
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
PPT
PPT
OO Design with C++: 0. Intro
PPT
Efficiency vvv
PDF
Продолжаем говорить о микрооптимизациях .NET-приложений
PPT
Лекция №1 Организация ЭВМ и систем
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...
C++ весна 2014 лекция 2
С++ Optimization Techniques
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ осень 2013 лекция 1
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
Поговорим про память
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Методы оптимизации вычислений на CPU
Теория и практика .NET-бенчмаркинга (25.01.2017, Москва)
C++ осень 2012 лекция 1
C++ осень 2013 лекция 2
Низкоуровневая Оптимизация (Андрей Аксенов)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
OO Design with C++: 0. Intro
Efficiency vvv
Продолжаем говорить о микрооптимизациях .NET-приложений
Лекция №1 Организация ЭВМ и систем
Ad

More from LuxoftTraining (20)

PDF
Адаптивный дом
PPT
Basic networking course
PPTX
Take a sip of sip
PPTX
Лучшие практики исполнения проекта в соответствии с методологией IBM Rational
PPTX
Gobov denys (it arena 2015)
PDF
Remigiusz dudek exploratorytests_testwarez2014
PPTX
От бизнес-систем к информационным системам: переход шаг за шагом
PPTX
Kumskov it arena-lviv-2014-10-03
PPT
Рекомендации по проведению экспертной оценки Lt
PPTX
Awinning culture33rddegree
PPTX
Awinning culture33rddegree
PPTX
Waterfall revisited: практические метрики тестирования
PPTX
Веб-служба на базе Workflow foundation
PPTX
Vs vs. charles
PDF
Презентация доклада Лавриненко
PDF
Secr презентация дружинина
PDF
Secr презентация гардиенков
PDF
Опыт Объектно Ориентированного подхода в Бизнес-Анализе
PDF
Концепция построения процесса тестирования в Agile проектах: 3+1
PPTX
C# Deep Dive
Адаптивный дом
Basic networking course
Take a sip of sip
Лучшие практики исполнения проекта в соответствии с методологией IBM Rational
Gobov denys (it arena 2015)
Remigiusz dudek exploratorytests_testwarez2014
От бизнес-систем к информационным системам: переход шаг за шагом
Kumskov it arena-lviv-2014-10-03
Рекомендации по проведению экспертной оценки Lt
Awinning culture33rddegree
Awinning culture33rddegree
Waterfall revisited: практические метрики тестирования
Веб-служба на базе Workflow foundation
Vs vs. charles
Презентация доклада Лавриненко
Secr презентация дружинина
Secr презентация гардиенков
Опыт Объектно Ориентированного подхода в Бизнес-Анализе
Концепция построения процесса тестирования в Agile проектах: 3+1
C# Deep Dive

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

  • 1. DevLabs Достижима ли в C++ эффективность языка «среднего уровня»? © Luxoft Training 2013 Алексей Петров education@luxoft.com 1
  • 2. DevLabs Достижима ли в C++ эффективность языка «среднего уровня»? © Luxoft Training 2013 Алексей Петров 2
  • 3. © Luxoft Training 2013 Введение 3
  • 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
  • 8. © Luxoft Training 2013 Кэш-память процессора в архитектуре… и в C++ 8
  • 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
  • 13. © Luxoft Training 2013 Пример: сравнительная эффективность вариантов 13
  • 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
  • 17. © Luxoft Training 2013 Что еще можно оптимизировать? 17
  • 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
  • 27. © Luxoft Training 2013 Дополнительные материалы и информация 27
  • 28. Благодарю за внимание! © Luxoft Training 2013 Вопросы? 28
  • 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

  • #2: Первый слайд всего курса.
  • #3: *Слайд опционаленДля модуля, который представляет отдельную презентацию (т.е. читается в отдельный день)
  • #4: *Слайд опционаленДля презентации, содержащей несколько модулей (т.е. разделитель частей презентации)
  • #9: *Слайд опционаленДля презентации, содержащей несколько модулей (т.е. разделитель частей презентации)
  • #18: *Слайд опционаленДля презентации, содержащей несколько модулей (т.е. разделитель частей презентации)