DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?
-
Upload
alex-petrov -
Category
Software
-
view
442 -
download
1
description
Transcript of DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level Languages?
1 © L
uxoft
Tra
inin
g 2
013
Алексей Петров
Достижима ли в C++
эффективность языка
«среднего уровня»?
DevLabs
2 © L
uxoft
Tra
inin
g 2
013
Достижима ли в C++ эффективность
языка «среднего уровня»?
Алексей Петров
DevLabs
3 © L
uxoft
Tra
inin
g 2
013
Введение
4 © L
uxoft
Tra
inin
g 2
013
Разрешите представиться
Алексей Петров — тренер и консультант, эксперт-
практик в области информационного обеспечения
автоматизированных систем, архитектуры и
разработки программного обеспечения на языках
высокого уровня:
1998 — первая программа на C++
2009 — первый тренинг по C++
2012 — начало сотрудничества с Luxoft Training
и НИУ МГТУ им. Н.Э. Баумана
5 © L
uxoft
Tra
inin
g 2
013
О чем пойдет речь?
C++ сегодня. Соображения эффективности
Кэш-память в архитектуре ЭВМ: зачем и что делать?
Пример оптимизации кода по производительности
Основные направления оптимизации исходного кода
6 © L
uxoft
Tra
inin
g 2
013
Неформальное введение. C++ сегодня
Актуальное состояние:
Наработанная десятилетиями мощная кодовая база —
требует решения «сопровождать или переписывать»
Поддержка C++ нескольких парадигм программирования
Активное использование языков C / C++ в практике
программирования высокопроизводительных приложений
Неослабевающий интерес индустрии и популярность языка
среди разработчиков — 3 – 4-е место в TIOBE Index c 2001 г.
Перспективы:
Предсказуемое поступательное развитие языка —
стандарты C++11 / C++14 / C++17
Ожидаемое внедрение полноценных средств поддержки
параллельных вычислений, работы с дисковыми, сетевыми
ресурсами и т.д.
7 © L
uxoft
Tra
inin
g 2
013
Соображения эффективности
C++ — компилируемый язык:
сохранивший эффективность своего C-подмножества:
более эффективный, чем языки с промежуточной
трансляцией и интерпретируемые языки.
В активе C++ — множество оптимизирующих
компиляторов для основных программно-
аппаратных платформ:
GCC: g++;
Intel® Composer XE Suites: Intel® C++ Compiler и др.
Язык и инструментальные средства позволяют
писать код эффективно.
8 © L
uxoft
Tra
inin
g 2
013
Кэш-память процессора
в архитектуре… и в C++
9 © L
uxoft
Tra
inin
g 2
013
Кэш-память в архитектуре
современных ЭВМ: зачем?
Проблема:
многократное отставание системной
шины [и модулей оперативной памяти
(DRAM)] от ядра ЦП по внутренней
частоте; простой ЦП.
Решение:
включение в архитектуру небольших
модулей сверхоперативной памяти
(SRAM), полностью контролируемой
ЦП (не пользователем и ОС!).
Условия эффективности:
локальность данных и кода в
пространстве-времени.
Схема организации кэш-памяти:
см. рис.
Оперативная
память
Системная шина
Кэш-память
3-го уровня
Кэш 2-го
уровня
Кэш
команд
1го
уровня
Кэш
данных
1-го
уровня
Ядро ЦП,
регистры
10 © L
uxoft
Tra
inin
g 2
013
Кэш-память в архитектуре
современных ЭВМ: что делать?
Обеспечивать локальность данных и кода в
пространстве и времени:
совместно хранить совместно используемые данные или код;
не нарушать эмпирические правила написания эффективного
исходного кода.
Обеспечивать эффективность загрузки кэш-
памяти данных и кода:
полагаться на оптимизирующие возможности компилятора;
помогать компилятору в процессе написания кода.
Знать основы организации аппаратного обеспечения.
Экспериментировать!
11 © L
uxoft
Tra
inin
g 2
013
Пример: постановка задачи
𝐴 = 𝑎𝑖𝑗 Дано:
Найти: 𝐵 = 𝑏𝑗
Варианты решения:
Задача. Рассчитать сумму
столбцов заданной
целочисленной матрицы.
Оптимизировать
найденное решение с
точки зрения загрузки кэш-
памяти данных.
❷ ❶
или
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 байт);
рандомизированная модификация элементов.
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
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%%.
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 см
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);
}
}
17 © L
uxoft
Tra
inin
g 2
013
Что еще можно оптимизировать?
18 © L
uxoft
Tra
inin
g 2
013
Основные направления оптимизации
Предсказание переходов:
устранение ветвлений;
развертывание (линеаризация) циклов;
встраивание функций (методов) и др.
Критические секции:
устранение цепочек зависимости для внеочередного
исполнения инструкций;
использование поразрядных операций, INC (++), DEC (--),
векторизация (SIMD) и т.д.
Обращение к памяти:
выполнение потоковых операций;
выравнивание и упаковка данных и пр.
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;
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%)
21 © L
uxoft
Tra
inin
g 2
013
Реорганизация структур данных
Направления:
декомпозиция типов данных на более мелкие, которые при
решении задачи используются полностью либо не
используются вообще;
устранение лакун, обусловленных характеристиками
выравнивания типов их элементов.
Желательно:
переносить наиболее востребованные элементы структуры
(класса) к началу;
обходить структуру в порядке определения элементов, если
иное не требуется задачей или прочими обстоятельствами.
Недостатки:
снижение удобства чтения и сопровождения кода;
риск размещения совместно используемых элементов на
разных линиях кэш-памяти.
22 © L
uxoft
Tra
inin
g 2
013
Устранение ветвлений
Проблема:
статистическое смещение условия в ложную сторону;
нелинейное исполнение кода;
загрязнение кэш-памяти L1i неиспользуемым кодом;
трудности с предсказанием переходов.
Желательно:
изымать реже исполняемый код с основного вычислительного
пути;
реорганизовать блоки так, чтобы в заголовке операторов
фигурировала проверка на более вероятный исход, а среди
операндов логической операции первыми следовали более
предсказуемые, для && — ложные, для || — истинные.
Альтернативные решения:
использование функции __builtin_expect и др.
23 © L
uxoft
Tra
inin
g 2
013
Встраивание функций и методов
Преимущества:
способность компилятора оптимизировать бóльшие кодовые
фрагменты;
порождаемый код способен лучше задействовать
конвейерную микроархитектуру ЦП.
Недостатки:
увеличение объема кода и бóльшая нагрузка на кэш-память
команд всех уровней (L1i, L2i, …);
возможное общее снижение производительности.
Желательно:
всегда встраивать функции, вызываемые однократно;
избегать встраивания функций, многократно вызываемых из
разных точек программы.
24 © L
uxoft
Tra
inin
g 2
013
Выводы
Язык C++ не уступает в эффективности
«родительскому» языку C
Грамматика современных диалектов C++ и ее
расширения переносимыми компиляторами (напр.
GCC) позволяют выражать тонкие аспекты работы с
памятью на всех уровнях
Правильное использование прагматики языка
позволяет добиться серьезной оптимизации кода, на
которую самостоятельно не способны современные
компиляторы (иногда ограниченные в действиях
стандартом на язык программирования)
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
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.
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
28 © L
uxoft
Tra
inin
g 2
013
Благодарю за внимание!
Вопросы?
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