Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Параллельное программирование на C++ с помощью библиотеки TBB

Покупка
Артикул: 748358.01.99
Доступ онлайн
1 499 ₽
В корзину
Эта книга представляет собой современное руководство для всех пишущих на C++ программистов, которые хотят научиться работать с библиотекой Threading Building Blocks (TBB). Написанная экспертами по ТВВ и параллельному программированию, она вобрала в себя их многолетний коллективный опыт разработки и преподавания параллельного программирования с помощью ТВВ. Излагаемый материал представлен в доступной форме. В книге имеются многочисленные примеры и рекомендации, которые помогут вам в полной мере овладеть ТВВ и задействовать всю мощь параллельных систем. Книга начинается с описания базовых параллельных алгоритмов и средств распараллеливания, имеющихся в стандартной библиотеке шаблонов C++. Вы узнаете об основах управления памятью, работе со структурами данных и решении типичных проблем синхронизации. Затем эти идеи применяются к более сложным системам, на примере которых объясняются компромиссы во имя производительности, общеупотребительные паттерны параллельного программирования, управление потоками и накладные расходы, а также применение ТВВ к программированию гетерогенных систем и систем на кристалле.
Восс, М. Параллельное программирование на C++ с помощью библиотеки ТВВ : практическое руководство / М. Восс, Р. Асенхо, Дж. Рейндерс ; пер. с англ. А. А. Слинкина. - Москва : ДМК Пресс, 2020. - 674 с. - ISBN 978-5-97060-864-7. - Текст : электронный. - URL: https://znanium.com/catalog/product/1210711 (дата обращения: 29.03.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Майкл Восс, Рафаэль Асенхо, Джеймс Рейндерс

Параллельное программирование  
на 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 могла добиться 


Доступ онлайн
1 499 ₽
В корзину