SlideShare una empresa de Scribd logo
1 de 22
Descargar para leer sin conexión
Шаблоны || программирования
Калишенко Е.Л.
ПОМИ 2014
2
Этапы разработки
● Определить место || (Finding concurrency)
● Выбор алгоритма/шаблона (Algorithm structure)
● Отбор подходящих || структур (Supporting
structures)
● Выбор механизма реализации (Implementation
mechanisms)
3
Базовые идеи design space
Выбор декомпозиции:Выбор декомпозиции:
● По данным
● По управлению (задачам)
Анализ зависимостей:Анализ зависимостей:
● Группировка задач
● Порядок выполнения задач
● Определение разделяемых данных
4
Нужно помнить
Принципы проектирования:Принципы проектирования:
● Эффективность
● Простота
● Переносимость
● Масштабируемость
5
Организация вычислений
Pipeline
Управляемые потоком
данных
Линейно? Рекурсивно?
Разделение по задачам
Линейно? Рекурсивно?
Разделение по данным
Рекурсивн.
данные
Постоянный
?
Случайный?
|| на задачахГеометрическая
декомпозиция
Разделяй и
властвуй
Координация
на событиях
Виды организации
6
Геометрическая декомпозиция
ПримерыПримеры
● Моделирование климата
● Фракталы
ОсобенностиОсобенности
● Разделение структур данных:
● массивы — берём последовательные части
● списки — псевдоэлементы или подсписки
● графы - подграфы
7
Подходит «Parallel loops»
OpenMPOpenMP
#pragma omp parallel for schedule(static, 500)
for(int i=0; i<n; i++)
invariant_amount_of_work(i);
Intel TBBIntel TBB
parallel_for(blocked_range<int>(0, nElements, 100),
ArraySummer( p_A, p_B, p_SUM_TBB ) );
А ещё есть: blocked_range2d и blocked_range3d
8
Ещё подходит SPMD
Single Program Multiple Data: один код над
разными данными, совершенно очевидная
вещь — одна программа, управляющая
вычислениями (процессами, потоками...)
Шаги:
● Инициализироваться
● Раздать идентификаторы нитям/процессам
● Разделить данные
● Завершиться
9
Parallel Boost Graph Library
● MPI: распределённые графы
● Генераторы графов
● Алгоритмы:
● Поиск
● Кратчайший путь
● Минимальное остовное дерево
● Раскраска графа
● ...
10
Recursive data
ЗадачаЗадача
● Как сделать || операции над рекурсивными
структурами (списки, деревья, графы)?
ПримерПример
● Найти в лесу корни деревьев
РешениеРешение
● Последовательное O(N) операций / времени
● || O (N log N) операций / O (log N) времени
11
Организация вычислений
Pipeline
Управляемые потоком
данных
Линейно? Рекурсивно?
Разделение по задачам
Линейно? Рекурсивно?
Разделение по данным
Рекурсивн.
данные
Постоянный
?
Случайный?
|| на задачахГеометрическая
декомпозиция
Разделяй и
властвуй
Координация
на событиях
Виды организации
12
|| на задачах
ПримерыПримеры
● Ray tracing
● Задачи молекулярной динамики
ОсобенностиОсобенности
● Динамическое создание задач (методы ветвей
и границ)
● Ожидание задач или его отсутствие
(сортировка или поиск)
● Размер задач
13
Принципы разделения на задачи
● Задач >= числу потоков (ядер)
● Объём вычислений не превышает издержки
● Борьба с зависимостями (shared data —
последний рубеж):
● Приветствуется дублирование данных (и,
возможно, вычислений) и редукция
● Уборка индуцированных переменных в циклах
● Разделить зависимости по результату через
редукцию по данным
14
Назначение задач на потоки
● Формирование очереди задач: notify —
получаем классические:
● Producer/consumer — поток кладёт задачи
● Master/Worker — поток готовит задачи
● Приходят пулы потоков
● Выбор способа планирования:
статическое/динамическое
● балансировка нагрузки: + к динамике
● минусы динамического назначения?
15
Организация вычислений
Pipeline
Управляемые потоком
данных
Линейно? Рекурсивно?
Разделение по задачам
Линейно? Рекурсивно?
Разделение по данным
Рекурсивн.
данные
Постоянный
?
Случайный?
|| на задачахГеометрическая
декомпозиция
Разделяй и
властвуй
Координация
на событиях
Виды организации
16
Pipeline
ПримерПример
● Обработка сигналов
● Видео
● Shell! «cat sampleFile | grep "word" | wc»
17
Пример
18
Local Serializer
class Serializer {
tbb::concurrent_queue<WorkItem*> queue;
tbb::atomic<int> count; // Count of queued items and in-flight item
void moveOneItemToReadyPile() { // Transfer item from queue to ReadyPile
WorkItem* item;
queue.try_pop(item);
ReadyPile.add(item);
}
public:
void add( WorkItem* item ) {
queue.push(item);
if( ++count==1 )
moveOneItemToReadyPile();
}
void noteCompletion() { // Called when WorkItem completes.
if( ‐‐count!=0 )
moveOneItemToReadyPile();
}
};
19
Double check (lock)
template<typename T, typename Mutex=tbb::mutex>
class lazy {
tbb::atomic<T*> value;
Mutex mut;
public:
lazy() : value() {} // Initializes value to NULL
~lazy() {delete value;}
T& get() {
if( !value ) { // Read of value has acquire semantics.
Mutex::scoped_lock lock(mut);
if( !value ) value = new T(); // Write of value has release semantics
}
return *value;
}
};
20
Double check (lock-free)
template<typename T>
class lazy {
tbb::atomic<T*> value;
public:
lazy() : value() {} // Initializes value to NULL
~lazy() {delete value;}
T& get() {
if( !value ) {
T* tmp = new T();
if( value.compare_and_swap(tmp,NULL)!=NULL )
// Another thread installed the value, so throw away mine.
delete tmp;
}
return *value;
}
};
21
Модели программ
● SPMD
● Каждый поток имеет id, по которому просит
данные, выбирает итерации...
● Loop ||
● Объединение вложенных циклов
● Уборка зависимостей по итерациям
● Возможна простая статическая балансировка
● Boss/Worker
● Нужна для динамической балансировки
22
-D_GLIBCXX_PARALLEL
● Несколько десятков реализаций алгоритмов
из <algorithm>: find_if, max_element...
● Использует OpenMP

