SlideShare a Scribd company logo
1 of 53
Download to read offline
КурносовМихаил Георгиевич 
E-mail: mkurnosov@gmail.com 
WWW: www.mkurnosov.net 
Курс “Высокопроизводительные вычислительные системы” 
Сибирский государственный университет телекоммуникаций и информатики (Новосибирск) 
Осенний семестр, 2014 
Лекция 8Intel Threading Building Blocks
Intel Threading Building Blocks 
2 
Intel Treading Building Blocks (TBB) – это кроссплатформенная библиотека шаблонов C++ для создания многопоточных программ 
История развития: 
o2006 –Intel TBB v1.0 (Intel compiler only) 
o2007 –Intel TBB v2.0 (Open Source, GPLv2) 
o2008–Intel TBB v2.1(thread affinity, cancellation) 
o2009–Intel TBB v2.2(C++0x lambda functions) 
o… 
o2011–Intel TBB v4.0 
o2012 –Intel TBB v4.1 
o2014–Intel TBB v4.3 
http://threadingbuildingblocks.org
Intel Threading Building Blocks 
3 
Open Source Community Version GPL v2 
Поддерживаемые операционные системы: 
oMicrosoft Windows {XP, 7, Server 2008, …} 
oGNU/Linux + Android 
oApple Mac OSX 10.7.4, … 
http://threadingbuildingblocks.org
Состав Intel TBB 
4 
Алгоритмы:parallel_for,parallel_reduce, parallel_scan, parallel_while,parallel_do, parallel_pipeline,parallel_sort 
Контейнеры:concurrent_queue, concurrent_vector,concurrent_hash_map 
Аллокаторыпамяти:scalable_malloc,scalable_free, scalable_realloc,scalable_calloc, scalable_allocator,cache_aligned_allocator 
Мьютексы: mutex,spin_mutex,queuing_mutex, spin_rw_mutex,queuing_rw_mutex,recursive mutex 
Атомарные операции: fetch_and_add, fetch_and_increment,fetch_and_decrement, compare_and_swap,fetch_and_store 
Task-based parallelism (fork-join) + work stealing
Intel Threading Building Blocks 
5 
Intel TBB позволяет абстрагироваться от низкоуровневых потоков и распараллеливать программу в терминах параллельно выполняющихся задач(task parallelism) 
Задачи TBB “легче” потоков операционной системы 
Планировщик TBB использует механизм “work stealing” для распределения задач по потокам 
Все компоненты Intel TBB определены в пространстве имен C++ (namespace)“tbb”
Компиляция программ с Intel TBB 
6 
$ g++ –Wall –o prog./prog.cpp –ltbb 
C:> icl/MD prog.cpp tbb.lib 
GNU/Linux 
Microsoft Windows (Intel C++ Compiler)
// 
// tbb_hello.cpp: TBB Hello World 
// 
#include <cstdio> 
#include <tbb/tbb.h> 
// Function object 
classMyTask{ 
public: 
MyTask(constchar*name): name_(name) {} 
voidoperator()() const 
{ 
// Task code 
std::printf("Hello from task %sn", name_); 
} 
private: 
constchar *name_; 
}; 
Intel TBB: Hello World!
Intel TBB: Hello World! (продолжение) 
8 
intmain( ) 
{ 
tbb::task_grouptg; 
tg.run(MyTask("1")); // Spawn task 
tg.run(MyTask("2")); // Spawn task 
tg.wait(); // Wait tasks 
return0; 
}
Компиляция и запускtbb_hello 
9 
$ g++ -Wall -I~/opt/tbb/include  
-L~/opt/tbb/lib  
-o tbb_hello 
./tbb_hello.cpp-ltbb 
$ ./tbb_hello 
Hello from task 2 
Hello from task 1
Инициализация библиотеки 
10 
Любой поток использующий алгоритмыили планировщик TBB должен иметь инициализированный объект tbb::task_scheduler_init 
TBB >= 2.2 автоматически инициализирует планировщик 
Явная инициализация планировщика позволяет: 
управлять когда создается и уничтожается планировщик 
устанавливать количество используемых потоков выполнения 
устанавливать размер стека для потоков выполнения
Инициализация библиотеки 
11 
#include <tbb/task_scheduler_init.h> 
intmain() 
{ 
tbb::task_scheduler_initinit; 
return0; 
} 
Явная инициализация планировщика
Инициализация библиотеки 
12 
Конструктор класса task_scheduler_initпринимает два параметра: 
task_scheduler_init(intmax_threads=automatic, stack_size_typethread_stack_size=0); 
Допустимые значения параметра max_threads: 
task_scheduler_init::automatic – количество потоков определяется автоматически 
task_scheduler_init::deferred– инициализация откладывается до явного вызова метода task_scheduler_init::initialize(max_threads) 
Положительное целое–количество потоков
Инициализация библиотеки 
13 
#include <iostream> 
#include <tbb/task_scheduler_init.h> 
intmain() 
{ 
intn = tbb::task_scheduler_init::default_num_threads(); 
for(intp = 1; p <= n; ++p) { 
// Construct task scheduler with p threads 
tbb::task_scheduler_initinit(p); 
std::cout<< "Is active = "<< init.is_active() 
<< std::endl; 
} 
return0; 
}
Распараллеливание циклов 
14 
В TBB реализованы шаблоны параллельных алгоритмов 
parallel_for 
parallel_reduce 
parallel_scan 
parallel_do 
parallel_for_each 
parallel_pipeline 
parallel_sort 
parallel_invoke
parallel_for 
15 
voidsaxpy(floata, float*x, float*y, size_tn) 
{ 
for(size_ti= 0; i< n; ++i) 
y[i] += a * x[i]; 
} 
parallel_forпозволяет разбить пространство итерации на блоки (chunks), которые обрабатываются разными потоками 
Требуется создать класс, в котором перегруженный оператор вызова функции operator()содержит код обработки блока итераций
#include <iostream> 
#include <tbb/task_scheduler_init.h> 
#include <tbb/tick_count.h> 
#include <tbb/parallel_for.h> 
#include <tbb/blocked_range.h> 
classsaxpy_par{ 
public: 
saxpy_par(floata, float*x, float*y): 
a_(a), x_(x), y_(y) {} 
voidoperator()(constblocked_range<size_t> &r) const 
{ 
for(size_ti= r.begin(); i!= r.end(); ++i) 
y_[i] += a_ * x_[i]; 
} 
private: 
floatconsta_; 
float*constx_; 
float*consty_; 
}; 
parallel_for 
16
intmain() 
{ 
floata = 2.0; 
float*x, *y; 
size_tn = 100000000; 
x = newfloat[n]; 
y = newfloat[n]; 
for(size_ti= 0; i< n; ++i) 
x[i] = 5.0; 
tick_countt0 = tick_count::now(); 
task_scheduler_initinit(4); 
parallel_for(blocked_range<size_t>(0, n), saxpy_par(a, x, y), 
auto_partitioner()); 
tick_countt1 = tick_count::now(); 
cout<< "Time: "<< (t1 -t0).seconds() << " sec."<< endl; 
delete[] x; 
delete[] y; 
return0; 
} 
parallel_for 
17
intmain() 
{ 
floata = 2.0; 
float*x, *y; 
size_tn = 100000000; 
x = newfloat[n]; 
y = newfloat[n]; 
for(size_ti= 0; i< n; ++i) 
x[i] = 5.0; 
tick_countt0 = tick_count::now(); 
task_scheduler_initinit(4); 
parallel_for(blocked_range<size_t>(0, n), saxpy_par(a, x, y), 
auto_partitioner()); 
tick_countt1 = tick_count::now(); 
cout<< "Time: "<< (t1 -t0).seconds() << " sec."<< endl; 
delete[] x; 
delete[] y; 
return0; 
} 
parallel_for 
18 
Классblocked_range(begin, end, grainsize) описывает одномерное пространство итераций 
В Intel TBB доступно описание многомерных пространств итераций (blocked_range2d, ...)
affinity_partitioner 
19 
Класс affinity_partitionerзапоминает какими потоками выполнялись предыдущие итерации и пытается распределять блоки итераций с учетом этой информации –последовательные блоки назначаются на один и тот же поток для эффективного использования кеш-памяти 
intmain() 
{ 
// ... 
static affinity_partitionerap; 
parallel_for(blocked_range<size_t>(0, n), saxpy_par(a, x, y), ap); 
// ... 
return 0; 
}
intmain() 
{ 
// ... 
x = newfloat[n]; 
y = newfloat[n]; 
for(size_ti= 0; i< n; ++i) 
x[i] = 5.0; 
tick_countt0 = tick_count::now(); 
parallel_for(blocked_range<size_t>(0, n), 
[=](constblocked_range<size_t>& r) { 
for (size_ti= r.begin(); i!= r.end(); ++i) 
y[i] += a * x[i]; 
} 
); 
tick_countt1 = tick_count::now(); 
cout<< "Time: "<< (t1 -t0).seconds() << " sec."<< endl; 
delete[] x; 
delete[] y; 
return0; 
} 
parallel_for(C++11 lambda expressions) 
20
intmain() 
{ 
// ... 
x = newfloat[n]; 
y = newfloat[n]; 
for(size_ti= 0; i< n; ++i) 
x[i] = 5.0; 
tick_countt0 = tick_count::now(); 
parallel_for(blocked_range<size_t>(0, n), 
[=](constblocked_range<size_t>& r) { 
for (size_ti= r.begin(); i!= r.end(); ++i) 
y[i] += a * x[i]; 
} 
); 
tick_countt1 = tick_count::now(); 
cout<< "Time: "<< (t1 -t0).seconds() << " sec."<< endl; 
delete[] x; 
delete[] y; 
return0; 
} 
parallel_for(C++11 lambda expressions) 
21 
Анонимная функция (лямбда-функция, С++11) 
[=]–захватить все автоматические переменные 
(constblocked_range…) –аргументы функции 
{ ... } –код функции
parallel_reduce 
22 
floatreduce(float*x, size_tn) 
{ 
floatsum = 0.0; 
for(size_ti= 0; i< n; ++i) 
sum += x[i]; 
returnsum; 
} 
parallel_reduceпозволяет распараллеливать циклы и выполнять операцию редукции
classreduce_par{ 
public: 
floatsum; 
void operator()(constblocked_range<size_t> &r) 
{ 
floatsum_local= sum; 
float*xloc= x_; 
size_tend = r.end(); 
for(size_ti= r.begin(); i!= end; ++i) 
sum_local+= xloc[i]; 
sum = sum_local; 
} 
// Splitting constructor: вызывается при порождении новой задачи 
reduce_par(reduce_par& r, split): sum(0.0), x_(r.x_) {} 
// Join: объединяет результаты двух задач (текущей и r) 
voidjoin(constreduce_par& r) {sum += r.sum;} 
reduce_par(float*x): sum(0.0), x_(x) {} 
private: 
float*x_; 
}; 
parallel_reduce 
23
intmain() 
{ 
size_tn = 10000000; 
float*x = newfloat[n]; 
for(size_ti= 0; i< n; ++i) 
x[i] = 1.0; 
tick_countt0 = tick_count::now(); 
reduce_parr(x); 
parallel_reduce(blocked_range<size_t>(0, n), r); 
tick_countt1 = tick_count::now(); 
cout<< "Reduce: " << std::fixed << r.sum<< "n"; 
cout<< "Time: " << (t1 -t0).seconds() << " sec." << endl; 
delete[] x; 
return0; 
} 
parallel_reduce 
24
parallel_sort 
25 
voidparallel_sort(RandomAccessIteratorbegin, 
RandomAccessIteratorend, 
constCompare& comp); 
parallel_sortпозволяет упорядочивать последовательностиэлементов 
Применяется детерминированный алгоритм нестабильной сортировки с трудоемкостью O(nlogn)–алгоритм не гарантирует сохранения порядка следования элементов с одинаковыми ключами
parallel_sort 
26 
#include <cstdlib> 
#include <tbb/parallel_sort.h> 
using namespace std; 
using namespace tbb; 
intmain() 
{ 
size_tn = 10; 
float*x = newfloat[n]; 
for(size_ti= 0; i< n; ++i) 
x[i] = static_cast<float>(rand()) / RAND_MAX * 100; 
parallel_sort(x, x + n, std::greater<float>()); 
delete[] x; 
return 0; 
}
Планировщик задач (Task scheduler) 
27 
Intel TBB позволяет абстрагироваться от реальных потоков операционной системы и разрабатывать программу в терминах параллельных задач (task-based parallel programming) 
Запуск TBB-задачи примерно в 18 раз быстрее запуска потока POSIXв GNU/Linux (в Microsoft Windows примерно в 100 разбыстрее) 
В отличии от планировщика POSIX-потоков в GNU/Linux планировщик TBBреализует “не справедливую” (unfair) политику распределения задач по потокам
Числа Фибоначчи: sequential version 
28 
intfib(intn) 
{ 
if(n < 2) 
returnn; 
returnfib(n -1) + fib(n -2); 
}
intfib_par(intn) 
{ 
intval; 
fibtask& t = *new(task::allocate_root()) fibtask(n, &val); 
task::spawn_root_and_wait(t); 
returnval; 
} 
Числа Фибоначчи: parallel version 
29 
allocate_rootвыделяет память под корневую задачу(task)класса fibtask 
spawn_root_and_waitзапускает задачу на выполнение и ожидает её завершения
classfibtask: publictask{ 
public: 
constintn; 
int* constval; 
fibtask(intn_, int* val_): n(n_), val(val_) {} 
task* execute() 
{ 
if(n < 10) { 
*val= fib(n); // Use sequential version 
} else{ 
intx, y; 
fibtask& a = *new(allocate_child()) fibtask(n -1, &x); 
fibtask& b = *new(allocate_child()) fibtask(n -2, &y); 
// ref_count: 2 children + 1 for the wait 
set_ref_count(3); 
spawn(b); 
spawn_and_wait_for_all(a); 
*val= x + y; 
} 
returnNULL; 
} 
}; 
Числа Фибоначчи: parallel version 
30 
spawnзапускает задачу на выполнение и не ожидает её завершения 
spawn_and_wait_for_all–запускает задачу и ожидает завершения всех дочерних задач
intmain() 
{ 
intn = 42; 
tick_countt0 = tick_count::now(); 
intf = fib_par(n); 
tick_countt1 = tick_count::now(); 
cout<< "Fib = " << f << endl; 
cout<< "Time: " << std::fixed << (t1 -t0).seconds() 
<< " sec." << endl; 
return0; 
} 
Числа Фибоначчи: parallel version 
31
Граф задачи (Task graph) 
32 
Task A 
Depth = 0 
Refcount= 2 
Task B 
Depth = 1 
Refcount= 2 
Task C 
Depth = 2 
Refcount= 0 
Task D 
Depth = 2 
Refcount= 0 
Task E 
Depth = 1 
Refcount= 0
Планирование задач (Task scheduling) 
33 
Каждый поток поддерживает дек готовых к выполнению задач (deque, двусторонняя очередь) 
Планировщик использует комбинированный алгоритма на основе обход графа задач в ширину и глубину 
Task E 
Task D 
Top: Oldest task 
Bottom: Youngest Task
Планирование задач (Task scheduling) 
34 
Листовые узлы в графе задач –это задачи готовые к выполнению (ready task, они не ожидают других) 
Потоки могу захватывать (steal) задачи из чужих деков (с их верхнего конца) 
Task E 
Task D 
Top: Oldest task 
Bottom: Youngest Task 
Top: Oldest task 
Bottom: Youngest Task
Выбор задачи из дека 
35 
Задача для выполнения выбирается одним из следующих способов (в порядке уменьшения приоритета): 
1.Выбирается задача, на которую возвращен указатель методом executeпредыдущей задачи 
2.Выбирается задача с нижнего конца (bottom) дека потока 
3.Выбирается первая задача из дека (с его верхнего конца) случайно выбранного потока–work stealing
Помещение задачи в дек потока 
36 
Задачи помещаются в дек с его нижнего конца 
В дек помещается задача порожденная методомspawn 
Задача может быть направлена на повторное выполнение методом task::recycle_to_reexecute 
Задача имеет счетчик ссылок (reference count) равный нулю –все дочерние задачи завершены
Потокобезопасныеконтейнеры 
37 
Intel TBB предоставляет классы контейнеров (concurrent containers), которые корректно могут обновляться из нескольких потоков 
Для работы в многопоточной программе со стандартными контейнерами STL доступ к ним необходимо защищать блокировками (мьютексами) 
Особенности Intel TBB: 
oпри работе с контейнерами применяет алгоритмы не требующие блокировок (lock-free algorithms) 
oпри необходимости блокируются лишь небольшие участки кода контейнеров (fine-grained locking)
Потокобезопасныеконтейнеры 
38 
concurrent_hash_map 
concurrent_vector 
concurrent_queue
concurrent_vector 
39 
voidappend(concurrent_vector<char> &vec, constchar*str) 
{ 
size_tn = strlen(str) + 1; 
std::copy(str, str+ n, 
vec.begin() + vec.grow_by(n)); 
} 
Метод grow_by(n)безопасно добавляет nэлементов к векторуconcurrent_vector
Взаимные исключения (Mutual exclusion) 
40 
Взаимные исключения (mutual exclusion)позволяют управлять количеством потоков, одновременно выполняющих заданный участок кода 
В Intel TBB взаимные исключения реализованы средствами мьютексов(mutexes) и блокировок (locks) 
Мьютекс(mutex)–это объект синхронизации, который в любой момент времени может быть захвачен только одним потоком, остальные потоки ожидают его освобождения
Свойства мьютексовIntel TBB 
41 
Scalable 
Fair–справедливые мьютексызахватываются в порядке обращения к ним потоков (даже если следующий поток в очереди находится в состоянии сна; несправедливыемьютексымогут быть быстрее) 
Recursive–рекурсивные мьютексыпозволяют потоку захватившему мьютексповторно его получить 
Yield–при длительном ожидании мьютексапоток периодически проверяет его текущее состояние и снимает себя с процессора (засыпает, в GNU/Linux вызывается sched_yield(),а в Microsoft Windows –SwitchToThread()) 
Block–потока освобождает процессор до тех пор, пока не освободится мьютекс(такие мьютексырекомендуется использовать при длительных ожиданиях)
МьютексыIntel TBB 
42 
spin_mutex–поток ожидающий освобождения мьютексавыполняет пустой цикл ожидания (busy wait) 
spin_mutexрекомендуется использовать для защиты небольших участков кода (нескольких инструкций) 
queuing_mutex–scalable, fair, non-recursive, spins in user space 
spin_rw_mutex–spin_mutex+ reader lock 
mutexи recursive_mutex–это обертки вокруг взаимных исключений операционной системы (Microsoft Windows –CRITICAL_SECTION, GNU/Linux –мьютексыбиблиотеки pthread)
МьютексыIntel TBB 
43 
Mutex 
Scalable 
Fair 
Recursive 
LongWait 
Size 
mutex 
OSdep. 
OSdep. 
No 
Blocks 
>= 3 words 
recursive_mutex 
OSdep. 
OSdep. 
Yes 
Blocks 
>= 3 words 
spin_mutex 
No 
No 
No 
Yields 
1 byte 
queuing_mutex 
Yes 
Yes 
No 
Yields 
1 word 
spin_rw_mutex 
No 
No 
No 
Yields 
1 word 
queuing_rw_mutex 
Yes 
Yes 
No 
Yields 
1 word
spin_mutex 
44 
ListNode*FreeList; 
spin_mutexListMutex; 
ListNode*AllocateNode() 
{ 
ListNode*node; 
{ 
// Создать и захватить мьютекс(RAII) 
spin_mutex::scoped_locklock(ListMutex); 
node = FreeList; 
if(node) 
FreeList= node->next; 
}// Мьютексавтоматически освобождается 
if(!node) 
node = new ListNode() 
returnnode; 
}
spin_mutex 
45 
voidFreeNode(ListNode*node) 
{ 
spin_mutex::scoped_locklock(ListMutex); 
node->next = FreeList; 
FreeList= node; 
} 
Конструктор scoped_lockожидает освобождения мьютексаListMutex 
Структурный блок (операторные скобки {}) внутриAllocateNodeнужен для того, чтобы при выходе из него автоматически вызывался деструктор класса scoped_lock, который освобождает мьютекс 
Программная идиома RAII –Resource Acquisition Is Initialization (получение ресурса есть инициализация)
spin_mutex 
46 
ListNode*AllocateNode() 
{ 
ListNode*node; 
spin_mutex::scoped_locklock; 
lock.acquire(ListMutex); 
node = FreeList; 
if(node) 
FreeList= node->next; 
lock.release(); 
if(!node) 
node = new ListNode(); 
returnnode; 
} 
Если защищенный блок (acquire-release) сгенерирует исключение, то release вызван не будет! 
Используйте RAIIесли в пределах критической секции возможно возникновение исключительной ситуации
Атомарные операции (Atomic operations) 
47 
Атомарная операция(Atomic operation)–это операций, которая в любой момент времени выполняется только одним потоком 
Атомарные операции намного “легче”мьютексов– не требуют блокирования потоков 
TBB поддерживаем атомарные переменные 
atomic<T> AtomicVariableName
Атомарные операции (Atomic operations) 
48 
Операции над переменной atomic<T> x 
= x-чтение значения переменной x 
x = -запись в переменную xзначения и его возврат 
x.fetch_and_store(y) x= yи возврат старого значения x 
x.fetch_and_add(y) x+= yи возврат старого значения x 
x.compare_and_swap(y, z) если x= z, то x= y, возврат старого значения x
Атомарные операции (Atomic operations) 
49 
atomic<int> counter; 
unsigned intGetUniqueInteger() 
{ 
returncounter.fetch_and_add(1); 
}
Атомарные операции (Atomic operations) 
50 
atomic<int> Val; 
intUpdateValue() 
{ 
do{ 
v = Val; 
newv= f(v); 
} while(Val.compare_and_swap(newv, v) != v); 
returnv; 
}
Аллокаторыпамяти 
51 
Intel TBB предоставляет два аллокаторапамяти (альтернативы STL std::allocator) 
scalable_allocator<T>–обеспечивает параллельное выделение памяти нескольким потокам 
cache_aligned_allocator<T>–обеспечивает выделение блоков памяти, выравненных на границудлины кеш- линии (cacheline) 
Это позволяет избежать ситуации когда потоки на разных процессорах пытаются модифицировать разные слова памяти, попадающие в одну строку кэша, и как следствие, постоянно перезаписываемую из памяти в кеш
Аллокаторыпамяти 
52 
/* STL vector будет использовать аллокаторTBB */ 
std::vector<int, cache_aligned_allocator<int> > v;
Ссылки 
53 
James Reinders. Intel Threading Building Blocks. –O'Reilly, 2007. –336p. 
Intel Threading Building Blocks Documentation// http://software.intel.com/sites/products/documentation/doclib/tbb_sa/help/index.htm

