Параллельное программирование на C++ с помощью библиотеки TBB
Покупка
Тематика:
Программирование на C и C++
Издательство:
ДМК Пресс
Перевод:
Слинкин Алексей Александрович
Год издания: 2020
Кол-во страниц: 674
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
ВО - Магистратура
ISBN: 978-5-97060-864-7
Артикул: 748358.01.99
Доступ онлайн
В корзину
Эта книга представляет собой современное руководство для всех пишущих на C++ программистов, которые хотят научиться работать с библиотекой Threading Building Blocks (TBB). Написанная экспертами по ТВВ и параллельному программированию, она вобрала в себя их многолетний коллективный опыт разработки и преподавания параллельного программирования с помощью ТВВ. Излагаемый материал представлен в доступной форме. В книге имеются многочисленные примеры и рекомендации, которые помогут вам в полной мере овладеть ТВВ и задействовать всю мощь параллельных систем. Книга начинается с описания базовых параллельных алгоритмов и средств распараллеливания, имеющихся в стандартной библиотеке шаблонов C++. Вы узнаете об основах управления памятью, работе со структурами данных и решении типичных проблем синхронизации. Затем эти идеи применяются к более сложным системам, на примере которых объясняются компромиссы во имя производительности, общеупотребительные паттерны параллельного программирования, управление потоками и накладные расходы, а также применение ТВВ к программированию гетерогенных систем и систем на кристалле.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
- 09.03.04: Программная инженерия
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов.
Для полноценной работы с документом, пожалуйста, перейдите в
ридер.
Майкл Восс, Рафаэль Асенхо, Джеймс Рейндерс Параллельное программирование на C++ с помощью библиотеки TBB
Pro TBB: C++ Parallel Programming with Threading Building Blocks Michael Voss Rafael Asenjo James Reinders
Параллельное программирование на C++ с помощью библиотеки TBB Майкл Восс Рафаэль Асенхо Джеймс Рейндерс Москва, 2020
УДК 004.4 ББК 32.973.202 В76 Восс М., Асенхо Р., Рейндерс Дж. В76 Параллельное программирование на C++ с помощью библиотеки TBB / пер. с англ. А. А. Слинкина. – М.: ДМК Пресс, 2020. – 674 с.: ил. ISBN 978-5-97060-864-7 Эта книга представляет собой современное руководство для всех пишущих на C++ программистов, которые хотят научиться работать с библиотекой Threading Building Blocks (TBB). Написанная экспертами по TBB и параллельному программированию, она вобрала в себя их многолетний коллективный опыт разработки и преподавания параллельного программирования с помощью TBB. Излагаемый материал представлен в доступной форме. В книге имеются многочисленные примеры и рекомендации, которые помогут вам в полной мере овладеть TBB и задействовать всю мощь параллельных систем. Книга начинается с описания базовых параллельных алгоритмов и средств распараллеливания, имеющихся в стандартной библиотеке шаблонов C++. Вы узнае те об основах управления памятью, работе со структурами данных и решении типичных проблем синхронизации. Затем эти идеи применяются к более сложным системам, на примере которых объясняются компромиссы во имя производительности, общеупотребительные паттерны параллельного программирования, управление потоками и накладные расходы, а также применение TBB к программированию гетерогенных систем и систем на кристалле. УДК 004.4 ББК 32.973.202 First published in English under the title «Pro TBB; C++ Parallel Programming with Threading Building Blocks» by Michael Voss, Rafael Asenjo and James Reinders, edition: 1. This edition has been translated and published under licence from APress Media, LLC, part of Springer Nature. APress Media, LLC, part of Springer Nature takes no responsibility and shall not be made liable for the accuracy of the translation. Russian language edition copyright © 2020 by DMK Press. All rights reserved. Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. ISBN 978-1-4842-4397-8 (англ.) Copyright © Intel Corporation, 2019 ISBN 978-5-97060-864-7 (рус.) © Оформление, издание, перевод, ДМК Пресс, 2020
Содержание От издательства ......................................................................................................... 14 Об авторах .................................................................................................................... 15 Благодарности ............................................................................................................ 16 Предисловие ............................................................................................................... 18 Мыслите параллельно ........................................................................................................ 18 Что такое TBB ...................................................................................................................... 18 Структура книги и предисловия ........................................................................................ 18 Мыслите параллельно .................................................................................................... 19 Мотивы, стоящие за библиотекой TBB.............................................................................. 19 Программирование с применением задач, а не потоков ........................................... 20 Компонуемость: параллельное программирование необязательно должно быть запутанным .............................................................................................. 21 Масштабируемость, производительность и погоня за переносимой производительностью ................................................................................................... 22 Введение в параллельное программирование ................................................................. 23 Параллелизм вокруг нас ................................................................................................ 24 Конкурентность и параллелизм .................................................................................... 24 Враги параллелизма ....................................................................................................... 25 Терминология параллелизма ........................................................................................ 26 Сколько параллелизма в приложении? ........................................................................ 33 Что такое потоки? .......................................................................................................... 38 Что такое SIMD? .............................................................................................................. 40 Безопасность в условиях конкурентности ................................................................... 41 Взаимное исключение и блокировки ........................................................................... 41 Корректность .................................................................................................................. 43 Взаимоблокировка ......................................................................................................... 44 Состояния гонки ............................................................................................................. 45 Нестабильность (недетерминированность) результатов ............................................ 45 Уровень абстракции ....................................................................................................... 46 Паттерны ........................................................................................................................ 46 Локальность и месть кешей ............................................................................................... 46 Аппаратное обоснование .............................................................................................. 47 Локальность ссылок ....................................................................................................... 48 Строки кеша, выравнивание, разделение, взаимное исключение и ложное разделение ..................................................................................................... 49 TBB помнит о кешах ....................................................................................................... 53 Введение в векторизацию (SIMD) ...................................................................................... 53 Введение в средства C++ (в объеме, необходимом для работы с TBB) ............................ 55 Лямбда-функции ............................................................................................................ 55 Обобщенное программирование .................................................................................. 55 Контейнеры .................................................................................................................... 56
Содержание Шаблоны ......................................................................................................................... 56 STL ................................................................................................................................... 56 Перегрузка ...................................................................................................................... 57 Диапазоны и итераторы ................................................................................................ 57 Резюме ................................................................................................................................. 58 Дополнительная информация ........................................................................................... 58 ЧАСТЬ I Глава 1. Приступаем: «Hello, TBB!» ............................................................... 60 Почему именно Threading Building Blocks? ...................................................................... 60 Производительность: низкие накладные расходы, большое преимущество у C++ .. 61 Эволюция поддержки параллелизма в TBB и C++ ....................................................... 62 Недавние добавления в C++, относящиеся к параллелизму ....................................... 63 Библиотека Threading Building Blocks (TBB) ..................................................................... 63 Интерфейсы параллельного выполнения .................................................................... 64 Интерфейсы, не зависящие от модели выполнения ................................................... 66 Использование строительных блоков в TBB ................................................................ 66 Да начнем же уже! .............................................................................................................. 66 Получение библиотеки TBB ........................................................................................... 66 Получение кода примеров ............................................................................................. 67 Написание первого примера «Hello, TBB!» .................................................................. 67 Сборка простых примеров ............................................................................................ 70 Сборка в Windows в Microsoft Visual Studio .................................................................. 70 Сборка на платформе Linux из терминала ................................................................... 72 Более полный пример ........................................................................................................ 74 Начинаем с последовательной реализации ................................................................. 75 Добавление уровня обмена сообщениями с помощью потокового графа ................ 78 Добавление уровня разветвления–соединения с помощью parallel_for .................... 80 Добавление уровня SIMD с помощью функции transform из Parallel STL ................. 81 Резюме ................................................................................................................................. 84 Глава 2. Обобщенные параллельные алгоритмы ................................ 85 Функциональный параллелизм на уровне задач ............................................................. 88 Чуть более сложный пример: параллельная реализация быстрой сортировки ........ 90 Циклы: parallel_for, parallel_reduce и parallel_scan ............................................................ 92 parallel_for: применение тела к каждому элементу диапазона .................................. 92 parallel_reduce: вычисление одного результата для всего диапазона ........................ 95 parallel_scan: редукция с промежуточными значениями ..........................................100 Как это работает? ..........................................................................................................102 Более сложный пример: линия прямой видимости ...................................................103 Варить до готовности: parallel_do и parallel_pipeline ......................................................105 parallel_do: применять тело, пока имеются элементы ...............................................106 parallel_pipeline: обработка несколькими фильтрами ...............................................113 Резюме ................................................................................................................................120 Дополнительная информация ..........................................................................................120 Глава 3. Потоковые графы .................................................................................122 Зачем использовать графы для выражения параллелизма? ..........................................123 Основы интерфейса потоковых графов в TBB.................................................................124 Шаг 1: создать объект графа .........................................................................................125
Содержание 7 Шаг 2: создать узлы .......................................................................................................126 Шаг 3: добавить ребра ...................................................................................................128 Шаг 4: запустить граф ...................................................................................................128 Шаг 5: ждать завершения выполнения графа .............................................................131 Более сложный пример потокового графа данных .........................................................131 Реализация примера в виде потокового графа TBB ...................................................133 Производительность потокового графа данных .........................................................134 Частный случай – графы зависимостей ...........................................................................136 Реализация графа зависимостей .................................................................................138 Оценка масштабируемости графа зависимостей .......................................................143 Дополнительные сведения о потоковых графах в TBB ...................................................143 Резюме ................................................................................................................................144 Глава 4. TBB и параллельные алгоритмы стандартной библиотеки шаблонов C++ ................................................................................145 Какое отношение библиотека STL имеет к этой книге? .................................................145 Аналогия для осмысления политик выполнения в Parallel STL .....................................147 Простой пример – алгоритм std::for_each ........................................................................148 Какие алгоритмы предоставляет реализация Parallel STL? ............................................151 Как получить и использовать копию библиотеки STL, в которой применяется TBB ..........................................................................................................151 Алгоритмы в библиотеке Intel Parallel STL .................................................................152 Нестандартные итераторы открывают дополнительные способы использования ......153 Некоторые наиболее полезные алгоритмы .....................................................................156 std::for_each, std::for_each_n..........................................................................................156 std::transform .................................................................................................................158 std::reduce ......................................................................................................................159 std::transform_reduce .....................................................................................................160 Политики выполнения в деталях .....................................................................................162 sequenced_policy ............................................................................................................162 parallel_policy .................................................................................................................163 unsequenced_policy ........................................................................................................163 parallel_unsequenced_policy ..........................................................................................164 Какую политику выполнения использовать? ..................................................................164 Другие способы ввести SIMD-параллелизм .....................................................................165 Резюме ................................................................................................................................166 Дополнительная информация ..........................................................................................166 Глава 5. Синхронизация – почему ее нужно избегать и как это сделать .....................................................................................................167 Сквозной пример: гистограмма изображения ................................................................167 Небезопасная параллельная реализация .........................................................................170 Первая безопасная параллельная реализация: крупнозернистая блокировка .............173 Варианты мьютексов ....................................................................................................178 Вторая безопасная параллельная реализация: мелкозернистая блокировка ...............180 Третья потокобезопасная параллельная реализация: атомарные переменные ..........184 Улучшенная параллельная реализация: приватизация и редукция ..............................188 Поточно-локальная память ..........................................................................................189 Класс enumerable_thread_specific ..................................................................................190 Тип combinable ..............................................................................................................192
Содержание Самая простая параллельная реализация: шаблон редукции ........................................194 Подведем итоги .................................................................................................................196 Резюме ................................................................................................................................200 Дополнительная информация ..........................................................................................200 Глава 6. Структуры данных для конкурентного программирования ................................................................................................201 Основы важнейших структур данных ..............................................................................202 Неупорядоченные ассоциативные контейнеры .........................................................202 Отображение или множество .......................................................................................203 Несколько значений ......................................................................................................203 Хеширование .................................................................................................................203 Неупорядоченность.......................................................................................................204 Конкурентные контейнеры ...............................................................................................204 Конкурентные неупорядоченные ассоциативные контейнеры ................................206 Конкурентные очереди: обычные, ограниченные и с приоритетами ......................212 Конкурентный вектор ...................................................................................................220 Резюме ................................................................................................................................223 Глава 7. Масштабируемое выделение памяти ......................................224 Выделение памяти в современном C++ ...........................................................................224 Масштабируемое выделение памяти: что .......................................................................225 Масштабируемое выделение памяти: почему ................................................................226 Избежание ложного разделения с помощью дополнения .........................................227 Альтернативы масштабируемому выделению памяти: какие .......................................229 К вопросу о компиляции ...................................................................................................230 Самый популярный способ использования (библиотека прокси для C/C++): как ........230 Linux: использование библиотеки прокси ..................................................................231 macOS: использование библиотеки прокси ................................................................232 Windows: использование библиотеки прокси .............................................................232 Тестирование библиотеки прокси ...............................................................................233 Функции C: масштабируемые распределители памяти для C .......................................234 Классы C++: масштабируемые распределители памяти для C++ ...................................235 Распределители с сигнатурой std::allocator<T> ..........................................................236 scalable_allocator ................................................................................................................236 tbb_allocator ........................................................................................................................237 zero_allocator ......................................................................................................................237 cached_aligned_allocator .....................................................................................................237 Поддержка пула памяти: memory_pool_allocator ........................................................238 Поддержка выделения памяти для массивов: aligned_space .....................................238 Избирательная подмена new и delete ..............................................................................239 Настройка производительности: некоторые рычаги управления .................................242 Что такое большие страницы? .....................................................................................242 Поддержка больших страниц в TBB .............................................................................242 scalable_allocation_mode(int mode, intptr_t value) ........................................................243 TBBMALLOC_USE_HUGE_PAGES ....................................................................................243 TBBMALLOC_SET_SOFT_HEAP_LIMIT ...........................................................................243 int scalable_allocation_command(int cmd, void ∗param) ...............................................244 TBBMALLOC_CLEAN_ALL_BUFFERS ..............................................................................244 TBBMALLOC_CLEAN_THREAD_BUFFERS ......................................................................244 Резюме ................................................................................................................................244
Содержание 9 Глава 8. TBB и параллельные паттерны ....................................................245 Параллельные паттерны и параллельные алгоритмы ....................................................245 Паттерны определяют классификацию алгоритмов, проектных решений и т. д. ........247 Паттерны, которые работают ...........................................................................................248 Параллелизм данных одерживает победу .......................................................................249 Паттерн Вложенность ........................................................................................................249 Паттерн Отображение .......................................................................................................251 Паттерн Куча работ ............................................................................................................252 Паттерны редукции (Редукция и Сканирование) ...........................................................252 Паттерн Разветвление–соединение .................................................................................253 Паттерн Разделяй и властвуй ...........................................................................................256 Паттерн Ветви и границы .................................................................................................256 Паттерн Конвейер ..............................................................................................................257 Паттерн Событийно-управляемая координация (реактивные потоки) ........................258 Резюме ................................................................................................................................259 Дополнительная информация ..........................................................................................259 ЧАСТЬ II Глава 9. Столпы компонуемости .....................................................................261 Что такое компонуемость? ................................................................................................262 Вложенная композиция ................................................................................................263 Конкурентная композиция ..........................................................................................265 Последовательная композиция....................................................................................266 Благодаря каким особенностям библиотека TBB является компонуемой ....................268 Пул потоков TBB (рынок) и арены задач .....................................................................268 Диспетчер задач в TBB: заимствование работ, и не только .......................................271 Соберем все вместе ............................................................................................................277 Забегая вперед ...................................................................................................................281 Управление количеством потоков ...............................................................................281 Изоляция работ .............................................................................................................281 Привязка задачи к потоку и потока к ядру .................................................................281 Приоритеты задач .........................................................................................................281 Резюме ................................................................................................................................282 Дополнительная информация ..........................................................................................282 Глава 10. Использование задач для создания собственных алгоритмов ...................................................................................283 Сквозной пример: вычисление последовательности .....................................................283 Высокоуровневый подход: parallel_invoke .......................................................................285 Высший среди низших: task_group ...................................................................................287 Низкоуровневый интерфейс: часть первая – блокировка задач ....................................289 Низкоуровневый интерфейс задач: часть вторая – продолжение задачи ....................293 Обход планировщика ....................................................................................................299 Низкоуровневый интерфейс задач: часть третья – рециклинг задач ............................300 Контрольный список для интерфейса задач ...................................................................302 И еще одно: FIFO-задачи (типа запустил и забыл) .........................................................303 Применение низкоуровневых средств на практике .......................................................304 Резюме ................................................................................................................................310 Дополнительная информация ..........................................................................................311
Содержание Глава 11. Управление количеством потоков ..........................................312 Краткий обзор архитектуры планировщика TBB ............................................................313 Интерфейсы для управления количеством задач ...........................................................314 Управление количеством потоков с помощью task_scheduler_init ............................314 Управление количеством потоков с помощью task_arena .........................................315 Управление количеством потоков с помощью global_control ....................................316 Сводка концепций и классов ........................................................................................316 Рекомендации по заданию количества потоков .............................................................317 Использование одного объекта task_scheduler_init в простом приложении ............318 Использование нескольких объектов task_scheduler_init в простом приложении ...320 Использование нескольких арен с разным числом слотов, чтобы подсказать TBB, куда направлять рабочие потоки .....................................................321 Использование global_control для управления количеством потоков, доступных для занятия слотов на аренах ....................................................................324 Использование global_control с целью временно ограничить количество доступных потоков .......................................................................................................326 Когда НЕ следует управлять количеством потоков .........................................................328 Что не так? ..........................................................................................................................329 Резюме ................................................................................................................................330 Глава 12. Применение изоляции работы для обеспечения корректности и повышения производительности .............................331 Изоляция работ для обеспечения корректности .............................................................332 Создание изолированного региона с помощью this_task_arena::isolate ...................336 Использование арен задач для изоляции: обоюдоострый меч ......................................341 Не поддавайтесь искушению использовать арены задач для изоляции ради корректности ........................................................................................................344 Резюме ................................................................................................................................347 Дополнительная литература .............................................................................................347 Глава 13. Привязка потока к ядру и задачи к потоку .......................348 Создание привязки потока к ядру ....................................................................................349 Создание привязки задачи к потоку ................................................................................351 Когда и как следует использовать средства привязки в TBB? ........................................357 Резюме ................................................................................................................................358 Дополнительная информация ..........................................................................................358 Глава 14. Приоритеты задач .............................................................................359 Поддержка невытесняющих приоритетов в классе задач TBB ......................................359 Задание статических и динамических приоритетов ......................................................361 Два простых примера ........................................................................................................362 Реализация приоритетов без поддержки со стороны задач TBB ...................................365 Резюме ................................................................................................................................367 Дополнительная информация ..........................................................................................368 Глава 15. Отмена и обработка исключений ............................................369 Как отменить коллективную работу ................................................................................370 Отмена задач в деталях .....................................................................................................371 Явное назначение TGC..................................................................................................373
Содержание 11 Назначение TGC по умолчанию ...................................................................................375 Обработка исключений в TBB ...........................................................................................379 Написание собственных классов исключений TBB .........................................................381 Соберем все вместе: компонуемость, отмена и обработка исключений.......................384 Резюме ................................................................................................................................386 Дополнительная информация ..........................................................................................387 Глава 16. Настройка TBB-алгоритмов: зернистость, локальность, параллелизм и детерминированность ........................388 Зернистость задач: какой размер достаточен? ...............................................................389 Выбор диапазонов и разбивателей для циклов ...............................................................390 Обзор разбивателей ......................................................................................................391 Выбирать ли степень детализации для управления зернистостью задач ................392 Диапазоны, разбиватели и производительность кеша данных .................................395 Использование static_partitioner ..................................................................................402 Ограничение планировщика ради детерминированности .......................................404 Настройка конвейеров в TBB: количество фильтров, режимы и маркеры....................406 Сбалансированный конвейер.......................................................................................407 Несбалансированный конвейер ...................................................................................409 Конвейеры, локальность данных и привязка к потоку ..............................................410 В глубоких водах ................................................................................................................411 Создание собственного типа диапазона .....................................................................411 Класс Pipeline и фильтры, привязанные к потоку ......................................................414 Резюме ................................................................................................................................418 Дополнительная информация ..........................................................................................418 Глава 17. Потоковые графы: дополнительные сведения ...............419 Оптимизация зернистости, локальности и степени параллелизма ..............................419 Зернистость узла: какой будет достаточно? ................................................................420 Потребление памяти и локальность данных...............................................................428 Арены задач и потоковый граф ...................................................................................441 Рекомендации по работе с потоковыми графами: что полезно, а что вредно .............444 Полезно: использовать вложенный параллелизм ......................................................444 Вредно: использовать многофункциональные узлы вместо вложенного параллелизма ................................................................................................................444 Полезно: использовать узлы join_node, sequencer_node или multifunction_node для восстановления порядка в потоковом графе, когда это необходимо .................445 Полезно: использовать функцию isolate для вложенного параллелизма .................448 Полезно: использовать отмену и обработку исключений в потоковых графах .......450 Полезно: задавать приоритеты для графа, в котором используется task_group_context .........................................................................................................454 Вредно: создавать ребро между узлами разных графов ............................................454 Полезно: использовать try_put для передачи информации между графами ...........456 Полезно: использовать composite_node для инкапсуляции группы узлов ...............458 Введение в Intel Advisor: Flow Graph Analyzer .................................................................462 Процесс проектирования в FGA ...................................................................................462 Процесс анализа в FGA .................................................................................................465 Диагностика проблем производительности с помощью FGA ....................................467 Резюме ................................................................................................................................470 Дополнительная информация ..........................................................................................470
Содержание Глава 18. Дополнение потоковых графов асинхронными узлами ............................................................................................................................471 Пример из асинхронного мира ........................................................................................472 Зачем и когда использовать async_node? .........................................................................476 Более реалистичный пример ............................................................................................478 Резюме ................................................................................................................................486 Дополнительная информация ..........................................................................................487 Глава 19. Накачанные потоковые графы: узлы OpenCL .................488 Пример «Hello OpenCL_Node» ...........................................................................................489 Где исполняется наше ядро? .............................................................................................496 Возвращаясь к более реалистичному примеру из главы 18 ...........................................502 Дьявол кроется в деталях ..................................................................................................509 Концепция NDRange .....................................................................................................511 Поиграем со смещением ..............................................................................................515 Задание ядра OpenCL ....................................................................................................516 Еще о выборе устройства ..................................................................................................517 Предупреждение по поводу порядка ...............................................................................520 Резюме ................................................................................................................................523 Дополнительная информация ..........................................................................................524 Глава 20. TBB в системах с архитектурой NUMA .................................525 Определение топологии платформы ...............................................................................527 Каковы затраты на доступ к памяти ............................................................................530 Базовый пример ............................................................................................................531 Мастерство размещения данных и привязки к процессору ......................................533 Привлекаем hwloc и TBB к совместной работе................................................................538 Более сложные альтернативы ...........................................................................................543 Резюме ................................................................................................................................544 Дополнительная информация ..........................................................................................545 Приложение А. История и предшественники ........................................546 Десятилетие «от птенца к орлу» .......................................................................................546 1. Революция TBB внутри Intel .....................................................................................546 2. Первая революция TBB в сфере параллелизма .......................................................547 3. Вторая революция TBB в сфере параллелизма ........................................................548 4. Птички TBB ................................................................................................................549 Источники идей TBB .........................................................................................................551 Модель ослабленного последовательного выполнения .............................................552 Библиотеки, оказавшие влияние .................................................................................552 Языки, оказавшие влияние ..........................................................................................554 Прагмы, оказавшие влияние ........................................................................................554 Влияние обобщенного программирования ................................................................555 Учет кешей .....................................................................................................................555 Учет стоимости квантования времени ........................................................................556 Литература для дополнительного чтения ...................................................................557
Содержание 13 Приложение В. TBB в кратком изложении ..............................................560 Отладка и условный код ....................................................................................................560 Макросы ознакомительных средств ................................................................................562 Диапазоны..........................................................................................................................562 Разбиватели .......................................................................................................................563 Алгоритмы .........................................................................................................................564 Алгоритм: parallel_do ....................................................................................................564 Алгоритм: parallel_for ...................................................................................................567 Алгоритм: parallel_for_each...........................................................................................569 Алгоритм: parallel_invoke .............................................................................................571 Алгоритм: parallel_pipeline ...........................................................................................572 Алгоритм: parallel_reduce и parallel_deterministic_reduce ..........................................574 Алгоритм: parallel_scan .................................................................................................578 Алгоритм: parallel_sort ..................................................................................................581 Алгоритм: pipeline ........................................................................................................583 Потоковый граф .................................................................................................................585 Потоковый граф: класс graph .......................................................................................586 Потоковый граф: порты и ребра ..................................................................................587 Потоковый граф: узлы ..................................................................................................587 Выделение памяти .............................................................................................................597 Контейнеры ........................................................................................................................602 Синхронизация .............................................................................................................620 Поточно-локальная память (TLS) .....................................................................................626 Хронометраж .....................................................................................................................634 Группы задач: использование планировщика с заимствованием задач.......................635 Планировщик задач: точный контроль над планировщиком с заимствованием задач ...................................................................................................................................636 Настройки плавающей точки ...........................................................................................647 Исключения .......................................................................................................................649 Потоки ................................................................................................................................651 Parallel STL .........................................................................................................................652 Глоссарий ......................................................................................................................655 Предметный указатель ........................................................................................668
От издательства Отзывы и пожелания Мы всегда рады отзывам наших читателей. Расскажите нам, что вы думаете об этой книге – что понравилось или, может быть, не понравилось. Отзывы важны для нас, чтобы выпускать книги, которые будут для вас максимально полезны. Вы можете написать отзыв прямо на нашем сайте www.dmkpress.com, зайдя на страницу книги, и оставить комментарий в разделе «Отзывы и рецензии». Также можно послать письмо главному редактору по адресу dmkpress@gmail. com, при этом напишите название книги в теме письма. Если есть тема, в которой вы квалифицированы, и вы заинтересованы в написании новой книги, заполните форму на нашем сайте по адресу http:// dmkpress.com/authors/publish_book/ или напишите в издательство по адресу dmkpress@gmail.com. Скачивание исходного кода примеров Скачать файлы с дополнительной информацией для книг издательства «ДМК Пресс» можно на сайте www.dmkpress.com на странице с описанием соответствующей книги. Список опечаток Хотя мы приняли все возможные меры для того, чтобы удостовериться в качестве наших текстов, ошибки все равно случаются. Если вы найдете ошибку в одной из наших книг – возможно, ошибку в тексте или в коде, – мы будем очень благодарны, если вы сообщите нам о ней. Сделав это, вы избавите других читателей от расстройств и поможете нам улучшить последующие версии данной книги. Если вы найдете какие-либо ошибки в коде, пожалуйста, сообщите о них главному редактору по адресу dmkpress@gmail.com, и мы исправим это в следующих тиражах. Нарушение авторских прав Пиратство в интернете по-прежнему остается насущной проблемой. Издательства «ДМК Пресс» и Apress очень серьезно относятся к вопросам защиты авторских прав и лицензирования. Если вы столкнетесь в интернете с незаконно выполненной копией любой нашей книги, пожалуйста, сообщите нам адрес копии или веб-сайта, чтобы мы могли применить санкции. Пожалуйста, свяжитесь с нами по адресу dmkpress@gmail.com со ссылкой на подозрительные материалы. Мы высоко ценим любую помощь по защите наших авторов, помогающую нам предоставлять вам качественные материалы.
Об авторах Майкл Восс – главный инженер группы архитектуры, графики и программного обеспечения в компании Intel. Он входил в команду разработки TBB еще до выхода версии 1.0 в 2006 году и был первым архитектором API потокового графа TBB. Также является одним из ведущих разработчиков программы Flow Graph Analyzer – графического инструмента для анализа потоков данных на однородных и гетерогенных платформах. Автор и соавтор свыше 40 печатных работ по вопросам параллельного программирования, часто консультирует заказчиков по широкому кругу проблем и помогает им эффективно использовать потоковые библиотеки Intel. До поступления на работу в Intel в 2006 го ду был доцентом факультета электронной и вычислительной техники имени Эдварда С. Роджерса в Торонтском университете. Получил степень доктора философии в школе элект ронной и вычислительной техники при университете Пердью в 2001 году. Рафаэль Асенхо – профессор компьютерной архитектуры в Малагском университете, Испания. Получил степень доктора философии по технике связи в 1997 го ду и работал доцентом на факультете компьютерной архитектуры с 2001 по 2017 год. В 1996 и 1997 годах был приглашенным преподавателем в Иллинойском университете в Урбана-Шампейне, а в 1998 году – приглашенным научным сотрудником в том же университете. Также работал приглашенным научным сотрудником в Исследовательском центре Томаса Уотсона компании IBM в 2008 го ду и в компании Cray Inc. в 2011 году. Использует TBB начиная с 2008 года, а в последние пять лет занимается промышленным применением гетерогенных кристаллов, в которых TBB служит в качестве координирующего каркаса. В 2013 и 2014 годах приезжал в Иллинойский университет в Урбана-Шампейне для работы над кристаллами, объединяющими CPU и GPU. В 2015 и 2016 годах начал исследовательскую работу по кристаллам, объединяющим CPU и ППВМ (программируемая пользователем вентильная матрица, англ. FPGA), во время работы в Бристольском университете. Исполнял обязанности председателя на конференции ACM PPoPP’16 (по принципам и практике параллельного программирования) и был членом оргкомитета, а также членом программного комитета на нескольких конференциях по высокопроизводительным вычислениям (PPoPP, SC, PACT, IPDPS, HPCA, EuroPar и SBAC-PAD). В сферу его профессиональных интересов входят модели и архитектуры гетерогенного программирования, распараллеливание нерегулярного кода и оптимизация энергопотребления. Джеймс Рейндерс – консультант, имеющий за плечами более тридцати лет опыта в области параллельных вычислений. Автор, соавтор или редактор девяти технических книг по параллельному программированию. Принимал участие в разработке ключевых элементов двух самых быстрых в мире компьютеров (номер 1 в списке Top500), а также многих других суперкомпьютеров и средств разработки ПО. В середине 2016 года Джеймс отметил 10 001 день (свыше 27 лет) работы в Intel, но и теперь продолжает писать, преподавать, программировать и консультировать в различных областях, связанных с параллельными вычислениями (высокопроизводительные вычисления и искусственный интеллект).
Благодарности Два человека поддерживали этот проект с самого начала и до конца – Санджив Шах (Sanjiv Shah) и Херб Хинсторф (Herb Hinstorff). Мы благодарны им за поддержку, ободрение, а временами и ненавязчивое подталкивание. По-настоящему героические усилия предприняли рецензенты, которые присылали нам содержательные и подробные отзывы на черновики отдельных глав. Благодаря высокому качеству их работы нам пришлось потратить больше времени на редактирование текста, чем первоначально планировалось. Но в результате книга стала лучше. Круг рецензентов составляла элита пользователей и основных разработчиков TBB. Редко бывает, чтобы в доведении книги до ума принимало участие такое энергичное и благосклонно настроенное сообщество. Читатели книги должны знать этих людей поименно: Эдуарl Айгуаде (Eduard Ayguade), Кристина Бельдика (Cristina Beldica), Константин Бояринов, Хосе Карлос Кабалейро Домингес (José Carlos Cabaleiro Domínguez), Брэд Чемберлен (Brad Chamberlain), Джеймс Джен-Чань Чен (James Jen-Chang Chen), Джим Коуни (Jim Cownie), Сергей Диденко, Алехандро (Алекс) Дюран (Alejandro [Alex] Duran), Михаил Дворский, Рудольф Rudolf (Руди) Эйгенман (Rudolf Eigenmann), Джордж Элькоура (George Elkoura), Андрей Федоров, Алексей Федотов, Томас Фернандес Пена (Tomás Fernández Pena), Элвис Фефей (Elvis Fefey), Евгений Фиксман, Базилио Фрагуэла (Basilio Fraguela), Генри Гэбб (Henry Gabb), Хосе Даниэль Гарсиа Санчес (José Daniel García Sánchez), Мария Хесус Гарзаран (Maria Jesus Garzaran), Александр Гервеши (Alexander Gerveshi), Дарио Суарес Грасиа (Darío Suárez Gracia), Кристина Керманшахче (Kristina Kermanshahche), Янив Клейн (Yaniv Klein), Марк Лубин (Mark Lubin), Антон Малахов, Марк Маклафлин (Mark McLaughlin), Сюзан Мередит (Susan Meredith), Есер Мезиани (Yeser Meziani), Давид Падуа (David Padua), Никита Пономарев, Ануп Мадхусоодханан Прабха (Anoop Madhusoodhanan Prabha), Пабло Ребле (Pablo Reble), Арч Робисон (Arch Robison), Тимми Смит (Timmie Smith), Рубен Гран Техеро (Rubén Gran Tejero), Вазант Товинкере (Vasanth Tovinkere), Сергей Виноградов, Кайл Уилер (Kyle Wheeler) и Флориан Зитцельбергер (Florian Zitzelsberger). Мы искренне благодарны всем помощникам и приносим извинения тем, кого забыли упомянуть. Майк (а вместе с ним Рафа и Джеймс!) благодарят всех принимавших участие в работе над TBB на протяжении многих лет: многочисленных разработчиков в Intel, оставивших свой след в библиотеке; Алексея Куканова, который рассказывал нам о ее внутреннем устройстве; сообщество разработчиков программ с открытым исходным кодом; технических писателей и специалистов по маркетингу, которые трудились над документацией и распространением информации о TBB; технических консультантов и прикладных программистов, которые помогают пользователям применять TBB к их задачам; менеджеров, не дававших нам сбиться с пути; а особенно пользователей TBB, которые присылали отзывы о библиотеке и ее функциональности, подсказывавшие нам,
Благодарности 17 в каком направлении двигаться. А больше всех Майк благодарит свою жену Натали и детей, Ника, Али и Люка, за поддержку и терпение на протяжении вечеров и выходных, проведенных в работе над книгой. Рафа благодарит своих аспирантов и коллег за советы о том, как понятнее донести идеи TBB: Хосе Карлоса Ромеро (José Carlos Romero), Франсиско Корберу (Francisco Corbera), Алехандро Виллегаса (Alejandro Villegas), Денизу Андреа Константинеску (Denisa Andreea Constantinescu), Анжелес Наварро (Angeles Navarro). Особая благодарность Хосе Даниэлю Гарсиа за увлекательные и информативные беседы по поводу C++11, 14, 17 и 20, а также Алексею Федотову и Пабло Ребле (Pablo Reble) за помощь с примерами применения OpenCL_node, и прежде всего своей жене Анжелес Наварро за поддержку и выполнение некоторых его обязанностей во время работы над книгой. Джеймс благодарит свою жену Сюзан Мередит – без ее терпеливой и неослабной поддержки книга была бы невозможна. Ко всему прочему детальная правка, когда за красными чернилами иногда не видно было оригинального текста, сделала ее одним из самых ценных наших рецензентов. Будучи соавторами, мы не находим слов, чтобы воздать должное друг другу. Майк и Джеймс много лет знают друг друга по работе в Intel, и большая удача, что они сошлись в этом проекте. Трудно выразить, как Майк и Джеймс ценят Рафу! Как же повезло его студентам иметь такого энергичного и знающего профессора! Без Рафы читать эту книгу было бы далеко не так приятно. Благодаря знаниям Рафы о TBB книга стала гораздо лучше, а английским он владеет так хорошо, что не раз исправлял ошибки своих англоязычных коллег (Майка и Джеймса). Мы все трое работали над книгой с удовольствием и определенно подстегивали друг друга. Это было прекрасное сотрудничество. Мы благодарны Тодду Грину (Todd Green), который привел нас в издательство Apress. Спасибо Натали Пао (Natalie Pao) из Apress и Джону Сомоса (John Somoza) из Intel, которые цементировали отношения между Intel и Apress в этом проекте. Мы высоко ценим тяжкий труд всего коллектива Apress над заключением контракта, редактированием и производством. Спасибо всем! Майк Восс, Рафаэль Асенхо и Джеймс Рейндерс
Предисловие Мыслите параллельно Мы ставили себе целью сделать эту книгу полезной как начинающим, так и искушенным в параллельном программировании. Мы также хотели, чтобы книга была доступна как тем, кто владеет только программированием на C, так и тем, кто уверенно пишет на C++. Для охвата столь широкой аудитории без «оболванивания» книги мы и написали это предисловие, чтобы уравнять правила игры. Что такое TBB TBB – это библиотека для написания параллельных программ на C++, ставшая самым популярным решением и могущая похвастаться отличной поддержкой. Она широко используется – и не без причины. Созданная более десяти лет назад, TBB прошла испытание временем и учитывалась при включении поддержки параллельного программирования в стандарт C++. Хотя C++11 содержит много добавлений, связанных с параллельным программированием, а C++17 и C++2x продвинулись еще дальше в этом направлении, TBB предлагает куда больше, чем стандарт языка. Первая версия TBB была выпущена в 2006 го ду, поэтому библиотека по-прежнему поддерживает компиляторы, предшествующие выходу C++11. Но мы упростили себе задачу, приняв современный взгляд на TBB и предполагая, что все функции, описанные в C++11, наличествуют. В наши дни дают такой совет: «если у тебя нет компилятора C++11, поставь его». Если сравнивать с книгой о TBB, вышедшей в 2007 году, то, на наш взгляд, C++11, а особенно поддержка лямбда-выражений, расширяют функ цио нальность TBB, а также упрощают ее понимание и использование. Проще говоря, TBB – лучший способ написать параллельную программу на C++, и мы полагаем, что с TBB ваша продуктивность резко возрастет. структура книги и предисловия В книге четыре основные части. I. Предисловие. Базовые сведения, полезные для понимания остальной части книги. Содержит обоснование модели параллельного программирования, выбранной в TBB, введение в параллельное программирование, вопросы локальности, кеши, векторные вычисления (набор команд SIMD) и основные средства C++ (сверх имеющихся в языке C), которые поддерживаются или используются TBB.
Мотивы, стоящие за библиотекой TBB 19 II. Главы 1–8. Собственно книга о TBB. Включает введение в TBB в объеме, достаточном для эффективного параллельного программирования. III. Главы 9–20. Включает специальные темы, углубляющие понимание TBB и параллельного программирования. Рассматриваются тонкие нюансы того и другого. IV. Приложения A и B и глоссарий. Собрание полезных сведений о TBB, которые могут показаться вам интересными, в том числе история (приложение A) и полное справочное руководство (приложение B). Мыслите параллельно Для незнакомых с параллельным программированием мы написали это введение, в котором излагаются базовые сведения, делающие книгу более понятной, полезной и независимой. Мы предполагаем только владение языком C на базовом уровне и знакомим с ключевыми элементами C++, которые TBB поддерживает и на которые опирается. Мы рассматриваем параллельное программирование с практической точки зрения, подчеркивая те черты, которые делают параллельные программы более эффективными. Надеемся, что для опытных программистов это предисловие станет полезным напоминанием о теорминологии и способах рассуждений, позволяющих извлекать максимум из параллельного оборудования. Прочитав предисловие, вы сможете объяснить, что значит «мыслить параллельно» в терминах декомпозиции, масштабирования, корректности, абстрагирования и паттернов. Вы будете понимать, что ключом ко всему параллельному программированию является локальность. Вам раскроется философия программирования на уровне задач, а не на уровне потоков – революционное достижение концепции параллельного программирования, поддерживаемой TBB. Вы познакомитесь с теми элементами программирования на C++ сверх известного по программированию на C, которые необходимы для использования TBB. Предисловие состоит из пяти частей: 1) объяснение мотивов, стоящих за TBB; 2) введение в параллельное программирование; 3) введение в локальность и кеши – аспект оборудования, который, на наш взгляд, неотделим от достижения максимальной производительности средствами параллельного программирования; 4) введение в векторизацию (набор команд SIMD); 5) введение в языковые средства C++ (сверх унаследованных от C), которые используются или поддерживаются библиотекой TBB. Мотивы, стоящие за библиотекой TBB Библиотека TBB появилась в 2006 году. Ее создали специалисты по параллельному программированию из компании Intel, и за плечами многих из них были десятки лет работы с моделями параллельного программирования, в т. ч. OpenMP. Многие члены команды TBB потратили годы, чтобы OpenMP могла добиться
Доступ онлайн
В корзину