Más contenido relacionado

Similar a 20140413 parallel programming_kalishenko_lecture09

Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...Yandex
 
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...Yandex
 
Без единого разрыва: горящие IT­сервисы и механизмы их тушения
Без единого разрыва: горящие IT­сервисы и механизмы их тушенияБез единого разрыва: горящие IT­сервисы и механизмы их тушения
Без единого разрыва: горящие IT­сервисы и механизмы их тушенияEDS Systems
 
Настройка производительности. Планировщик ввода/вывода
Настройка производительности. Планировщик ввода/выводаНастройка производительности. Планировщик ввода/вывода
Настройка производительности. Планировщик ввода/выводаAndrey Markelov
 
Software craftsmanship 17: Microservices interaction
Software craftsmanship 17: Microservices interactionSoftware craftsmanship 17: Microservices interaction
Software craftsmanship 17: Microservices interactionPavel Veinik
 
20111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture320111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture3Computer Science Club
 
Сравнение возможностей «1С:ERP Управление предприятием 2» и «1С:Управление п...
Сравнение возможностей «1С:ERP Управление предприятием 2» и «1С:Управление п...Сравнение возможностей «1С:ERP Управление предприятием 2» и «1С:Управление п...
Сравнение возможностей «1С:ERP Управление предприятием 2» и «1С:Управление п...Rise
 
Александр Александров
Александр АлександровАлександр Александров
Александр АлександровSQALab
 
Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"Fwdays
 
Software craftsmanship 15 online: Reliability and Resiliency
Software craftsmanship 15 online: Reliability and ResiliencySoftware craftsmanship 15 online: Reliability and Resiliency
Software craftsmanship 15 online: Reliability and ResiliencyPavel Veinik
 
Введение в performance management
Введение в performance managementВведение в performance management
Введение в performance managementCEE-SEC(R)
 