More Related Content

What's hot

Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Mikhail Kurnosov
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...Alexey Paznikov
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Mikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияAlexey Paznikov
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Mikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...Alexey Paznikov
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Mikhail Kurnosov
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...Alexey Paznikov
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
 
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Platonov Sergey
 

What's hot (20)

Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
 

Viewers also liked

Лекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusЛекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusMikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Mikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...Mikhail Kurnosov
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Intel thread building blocks
Intel thread building blocksIntel thread building blocks
Intel thread building blocksSherin Bennet
 
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Mikhail Kurnosov
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelMikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Mikhail Kurnosov
 
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...Mikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очередиMikhail Kurnosov
 
Лекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиЛекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Mikhail Kurnosov
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаMikhail Kurnosov
 

Viewers also liked (20)

301132
301132301132
301132
 
Tbb описание
Tbb   описаниеTbb   описание
Tbb описание
 
Лекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusЛекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk Plus
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Intel thread building blocks
Intel thread building blocksIntel thread building blocks
Intel thread building blocks
 
I N T E L Final
I N T E L FinalI N T E L Final
I N T E L Final
 
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очереди
 
Лекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиЛекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимости
 
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поиска
 

Similar to Лекция 8. Intel Threading Building Blocks

Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Yandex
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...OdessaFrontend
 