Software craftsmanship 14 online Splitting the Monolith
Software craftsmanship 14 online Splitting the MonolithSoftware craftsmanship 14 online Splitting the Monolith
Software craftsmanship 14 online Splitting the MonolithPavel Veinik
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...Ontico
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхМониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхSveta Smirnova
 
14 расширенные возможности корпоративных субд
14 расширенные возможности корпоративных субд14 расширенные возможности корпоративных субд
14 расширенные возможности корпоративных субдKewpaN
 
BigData и Data Science: методы и инструменты
BigData и Data Science: методы и инструменты BigData и Data Science: методы и инструменты
BigData и Data Science: методы и инструменты Dima Karamshuk
 
20120226 information retrieval raskovalov_lecture03-04
20120226 information retrieval raskovalov_lecture03-0420120226 information retrieval raskovalov_lecture03-04
20120226 information retrieval raskovalov_lecture03-04Computer Science Club
 
Test Set Generation Based on a Management Stream Model
Test Set Generation Based on a Management Stream ModelTest Set Generation Based on a Management Stream Model
Test Set Generation Based on a Management Stream ModelIosif Itkin
 

Similar a 20140413 parallel programming_kalishenko_lecture09 (20)

Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
Дмитрий Куликовский, Алексей Лавренюк - Построение кластеров, нагрузочное тес...
 
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
Дмитрий Куликовский - Построение кластеров, нагрузочное тестирование, capacit...
 
Без единого разрыва: горящие IT­сервисы и механизмы их тушения
Без единого разрыва: горящие IT­сервисы и механизмы их тушенияБез единого разрыва: горящие IT­сервисы и механизмы их тушения
Без единого разрыва: горящие IT­сервисы и механизмы их тушения
 
Настройка производительности. Планировщик ввода/вывода
Настройка производительности. Планировщик ввода/выводаНастройка производительности. Планировщик ввода/вывода
Настройка производительности. Планировщик ввода/вывода
 
Software craftsmanship 17: Microservices interaction
Software craftsmanship 17: Microservices interactionSoftware craftsmanship 17: Microservices interaction
Software craftsmanship 17: Microservices interaction
 
20111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture320111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture3
 
Сравнение возможностей «1С:ERP Управление предприятием 2» и «1С:Управление п...
Сравнение возможностей «1С:ERP Управление предприятием 2» и «1С:Управление п...Сравнение возможностей «1С:ERP Управление предприятием 2» и «1С:Управление п...
Сравнение возможностей «1С:ERP Управление предприятием 2» и «1С:Управление п...
 
Александр Александров
Александр АлександровАлександр Александров
Александр Александров
 
Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"
 
Software craftsmanship 15 online: Reliability and Resiliency
Software craftsmanship 15 online: Reliability and ResiliencySoftware craftsmanship 15 online: Reliability and Resiliency
Software craftsmanship 15 online: Reliability and Resiliency
 
Введение в performance management
Введение в performance managementВведение в performance management
Введение в performance management
 
Software craftsmanship 14 online Splitting the Monolith
Software craftsmanship 14 online Splitting the MonolithSoftware craftsmanship 14 online Splitting the Monolith
Software craftsmanship 14 online Splitting the Monolith
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхМониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
 
14 расширенные возможности корпоративных субд
14 расширенные возможности корпоративных субд14 расширенные возможности корпоративных субд
14 расширенные возможности корпоративных субд
 
алгоритмы и их виды
алгоритмы и их видыалгоритмы и их виды
алгоритмы и их виды
 
BigData и Data Science: методы и инструменты
BigData и Data Science: методы и инструменты BigData и Data Science: методы и инструменты
BigData и Data Science: методы и инструменты
 
20120226 information retrieval raskovalov_lecture03-04
20120226 information retrieval raskovalov_lecture03-0420120226 information retrieval raskovalov_lecture03-04
20120226 information retrieval raskovalov_lecture03-04
 
алгоритмы и их виды
алгоритмы и их видыалгоритмы и их виды
алгоритмы и их виды
 
Test Set Generation Based on a Management Stream Model
Test Set Generation Based on a Management Stream ModelTest Set Generation Based on a Management Stream Model
Test Set Generation Based on a Management Stream Model
 

Más de Computer Science Club

20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugsComputer Science Club
 
20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugs20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugsComputer Science Club
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugsComputer Science Club
 
20140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture1220140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture12Computer Science Club
 
20140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture1120140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture11Computer Science Club
 
20140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture1020140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture10Computer Science Club
 
20140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture0220140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture02Computer Science Club
 
20140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture0120140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture01Computer Science Club
 
20140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-0420140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-04Computer Science Club
 
20140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture0120140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture01Computer Science Club
 

Más de Computer Science Club (20)

20141223 kuznetsov distributed
20141223 kuznetsov distributed20141223 kuznetsov distributed
20141223 kuznetsov distributed
 
Computer Vision
Computer VisionComputer Vision
Computer Vision
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs
 
20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugs20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugs
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs
 
20140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture1220140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture12
 
20140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture1120140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture11
 
20140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture1020140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture10
 
20140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture0220140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture02
 
20140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture0120140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture01
 
20140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-0420140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-04
 
20140223-SuffixTrees-lecture01-03
20140223-SuffixTrees-lecture01-0320140223-SuffixTrees-lecture01-03
20140223-SuffixTrees-lecture01-03
 
20140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture0120140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture01
 
20131106 h10 lecture6_matiyasevich
20131106 h10 lecture6_matiyasevich20131106 h10 lecture6_matiyasevich
20131106 h10 lecture6_matiyasevich
 
20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich
 
20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich
 
20131013 h10 lecture4_matiyasevich
20131013 h10 lecture4_matiyasevich20131013 h10 lecture4_matiyasevich
20131013 h10 lecture4_matiyasevich
 
20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich
 
20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich
 
20131006 h10 lecture2_matiyasevich
20131006 h10 lecture2_matiyasevich20131006 h10 lecture2_matiyasevich
20131006 h10 lecture2_matiyasevich
 