Rust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноRust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноOpen-IT
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийAndrey Akinshin
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийMikhail Shcherbakov
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6Dmitry Soshnikov
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийAndrey Akinshin
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...Alexey Paznikov
 

Similar to Лекция 8. Intel Threading Building Blocks (20)

Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
 
Rust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноRust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатно
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
лекция 3
лекция 3лекция 3
лекция 3
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
 
Progr labrab-4-2013-c++
Progr labrab-4-2013-c++Progr labrab-4-2013-c++
Progr labrab-4-2013-c++
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
 

More from Mikhail Kurnosov

Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Mikhail Kurnosov
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Mikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Mikhail Kurnosov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Mikhail Kurnosov
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеMikhail Kurnosov
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовMikhail Kurnosov
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаMikhail Kurnosov
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыMikhail Kurnosov
 

More from Mikhail Kurnosov (16)

Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицы
 

Лекция 8. Intel Threading Building Blocks

  • 1. КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: www.mkurnosov.net Курс “Высокопроизводительные вычислительные системы” Сибирский государственный университет телекоммуникаций и информатики (Новосибирск) Осенний семестр, 2014 Лекция 8Intel Threading Building Blocks
  • 2. Intel Threading Building Blocks 2 Intel Treading Building Blocks (TBB) – это кроссплатформенная библиотека шаблонов C++ для создания многопоточных программ История развития: o2006 –Intel TBB v1.0 (Intel compiler only) o2007 –Intel TBB v2.0 (Open Source, GPLv2) o2008–Intel TBB v2.1(thread affinity, cancellation) o2009–Intel TBB v2.2(C++0x lambda functions) o… o2011–Intel TBB v4.0 o2012 –Intel TBB v4.1 o2014–Intel TBB v4.3 http://threadingbuildingblocks.org
  • 3. Intel Threading Building Blocks 3 Open Source Community Version GPL v2 Поддерживаемые операционные системы: oMicrosoft Windows {XP, 7, Server 2008, …} oGNU/Linux + Android oApple Mac OSX 10.7.4, … http://threadingbuildingblocks.org
  • 4. Состав Intel TBB 4 Алгоритмы:parallel_for,parallel_reduce, parallel_scan, parallel_while,parallel_do, parallel_pipeline,parallel_sort Контейнеры:concurrent_queue, concurrent_vector,concurrent_hash_map Аллокаторыпамяти:scalable_malloc,scalable_free, scalable_realloc,scalable_calloc, scalable_allocator,cache_aligned_allocator Мьютексы: mutex,spin_mutex,queuing_mutex, spin_rw_mutex,queuing_rw_mutex,recursive mutex Атомарные операции: fetch_and_add, fetch_and_increment,fetch_and_decrement, compare_and_swap,fetch_and_store Task-based parallelism (fork-join) + work stealing
  • 5. Intel Threading Building Blocks 5 Intel TBB позволяет абстрагироваться от низкоуровневых потоков и распараллеливать программу в терминах параллельно выполняющихся задач(task parallelism) Задачи TBB “легче” потоков операционной системы Планировщик TBB использует механизм “work stealing” для распределения задач по потокам Все компоненты Intel TBB определены в пространстве имен C++ (namespace)“tbb”
  • 6. Компиляция программ с Intel TBB 6 $ g++ –Wall –o prog./prog.cpp –ltbb C:> icl/MD prog.cpp tbb.lib GNU/Linux Microsoft Windows (Intel C++ Compiler)
  • 7. // // tbb_hello.cpp: TBB Hello World // #include <cstdio> #include <tbb/tbb.h> // Function object classMyTask{ public: MyTask(constchar*name): name_(name) {} voidoperator()() const { // Task code std::printf("Hello from task %sn", name_); } private: constchar *name_; }; Intel TBB: Hello World!
  • 8. Intel TBB: Hello World! (продолжение) 8 intmain( ) { tbb::task_grouptg; tg.run(MyTask("1")); // Spawn task tg.run(MyTask("2")); // Spawn task tg.wait(); // Wait tasks return0; }
  • 9. Компиляция и запускtbb_hello 9 $ g++ -Wall -I~/opt/tbb/include -L~/opt/tbb/lib -o tbb_hello ./tbb_hello.cpp-ltbb $ ./tbb_hello Hello from task 2 Hello from task 1
  • 10. Инициализация библиотеки 10 Любой поток использующий алгоритмыили планировщик TBB должен иметь инициализированный объект tbb::task_scheduler_init TBB >= 2.2 автоматически инициализирует планировщик Явная инициализация планировщика позволяет: управлять когда создается и уничтожается планировщик устанавливать количество используемых потоков выполнения устанавливать размер стека для потоков выполнения
  • 11. Инициализация библиотеки 11 #include <tbb/task_scheduler_init.h> intmain() { tbb::task_scheduler_initinit; return0; } Явная инициализация планировщика
  • 12. Инициализация библиотеки 12 Конструктор класса task_scheduler_initпринимает два параметра: task_scheduler_init(intmax_threads=automatic, stack_size_typethread_stack_size=0); Допустимые значения параметра max_threads: task_scheduler_init::automatic – количество потоков определяется автоматически task_scheduler_init::deferred– инициализация откладывается до явного вызова метода task_scheduler_init::initialize(max_threads) Положительное целое–количество потоков
  • 13. Инициализация библиотеки 13 #include <iostream> #include <tbb/task_scheduler_init.h> intmain() { intn = tbb::task_scheduler_init::default_num_threads(); for(intp = 1; p <= n; ++p) { // Construct task scheduler with p threads tbb::task_scheduler_initinit(p); std::cout<< "Is active = "<< init.is_active() << std::endl; } return0; }
  • 14. Распараллеливание циклов 14 В TBB реализованы шаблоны параллельных алгоритмов parallel_for parallel_reduce parallel_scan parallel_do parallel_for_each parallel_pipeline parallel_sort parallel_invoke
  • 15. parallel_for 15 voidsaxpy(floata, float*x, float*y, size_tn) { for(size_ti= 0; i< n; ++i) y[i] += a * x[i]; } parallel_forпозволяет разбить пространство итерации на блоки (chunks), которые обрабатываются разными потоками Требуется создать класс, в котором перегруженный оператор вызова функции operator()содержит код обработки блока итераций
  • 16. #include <iostream> #include <tbb/task_scheduler_init.h> #include <tbb/tick_count.h> #include <tbb/parallel_for.h> #include <tbb/blocked_range.h> classsaxpy_par{ public: saxpy_par(floata, float*x, float*y): a_(a), x_(x), y_(y) {} voidoperator()(constblocked_range<size_t> &r) const { for(size_ti= r.begin(); i!= r.end(); ++i) y_[i] += a_ * x_[i]; } private: floatconsta_; float*constx_; float*consty_; }; parallel_for 16
  • 17. intmain() { floata = 2.0; float*x, *y; size_tn = 100000000; x = newfloat[n]; y = newfloat[n]; for(size_ti= 0; i< n; ++i) x[i] = 5.0; tick_countt0 = tick_count::now(); task_scheduler_initinit(4); parallel_for(blocked_range<size_t>(0, n), saxpy_par(a, x, y), auto_partitioner()); tick_countt1 = tick_count::now(); cout<< "Time: "<< (t1 -t0).seconds() << " sec."<< endl; delete[] x; delete[] y; return0; } parallel_for 17
  • 18. intmain() { floata = 2.0; float*x, *y; size_tn = 100000000; x = newfloat[n]; y = newfloat[n]; for(size_ti= 0; i< n; ++i) x[i] = 5.0; tick_countt0 = tick_count::now(); task_scheduler_initinit(4); parallel_for(blocked_range<size_t>(0, n), saxpy_par(a, x, y), auto_partitioner()); tick_countt1 = tick_count::now(); cout<< "Time: "<< (t1 -t0).seconds() << " sec."<< endl; delete[] x; delete[] y; return0; } parallel_for 18 Классblocked_range(begin, end, grainsize) описывает одномерное пространство итераций В Intel TBB доступно описание многомерных пространств итераций (blocked_range2d, ...)
  • 19. affinity_partitioner 19 Класс affinity_partitionerзапоминает какими потоками выполнялись предыдущие итерации и пытается распределять блоки итераций с учетом этой информации –последовательные блоки назначаются на один и тот же поток для эффективного использования кеш-памяти intmain() { // ... static affinity_partitionerap; parallel_for(blocked_range<size_t>(0, n), saxpy_par(a, x, y), ap); // ... return 0; }
  • 20. intmain() { // ... x = newfloat[n]; y = newfloat[n]; for(size_ti= 0; i< n; ++i) x[i] = 5.0; tick_countt0 = tick_count::now(); parallel_for(blocked_range<size_t>(0, n), [=](constblocked_range<size_t>& r) { for (size_ti= r.begin(); i!= r.end(); ++i) y[i] += a * x[i]; } ); tick_countt1 = tick_count::now(); cout<< "Time: "<< (t1 -t0).seconds() << " sec."<< endl; delete[] x; delete[] y; return0; } parallel_for(C++11 lambda expressions) 20
  • 21. intmain() { // ... x = newfloat[n]; y = newfloat[n]; for(size_ti= 0; i< n; ++i) x[i] = 5.0; tick_countt0 = tick_count::now(); parallel_for(blocked_range<size_t>(0, n), [=](constblocked_range<size_t>& r) { for (size_ti= r.begin(); i!= r.end(); ++i) y[i] += a * x[i]; } ); tick_countt1 = tick_count::now(); cout<< "Time: "<< (t1 -t0).seconds() << " sec."<< endl; delete[] x; delete[] y; return0; } parallel_for(C++11 lambda expressions) 21 Анонимная функция (лямбда-функция, С++11) [=]–захватить все автоматические переменные (constblocked_range…) –аргументы функции { ... } –код функции
  • 22. parallel_reduce 22 floatreduce(float*x, size_tn) { floatsum = 0.0; for(size_ti= 0; i< n; ++i) sum += x[i]; returnsum; } parallel_reduceпозволяет распараллеливать циклы и выполнять операцию редукции
  • 23. classreduce_par{ public: floatsum; void operator()(constblocked_range<size_t> &r) { floatsum_local= sum; float*xloc= x_; size_tend = r.end(); for(size_ti= r.begin(); i!= end; ++i) sum_local+= xloc[i]; sum = sum_local; } // Splitting constructor: вызывается при порождении новой задачи reduce_par(reduce_par& r, split): sum(0.0), x_(r.x_) {} // Join: объединяет результаты двух задач (текущей и r) voidjoin(constreduce_par& r) {sum += r.sum;} reduce_par(float*x): sum(0.0), x_(x) {} private: float*x_; }; parallel_reduce 23
  • 24. intmain() { size_tn = 10000000; float*x = newfloat[n]; for(size_ti= 0; i< n; ++i) x[i] = 1.0; tick_countt0 = tick_count::now(); reduce_parr(x); parallel_reduce(blocked_range<size_t>(0, n), r); tick_countt1 = tick_count::now(); cout<< "Reduce: " << std::fixed << r.sum<< "n"; cout<< "Time: " << (t1 -t0).seconds() << " sec." << endl; delete[] x; return0; } parallel_reduce 24
  • 25. parallel_sort 25 voidparallel_sort(RandomAccessIteratorbegin, RandomAccessIteratorend, constCompare& comp); parallel_sortпозволяет упорядочивать последовательностиэлементов Применяется детерминированный алгоритм нестабильной сортировки с трудоемкостью O(nlogn)–алгоритм не гарантирует сохранения порядка следования элементов с одинаковыми ключами
  • 26. parallel_sort 26 #include <cstdlib> #include <tbb/parallel_sort.h> using namespace std; using namespace tbb; intmain() { size_tn = 10; float*x = newfloat[n]; for(size_ti= 0; i< n; ++i) x[i] = static_cast<float>(rand()) / RAND_MAX * 100; parallel_sort(x, x + n, std::greater<float>()); delete[] x; return 0; }
  • 27. Планировщик задач (Task scheduler) 27 Intel TBB позволяет абстрагироваться от реальных потоков операционной системы и разрабатывать программу в терминах параллельных задач (task-based parallel programming) Запуск TBB-задачи примерно в 18 раз быстрее запуска потока POSIXв GNU/Linux (в Microsoft Windows примерно в 100 разбыстрее) В отличии от планировщика POSIX-потоков в GNU/Linux планировщик TBBреализует “не справедливую” (unfair) политику распределения задач по потокам
  • 28. Числа Фибоначчи: sequential version 28 intfib(intn) { if(n < 2) returnn; returnfib(n -1) + fib(n -2); }
  • 29. intfib_par(intn) { intval; fibtask& t = *new(task::allocate_root()) fibtask(n, &val); task::spawn_root_and_wait(t); returnval; } Числа Фибоначчи: parallel version 29 allocate_rootвыделяет память под корневую задачу(task)класса fibtask spawn_root_and_waitзапускает задачу на выполнение и ожидает её завершения
  • 30. classfibtask: publictask{ public: constintn; int* constval; fibtask(intn_, int* val_): n(n_), val(val_) {} task* execute() { if(n < 10) { *val= fib(n); // Use sequential version } else{ intx, y; fibtask& a = *new(allocate_child()) fibtask(n -1, &x); fibtask& b = *new(allocate_child()) fibtask(n -2, &y); // ref_count: 2 children + 1 for the wait set_ref_count(3); spawn(b); spawn_and_wait_for_all(a); *val= x + y; } returnNULL; } }; Числа Фибоначчи: parallel version 30 spawnзапускает задачу на выполнение и не ожидает её завершения spawn_and_wait_for_all–запускает задачу и ожидает завершения всех дочерних задач
  • 31. intmain() { intn = 42; tick_countt0 = tick_count::now(); intf = fib_par(n); tick_countt1 = tick_count::now(); cout<< "Fib = " << f << endl; cout<< "Time: " << std::fixed << (t1 -t0).seconds() << " sec." << endl; return0; } Числа Фибоначчи: parallel version 31
  • 32. Граф задачи (Task graph) 32 Task A Depth = 0 Refcount= 2 Task B Depth = 1 Refcount= 2 Task C Depth = 2 Refcount= 0 Task D Depth = 2 Refcount= 0 Task E Depth = 1 Refcount= 0
  • 33. Планирование задач (Task scheduling) 33 Каждый поток поддерживает дек готовых к выполнению задач (deque, двусторонняя очередь) Планировщик использует комбинированный алгоритма на основе обход графа задач в ширину и глубину Task E Task D Top: Oldest task Bottom: Youngest Task
  • 34. Планирование задач (Task scheduling) 34 Листовые узлы в графе задач –это задачи готовые к выполнению (ready task, они не ожидают других) Потоки могу захватывать (steal) задачи из чужих деков (с их верхнего конца) Task E Task D Top: Oldest task Bottom: Youngest Task Top: Oldest task Bottom: Youngest Task
  • 35. Выбор задачи из дека 35 Задача для выполнения выбирается одним из следующих способов (в порядке уменьшения приоритета): 1.Выбирается задача, на которую возвращен указатель методом executeпредыдущей задачи 2.Выбирается задача с нижнего конца (bottom) дека потока 3.Выбирается первая задача из дека (с его верхнего конца) случайно выбранного потока–work stealing
  • 36. Помещение задачи в дек потока 36 Задачи помещаются в дек с его нижнего конца В дек помещается задача порожденная методомspawn Задача может быть направлена на повторное выполнение методом task::recycle_to_reexecute Задача имеет счетчик ссылок (reference count) равный нулю –все дочерние задачи завершены
  • 37. Потокобезопасныеконтейнеры 37 Intel TBB предоставляет классы контейнеров (concurrent containers), которые корректно могут обновляться из нескольких потоков Для работы в многопоточной программе со стандартными контейнерами STL доступ к ним необходимо защищать блокировками (мьютексами) Особенности Intel TBB: oпри работе с контейнерами применяет алгоритмы не требующие блокировок (lock-free algorithms) oпри необходимости блокируются лишь небольшие участки кода контейнеров (fine-grained locking)
  • 39. concurrent_vector 39 voidappend(concurrent_vector<char> &vec, constchar*str) { size_tn = strlen(str) + 1; std::copy(str, str+ n, vec.begin() + vec.grow_by(n)); } Метод grow_by(n)безопасно добавляет nэлементов к векторуconcurrent_vector
  • 40. Взаимные исключения (Mutual exclusion) 40 Взаимные исключения (mutual exclusion)позволяют управлять количеством потоков, одновременно выполняющих заданный участок кода В Intel TBB взаимные исключения реализованы средствами мьютексов(mutexes) и блокировок (locks) Мьютекс(mutex)–это объект синхронизации, который в любой момент времени может быть захвачен только одним потоком, остальные потоки ожидают его освобождения
  • 41. Свойства мьютексовIntel TBB 41 Scalable Fair–справедливые мьютексызахватываются в порядке обращения к ним потоков (даже если следующий поток в очереди находится в состоянии сна; несправедливыемьютексымогут быть быстрее) Recursive–рекурсивные мьютексыпозволяют потоку захватившему мьютексповторно его получить Yield–при длительном ожидании мьютексапоток периодически проверяет его текущее состояние и снимает себя с процессора (засыпает, в GNU/Linux вызывается sched_yield(),а в Microsoft Windows –SwitchToThread()) Block–потока освобождает процессор до тех пор, пока не освободится мьютекс(такие мьютексырекомендуется использовать при длительных ожиданиях)
  • 42. МьютексыIntel TBB 42 spin_mutex–поток ожидающий освобождения мьютексавыполняет пустой цикл ожидания (busy wait) spin_mutexрекомендуется использовать для защиты небольших участков кода (нескольких инструкций) queuing_mutex–scalable, fair, non-recursive, spins in user space spin_rw_mutex–spin_mutex+ reader lock mutexи recursive_mutex–это обертки вокруг взаимных исключений операционной системы (Microsoft Windows –CRITICAL_SECTION, GNU/Linux –мьютексыбиблиотеки pthread)
  • 43. МьютексыIntel TBB 43 Mutex Scalable Fair Recursive LongWait Size mutex OSdep. OSdep. No Blocks >= 3 words recursive_mutex OSdep. OSdep. Yes Blocks >= 3 words spin_mutex No No No Yields 1 byte queuing_mutex Yes Yes No Yields 1 word spin_rw_mutex No No No Yields 1 word queuing_rw_mutex Yes Yes No Yields 1 word
  • 44. spin_mutex 44 ListNode*FreeList; spin_mutexListMutex; ListNode*AllocateNode() { ListNode*node; { // Создать и захватить мьютекс(RAII) spin_mutex::scoped_locklock(ListMutex); node = FreeList; if(node) FreeList= node->next; }// Мьютексавтоматически освобождается if(!node) node = new ListNode() returnnode; }
  • 45. spin_mutex 45 voidFreeNode(ListNode*node) { spin_mutex::scoped_locklock(ListMutex); node->next = FreeList; FreeList= node; } Конструктор scoped_lockожидает освобождения мьютексаListMutex Структурный блок (операторные скобки {}) внутриAllocateNodeнужен для того, чтобы при выходе из него автоматически вызывался деструктор класса scoped_lock, который освобождает мьютекс Программная идиома RAII –Resource Acquisition Is Initialization (получение ресурса есть инициализация)
  • 46. spin_mutex 46 ListNode*AllocateNode() { ListNode*node; spin_mutex::scoped_locklock; lock.acquire(ListMutex); node = FreeList; if(node) FreeList= node->next; lock.release(); if(!node) node = new ListNode(); returnnode; } Если защищенный блок (acquire-release) сгенерирует исключение, то release вызван не будет! Используйте RAIIесли в пределах критической секции возможно возникновение исключительной ситуации
  • 47. Атомарные операции (Atomic operations) 47 Атомарная операция(Atomic operation)–это операций, которая в любой момент времени выполняется только одним потоком Атомарные операции намного “легче”мьютексов– не требуют блокирования потоков TBB поддерживаем атомарные переменные atomic<T> AtomicVariableName
  • 48. Атомарные операции (Atomic operations) 48 Операции над переменной atomic<T> x = x-чтение значения переменной x x = -запись в переменную xзначения и его возврат x.fetch_and_store(y) x= yи возврат старого значения x x.fetch_and_add(y) x+= yи возврат старого значения x x.compare_and_swap(y, z) если x= z, то x= y, возврат старого значения x
  • 49. Атомарные операции (Atomic operations) 49 atomic<int> counter; unsigned intGetUniqueInteger() { returncounter.fetch_and_add(1); }
  • 50. Атомарные операции (Atomic operations) 50 atomic<int> Val; intUpdateValue() { do{ v = Val; newv= f(v); } while(Val.compare_and_swap(newv, v) != v); returnv; }
  • 51. Аллокаторыпамяти 51 Intel TBB предоставляет два аллокаторапамяти (альтернативы STL std::allocator) scalable_allocator<T>–обеспечивает параллельное выделение памяти нескольким потокам cache_aligned_allocator<T>–обеспечивает выделение блоков памяти, выравненных на границудлины кеш- линии (cacheline) Это позволяет избежать ситуации когда потоки на разных процессорах пытаются модифицировать разные слова памяти, попадающие в одну строку кэша, и как следствие, постоянно перезаписываемую из памяти в кеш
  • 52. Аллокаторыпамяти 52 /* STL vector будет использовать аллокаторTBB */ std::vector<int, cache_aligned_allocator<int> > v;
  • 53. Ссылки 53 James Reinders. Intel Threading Building Blocks. –O'Reilly, 2007. –336p. Intel Threading Building Blocks Documentation// http://software.intel.com/sites/products/documentation/doclib/tbb_sa/help/index.htm