20140413 parallel programming_kalishenko_lecture09

  • 2. 2 Этапы разработки ● Определить место || (Finding concurrency) ● Выбор алгоритма/шаблона (Algorithm structure) ● Отбор подходящих || структур (Supporting structures) ● Выбор механизма реализации (Implementation mechanisms)
  • 3. 3 Базовые идеи design space Выбор декомпозиции:Выбор декомпозиции: ● По данным ● По управлению (задачам) Анализ зависимостей:Анализ зависимостей: ● Группировка задач ● Порядок выполнения задач ● Определение разделяемых данных
  • 4. 4 Нужно помнить Принципы проектирования:Принципы проектирования: ● Эффективность ● Простота ● Переносимость ● Масштабируемость
  • 5. 5 Организация вычислений Pipeline Управляемые потоком данных Линейно? Рекурсивно? Разделение по задачам Линейно? Рекурсивно? Разделение по данным Рекурсивн. данные Постоянный ? Случайный? || на задачахГеометрическая декомпозиция Разделяй и властвуй Координация на событиях Виды организации
  • 6. 6 Геометрическая декомпозиция ПримерыПримеры ● Моделирование климата ● Фракталы ОсобенностиОсобенности ● Разделение структур данных: ● массивы — берём последовательные части ● списки — псевдоэлементы или подсписки ● графы - подграфы
  • 7. 7 Подходит «Parallel loops» OpenMPOpenMP #pragma omp parallel for schedule(static, 500) for(int i=0; i<n; i++) invariant_amount_of_work(i); Intel TBBIntel TBB parallel_for(blocked_range<int>(0, nElements, 100), ArraySummer( p_A, p_B, p_SUM_TBB ) ); А ещё есть: blocked_range2d и blocked_range3d
  • 8. 8 Ещё подходит SPMD Single Program Multiple Data: один код над разными данными, совершенно очевидная вещь — одна программа, управляющая вычислениями (процессами, потоками...) Шаги: ● Инициализироваться ● Раздать идентификаторы нитям/процессам ● Разделить данные ● Завершиться
  • 9. 9 Parallel Boost Graph Library ● MPI: распределённые графы ● Генераторы графов ● Алгоритмы: ● Поиск ● Кратчайший путь ● Минимальное остовное дерево ● Раскраска графа ● ...
  • 10. 10 Recursive data ЗадачаЗадача ● Как сделать || операции над рекурсивными структурами (списки, деревья, графы)? ПримерПример ● Найти в лесу корни деревьев РешениеРешение ● Последовательное O(N) операций / времени ● || O (N log N) операций / O (log N) времени
  • 11. 11 Организация вычислений Pipeline Управляемые потоком данных Линейно? Рекурсивно? Разделение по задачам Линейно? Рекурсивно? Разделение по данным Рекурсивн. данные Постоянный ? Случайный? || на задачахГеометрическая декомпозиция Разделяй и властвуй Координация на событиях Виды организации
  • 12. 12 || на задачах ПримерыПримеры ● Ray tracing ● Задачи молекулярной динамики ОсобенностиОсобенности ● Динамическое создание задач (методы ветвей и границ) ● Ожидание задач или его отсутствие (сортировка или поиск) ● Размер задач
  • 13. 13 Принципы разделения на задачи ● Задач >= числу потоков (ядер) ● Объём вычислений не превышает издержки ● Борьба с зависимостями (shared data — последний рубеж): ● Приветствуется дублирование данных (и, возможно, вычислений) и редукция ● Уборка индуцированных переменных в циклах ● Разделить зависимости по результату через редукцию по данным
  • 14. 14 Назначение задач на потоки ● Формирование очереди задач: notify — получаем классические: ● Producer/consumer — поток кладёт задачи ● Master/Worker — поток готовит задачи ● Приходят пулы потоков ● Выбор способа планирования: статическое/динамическое ● балансировка нагрузки: + к динамике ● минусы динамического назначения?
  • 15. 15 Организация вычислений Pipeline Управляемые потоком данных Линейно? Рекурсивно? Разделение по задачам Линейно? Рекурсивно? Разделение по данным Рекурсивн. данные Постоянный ? Случайный? || на задачахГеометрическая декомпозиция Разделяй и властвуй Координация на событиях Виды организации
  • 16. 16 Pipeline ПримерПример ● Обработка сигналов ● Видео ● Shell! «cat sampleFile | grep "word" | wc»
  • 18. 18 Local Serializer class Serializer { tbb::concurrent_queue<WorkItem*> queue; tbb::atomic<int> count; // Count of queued items and in-flight item void moveOneItemToReadyPile() { // Transfer item from queue to ReadyPile WorkItem* item; queue.try_pop(item); ReadyPile.add(item); } public: void add( WorkItem* item ) { queue.push(item); if( ++count==1 ) moveOneItemToReadyPile(); } void noteCompletion() { // Called when WorkItem completes. if( ‐‐count!=0 ) moveOneItemToReadyPile(); } };
  • 19. 19 Double check (lock) template<typename T, typename Mutex=tbb::mutex> class lazy { tbb::atomic<T*> value; Mutex mut; public: lazy() : value() {} // Initializes value to NULL ~lazy() {delete value;} T& get() { if( !value ) { // Read of value has acquire semantics. Mutex::scoped_lock lock(mut); if( !value ) value = new T(); // Write of value has release semantics } return *value; } };
  • 20. 20 Double check (lock-free) template<typename T> class lazy { tbb::atomic<T*> value; public: lazy() : value() {} // Initializes value to NULL ~lazy() {delete value;} T& get() { if( !value ) { T* tmp = new T(); if( value.compare_and_swap(tmp,NULL)!=NULL ) // Another thread installed the value, so throw away mine. delete tmp; } return *value; } };
  • 21. 21 Модели программ ● SPMD ● Каждый поток имеет id, по которому просит данные, выбирает итерации... ● Loop || ● Объединение вложенных циклов ● Уборка зависимостей по итерациям ● Возможна простая статическая балансировка ● Boss/Worker ● Нужна для динамической балансировки
  • 22. 22 -D_GLIBCXX_PARALLEL ● Несколько десятков реализаций алгоритмов из <algorithm>: find_if, max_element... ● Использует OpenMP