SlideShare a Scribd company logo
1 of 37
Download to read offline
Лекция 6:
Многопоточное программирование
Часть 2

(Multithreading programming)
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем
Сибирский государственный университет
телекоммуникаций и информатики
http://www.mkurnosov.net
Программный инструментарий
Прикладные библиотеки






Intel Threading Building Blocks (TBB)
Microsoft Concurrency Runtime
Apple Grand Central Dispatch
Boost Threads
Qthread, MassiveThreads

Языки программирования
 OpenMP
(C/C++/Fortran)
 Intel Cilk Plus
 С++11 Threads
 C11 Threads






C# Threads
Java Threads
Erlang Threads
Haskell Threads

Системные библиотеки (System libraries)

Уровень
пользователя
(User space)

GNU/Linux Pthreads
Thread

Thread

Уровень ядра
(Kernel space)

Win32 API/.NET Threads
Thread

Thread

Thread

Apple OS X Cocoa, Pthreads
Thread

Thread

…

Thread

Kernel
thread

…

Kernel
thread

Системные вызовы (System calls)
Kernel
thread

Kernel
thread

Kernel
thread

Kernel
thread

Kernel
thread

Kernel
thread

Process/thread scheduler

Операционная система (Operating System)
GNU/Linux, Microsoft Windows, Apple OS X, IBM AIX, Oracle Solaris, …
Hardware (Multi-core processors, SMP/NUMA)

2
Программный инструментарий
Прикладные библиотеки






Intel Threading Building Blocks (TBB)
Microsoft Concurrency Runtime
Apple Grand Central Dispatch
Boost Threads
Qthread, MassiveThreads

Языки программирования
 OpenMP
(C/C++/Fortran)
 Intel Cilk Plus
 С++11 Threads
 C11 Threads






C# Threads
Java Threads
Erlang Threads
Haskell Threads

Системные библиотеки (System libraries)

Уровень
пользователя
(User space)

GNU/Linux Pthreads
Thread

Thread

Уровень ядра
(Kernel space)

Win32 API/.NET Threads
Thread

Thread

Thread

Apple OS X Cocoa, Pthreads
Thread

Thread

…

Thread

Kernel
thread

…

Kernel
thread

Системные вызовы (System calls)
Kernel
thread

Kernel
thread

Kernel
thread

Kernel
thread

Kernel
thread

Kernel
thread

Process/thread scheduler

Операционная система (Operating System)
GNU/Linux, Microsoft Windows, Apple OS X, IBM AIX, Oracle Solaris, …
Hardware (Multi-core processors, SMP/NUMA)

3
Коэффициент ускорения (Speedup)
 Введем обозначения:
o

𝑻(𝒏) – это время выполнения последовательной программы
(sequential program)

o

𝑻 𝒑 (𝒏) – это время выполнения параллельной программы
(parallel program) на p процессорах

 Коэффициент S ускорения параллельной программ (Speedup):

𝑺𝒑 𝒏 =

𝑻(𝒏)
𝑻 𝒑 (𝒏)

 Коэффициент ускорения 𝑆 𝑝 𝑛 показывает во сколько раз
параллельная программа выполняется на p процессорах быстрее
последовательной программы при обработке одних и тех же входных
данных размера n
 Как правило 𝑆 𝑝 𝑛 ≤ 𝑝
4
Коэффициент ускорения (Speedup)
 Введем обозначения:
o

𝑻(𝒏) – это время выполнения последовательной программы
(sequential program)

o

𝑻 𝒑 (𝒏) – это время выполнения параллельной программы
(parallel program) на p процессорах

 Коэффициент S ускорения параллельной программ (Speedup):

𝑺𝒑 𝒏 =

𝑻(𝒏)
𝑻 𝒑 (𝒏)

 Цель распараллеливания – достичь линейного ускорения
на максимально большом числе процессоров
𝑺 𝒑 𝒏 ≈ 𝒑 или

𝑺 𝒑 𝒏 = 𝑶(𝒑) при 𝒑 → ∞
5
Коэффициент ускорения (Speedup)
 Какое время брать за 𝑻(𝒏) – за время выполнения
последовательной программы?
o Время лучшего известного алгоритма (в смысле вычислительной
сложности)?
o Время лучшего теоретически возможного алгоритма?
 Что считать временем выполнения 𝑻 𝒑 𝒏 параллельной
программы?

o Среднее время выполнения потоков программы?
o Время выполнения потока, завершившего работу первым?
o Время выполнения потока, завершившего работу последним?

6
Коэффициент ускорения (Speedup)
 Какое время брать за 𝑻(𝒏) – за время выполнения
последовательной программы?
o Время лучшего известного алгоритма или время алгоритма,
который подвергается распараллеливанию
 Что считать временем выполнения 𝑻 𝒑 𝒏 параллельной
программы?
o Время выполнения потока, завершившего работу последним

7
Коэффициент ускорения (Speedup)
 Коэффициент относительного ускорения (Relative speedup) –
отношения времени выполнения параллельной программы на одном
процессоре к времени её выполнения на p процессорах

𝑺 𝑹𝒆𝒍𝒂𝒕𝒊𝒗𝒆 𝒑, 𝒏 =

𝑻 𝟏 (𝒏)
𝑻 𝒑 (𝒏)

 Коэффициент эффективности (Efficiency) параллельной программы
𝑬𝒑

𝑺 𝒑 (𝒏)
𝑻(𝒏)
𝒏 =
=
∈ [𝟎, 𝟏]
𝒏
𝒏𝑻 𝒑 (𝒏)

 Коэффициент накладных расходов (Overhead)
𝑻 𝑺𝒚𝒏𝒄 (𝒑, 𝒏)
𝑻 𝑻𝒐𝒕𝒂𝒍 𝒑, 𝒏 − 𝑻 𝑪𝒐𝒎𝒑 (𝒑, 𝒏)
𝜺 𝒑, 𝒏 =
=
𝑻 𝑪𝒐𝒎𝒑 (𝒑, 𝒏)
𝑻 𝑪𝒐𝒎𝒑 (𝒑, 𝒏)


𝑻 𝑺𝒚𝒏𝒄 (𝒑, 𝒏) – время создания, синхронизации и взаимодействия p потоков



𝑻 𝑪𝒐𝒎𝒑 (𝒑, 𝒏) – время вычислений в каждом из p потоков

8
Коэффициент ускорения (Speedup)
35

S
Linear (ideal)

30

Speedup

25

N = 60 * 2^20

20

N = 40 * 2^20

15
10

N = 20 * 2^20

5

p

0

2

4

6

8

10

12

14

16

18

20

22

24

26

28

30

32

Processors

Зависимость коэффициента ускорения S
параллельного алгоритма X от количества p процессоров



Ускорение программы может расти с увеличением размера входных данных –
время вычислений превосходит накладные расходы на взаимодействия
потоков (управление потоками, синхронизацию, обмен сообщениями, …)
9
Коэффициент ускорения (Speedup)
35

S
Linear (ideal)

Линейное ускорение

30

Sp(n) = 4/5 * p = O(p)

N = 60 * 2^20

Speedup

25

Линейное ускорение

20

N = 40 * 2^20

Sp(n) = 1/5 * p = O(p)

15
10

N = 20 * 2^20

5

p

0

2

4

6

8

10

12

14

16

18

20

22

24

26

28

30

32

Processors

Зависимость коэффициента ускорения S
параллельного алгоритма X от количества p процессоров



Ускорение программы может расти с увеличением размера входных данных –
время вычислений превосходит накладные расходы на взаимодействия
потоков (управление потоками, синхронизацию, обмен сообщениями, …)
10
Коэффициент ускорения (Speedup)
 Параллельная программа (алгоритм) коэффициент
ускорения, которой линейной растет с увеличением p
называется линейно масштабируемой или просто
масштабируемой (scalable)
 Масштабируемая параллельная программа допускает
эффективную реализацию на различном числе
процессоров

11
Коэффициент ускорения (Speedup)
35

S

30

Sp(n) = log2p = O(log2p)

25

Speedup

Linear (ideal)

Логарифмическое ускорение

20

𝑺𝒑 𝒏 =

15

𝒑 = 𝑶( 𝒑)

10
5

p

0

2

4

6

8

10

12

14

16

18

20

22

24

26

28

30

32

Processors

Зависимость коэффициента ускорения S
параллельных алгоритмов Y и Z от количества p процессоров

12
Суперлинейное ускорение (Superlinear speedup)


Параллельная программа может характеризоваться суперлинейным
ускорением (Superlinear speedup) – коэффициент ускорения Sp(n) принимает
значение больше p

𝑺𝒑 𝒏 > 𝒑


Причина: иерархическая организация памяти:
Cache – RAM – Local disk (HDD/SSD) – Network storage



Последовательная программ выполняется на одном процессоре
и обрабатывает данные размера n



Параллельная программа имеет p потоков на p процессорах, каждый поток
работает со своей частью данных, большая часть которых может попасть
в кеш-память, в результате в каждом потоке сокращается время доступа
к данным



Тот же самый эффект можно наблюдать имя два уровня иерархической
памяти: диск-память

13
Суперлинейное ускорение (Superlinear speedup)

Superlinear speedup
𝑻𝟒
𝑺𝟖 =
= 𝟐. 𝟑𝟐
𝑻𝟖

Parallel Molecular Dynamic Simulation
MPI, Spatial decomposition;
Cluster nodes: 2 x AMD Opteron Dual Core; InfiniBand network
http://phycomp.technion.ac.il/~pavelba/Comp_Phys/Project/Project.html

14
Закон Дж. Амдала (Amdahl’s law)


Пусть имеется последовательная программа c временем выполнения T(n)



Обозначим:


r





𝒓 ∈ [𝟎, 𝟏] – часть программы, которая может быть распараллелена
(perfectly parallelized)
𝒔 = 𝟏 − 𝒓 – часть программы, которая не может быть распараллелена
(purely sequential)

s

Закон Дж. Амдала (Gene Amdahl) [1]:
Максимальное ускорение Sp программы на p процессорах равняется

𝑺𝒑 =

𝑺∞ = lim 𝑆 𝑝 = lim
𝑝→∞



𝑝→∞

𝟏

𝟏− 𝒓 +

𝒓
𝒑

1

1
𝟏
=
=
𝑟
1− 𝑟
𝒔
1− 𝑟 + 𝑝

Amdahl Gene. Validity of the Single Processor Approach to Achieving Large-Scale Computing Capabilities //
AFIPS Conference Proceedings, 1967, pp. 483-485, http://www-inst.eecs.berkeley.edu/~n252/paper/Amdahl.pdf

15
Обоснование закона Дж. Амдала


Время выполнения последовательной программы есть 𝑇(𝑛)



Время выполнения параллельной программы на p процессорах
(время каждого потока) складывается из последовательной части s
и параллельной r:
𝑇𝑝



𝑇(𝑛)
𝑛 = 𝑇 𝑛 𝑠+
𝑟
𝑝

r
s

Вычислим значение коэффициент ускорения (по определению)

𝑆𝑝 𝑛 =

𝑇(𝑛)
=
𝑇𝑝 𝑛

𝑇(𝑛)
1
1
=
=
𝑟
𝑟
𝑇(𝑛)
𝑠+
(1 − 𝑟) +
𝑇 𝑛 𝑠+
𝑟
𝑝
𝑝
𝑝

16
Закон Дж. Амдала (Amdahl’s law)
25

S∞

20

15
10
5

r

0

0,1

0,2

0,3

0,4

0,5

0,6

0,7

0,8

0,9

0,95

Зависимость коэффициента S∞ ускорения
параллельной программы от доли r распараллеленного кода

17
Закон Дж. Амдала (Amdahl’s law)
Допущения закона Амдала


Последовательный алгоритм является наиболее оптимальным способом
решения задачи. Возможны ситуации когда параллельная программа
(алгоритм) эффективнее решает задачу (может эффективнее использовать
кеш-память, конвейер, SIMD-инструкции, …)



Время выполнения параллельной программы оценивается через время
выполнения последовательной, однако потоки параллельной программы
могут выполнятся эффективнее
𝑇𝑝



𝑇(𝑛)
𝑛 = 𝑇 𝑛 𝑠+
𝑟
𝑝

Ускорение Sp(n) оценивается для фиксированного размера n данных при
любых значениях p. На практике при увеличении числа используемых
процессоров размер n входных данных также увеличивают, так как может
быть доступно больше памяти

18
Закон Дж. Амдала (Amdahl’s law)
 Следствие. Увеличение параллельной части r программ важнее,
чем увеличение количества процессоров
90

T, %

80

r = 30%

70
60
50

r = 60%

40
30
20

r = 90%

10

p

0

2

4

8

16

32

Зависимость времени Tp(n) выполнения параллельной программы
от количества p процессоров и доли r распараллеленного кода
(время в % от времени T1(n))

19
Закон Дж. Амдала (Amdahl’s law)
 Следствие. Увеличение параллельной части r программ важнее,
чем увеличение количества процессоров
90

Удвоение числа процессоров
сокращает время
с 85% до 77,5%

T, %

80

r = 30%

70
60
50

r = 60%

40
30
20

r = 90%

10

Удвоение доли параллельного
0
кода сокращает время
4
с 85% до 70%2

p
8

16

32

Зависимость времени Tp(n) выполнения параллельной программы
от количества p процессоров и доли r распараллеленного кода
(время в % от времени T1(n))

20
Закон Густафсона-Барсиса


В 1980-х годах показали, что некоторые практические приложения могут
масштабироваться лучше (почти линейно), чем предсказывает закон Амдала!



Пусть имеется последовательная программа c временем выполнения T(n)



Обозначим 𝒔 ∈ [𝟎, 𝟏] – часть программы, которая не может быть распараллелена
(purely sequential)



Закон Густафсона-Барсиса (Gustafson–Barsis' law) [1]:
Масштабируемое ускорение Sp программы на p процессорах равняется

𝑺 𝒑 = 𝒑 − 𝒔(𝒑 − 𝟏)
 Обоснование
Пусть a – время последовательной части, b – время параллельной части
𝑻 𝒑 𝒏 = 𝒂 + 𝒃,
𝐬 = 𝒂/(𝒂 + 𝒃),

𝑻 𝒏 = 𝒂 + 𝒑𝒃

𝑺 𝒑 𝒏 = 𝒔 + 𝒑 𝟏 − 𝒔 = 𝒑 − 𝒔(𝒑 − 𝟏)



Время выполнения последовательной программы выражается через время выполнения
параллельной



Reevaluating Amdahl's Law, John L. Gustafson, Communications of the ACM 31(5), 1988. pp. 532-533 //
http://www.scl.ameslab.gov/Publications/Gus/AmdahlsLaw/Amdahls.html

21
POSIX Threads
 POSIX Threads – это стандарт (POSIX.1c Threads extensions
(IEEE Std 1003.1c-1995)), в котором определяется API
для создания и управления потоками
 Библиотека pthread (pthread.h) ~ 100 функций





Thread management - creating, joining threads etc.
Mutexes
Condition variables
Synchronization between threads using read/write locks and
barriers

 Семфафоры POSIX (префикс sem_) могут работать
с потоками pthread, но не являются частью стандарта
(определены в стандарте POSIX.1b, Real-time extensions
(IEEE Std 1003.1b-1993))
22
POSIX pthreads API
 Всем типы данных и функции начинаются с префикса pthread_
Prefix

Functional group

pthread_

Threads themselves and miscellaneous
subroutines

pthread_attr_

Thread attributes objects

pthread_mutex_

Mutexes

pthread_mutexattr_

Mutex attributes objects.

pthread_cond_

Condition variables

pthread_condattr_

Condition attributes objects

pthread_key_

Thread-specific data keys

pthread_rwlock_

Read/write locks

pthread_barrier_

Synchronization barriers

https://computing.llnl.gov/tutorials/pthreads
23
POSIX pthreads API
 Компиляция программы с поддержкой POSIX pthreads API
Compiler / Platform

Compiler Command

Description

Intel
GNU/Linux

icc -pthread

C

icpc -pthread

C++

PGI
GNU/Linux

pgcc -lpthread

C

pgCC -lpthread

C++

GNU GCC
GNU/Linux, Blue Gene

gcc -pthread

GNU C

g++ -pthread

GNU C++

IBM
Blue Gene

bgxlc_r

/

bgcc_r

bgxlC_r, bgxlc++_r

C (ANSI / non-ANSI)
C++

24
Создание потоков
int pthread_create(pthread_t *restrict thread,
const pthread_attr_t *restrict attr,
void *(*start_routine)(void*),
void *restrict arg);

 Создает поток с заданными атрибутами attr и запускает в нем
функцию start_routine, передавая ей аргумент arg
 Количество создаваемых в процессе потоков стандартом
не ограничивается и зависит от реализации
 Размер стека потока можно задать через атрибут потока attr
 Размер стека по умолчанию: getrlimit(RLIMIT_STRACK, &rlim);
$ ulimit –s

# The maximum stack size

8192
$ ulimit –u

# The maximum number of processes

1024

#

available to a single usere

25
Завершение потоков
 Возврат (return) из стартовой функции (start_routine)
 Вызов pthread_exit()

 Вызов pthread_cancel() другим потоком
 Процесс (и его потоки) завершаются вызовом exit()

26
Создание и завершение потоков
#include <pthread.h>
#define NTHREADS 5
void *thread_fun(void *threadid) {
long tid = (long)threadid;
printf("Hello from %ld!n", tid);
pthread_exit(NULL);
}

int main(int argc, char *argv[]) {
pthread_t threads[NTHREADS];
int rc; long t;
for (t = 0; t < NTHREADS; t++) {
rc = pthread_create(&threads[t], NULL, thread_fun, (void *)t);
if (rc) {
printf("ERROR %dn", rc);
exit(-1);
}
}
pthread_exit(NULL);
}

27
Создание и завершение потоков
#include <pthread.h> prog ./prog.c
$ gcc –pthread –o
#define NTHREADS 5
$ ./prog
void *thread_fun(void *threadid) {
Hello from 1!
long tid = (long)threadid;
Hello from 4! from %ld!n", tid);
printf("Hello
pthread_exit(NULL);
Hello from 0!
}
Hello from 2!
int main(int argc, char *argv[]) {
Hello from 3!
pthread_t threads[NTHREADS];
int rc; long t;
for (t = 0; t < NTHREADS; t++) {
rc = pthread_create(&threads[t], NULL, thread_fun, (void *)t);
if (rc) {
printf("ERROR %dn", rc);
exit(-1);
}
}
pthread_exit(NULL);
}

28
Ожидание потоков
 Функция pthread_join() – позволяет дождаться завершения заданного
потока
 Поток может быть типа “detached” или “joinable” (default)
 К detached-потоку не применима функция pthread_join
(поток создается и существует независимо от других)
 Joinable-поток требует хранения дополнительных данных
 Тип потока можно задать через его атрибуты или вызвав функцию
pthread_detach

29
Ожидание потоков
#include <pthread.h>
#define NTHREADS 5

// ...
int main(int argc, char *argv[]) {
pthread_t threads[NTHREADS];
int rc; long t;
void *status;
for (t = 0; t < NTHREADS; t++) {
rc = pthread_create(&threads[t], NULL, thread_fun,
(void *)t);
}
for (t = 0; t < NTHREADS; t++) {
rc = pthread_join(threads[t], &status);
}
pthread_exit(NULL);
}

30
Синхронизация потоков
 Функция pthread_self() – возвращает идентификатор потока
 Функция pthread_equal() – позволяет сравнить идентификаторы двух
потоков

31
Взаимные исключения (mutex)
 Mutex (mutual exclusion) – это объект синхронизации “взаимное
исключение”
 Мьютексы используются для создания критических секций
(critical sections) – областей кода, которые выполняются в любой
момент времени только одним потоком
 В критических секциях, как правило, содержится код работы
с разделяемыми переменными
 pthread_mutex_init() – инициализирует мьютекс

 pthread_mutex_destroy() – уничтожает мьютекс
 pthread_mutex_lock() – блокирует выполнение потока,
пока он не захватит (acquire) мьютекс
 pthread_mutex_trylock() – осуществляет попытку захватить мьютекс
 pthread_mutex_unlock() – освобождает (release) мьютекс
32
Взаимные исключения (mutex)
node_t *llist_delete(int value)
{
node_t *prev, *current;
prev = &head;
pthread_mutex_lock(&prev->lock);
while ((current = prev->link) != NULL) {
pthread_mutex_lock(&current->lock);
if (current->value == value) {
prev->link = current->link;
pthread_mutex_unlock(&current->lock);
pthread_mutex_unlock(&prev->lock);
current->link = NULL;
return current;
}
pthread_mutex_unlock(&prev->lock);
prev = current;
}
pthread_mutex_unlock(&prev->lock);
return NULL;
}

33
Вычисление числа π
 Приближенное вычисление числа π
1

𝜋=
0

4
2 𝑑𝑥
1+ 𝑥

𝑛

𝜋≈ℎ
𝑖=1

4
1 + (ℎ(𝑖 − 0.5))2

1
ℎ=
𝑛

4,50

4,00
3,50
3,00
2,50
2,00
1,50
1,00

0,50
0,00
0,00 0,10 0,20 0,30 0,40 0,50 0,60 0,70 0,80 0,90

34
pi.c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
volatile long double pi = 0.0;
pthread_mutex_t piLock;
long double intervals;
int numThreads;
void *computePI(void *id)
{
long double x, width, localSum = 0;
int i, threadID = *((int*)id);
width = 1.0 / intervals;
for (i = threadID ; i < intervals; i += numThreads) {
x = (i + 0.5) * width;
localSum += 4.0 / (1.0 + x * x);
}
localSum *= width;
pthread_mutex_lock(&piLock);
pi += localSum;
pthread_mutex_unlock(&piLock);
return NULL;
}

35
pi.c (продолжение)
int main(int argc, char **argv)
{
pthread_t *threads;
void *retval;
int *threadID;
int i;
if (argc == 3) {
intervals = atoi(argv[1]);
numThreads = atoi(argv[2]);
threads = malloc(numThreads * sizeof(pthread_t));
threadID = malloc(numThreads * sizeof(int));
pthread_mutex_init(&piLock, NULL);
for (i = 0; i < numThreads; i++) {
threadID[i] = i;
pthread_create(&threads[i], NULL, computePI, threadID + i);
}
for (i = 0; i < numThreads; i++)
pthread_join(threads[i], &retval);

printf("Estimation of pi is %32.30Lf n", pi);
} else {
printf("Usage: ./a.out <numIntervals> <numThreads>n");
}
return 0;
}

36
Ссылки


Эхтер Ш., Робертс Дж. Многоядерное программирование. – СПб.: Питер,
2010. – 316 с.



Эндрюс Г.Р. Основы многопоточного, параллельного и распределенного
программирования. – М.: Вильямс, 2003. – 512 с.



Darryl Gove. Multicore Application Programming: for Windows, Linux, and
Oracle Solaris. – Addison-Wesley, 2010. – 480 p.



Maurice Herlihy, Nir Shavit. The Art of Multiprocessor Programming. –
Morgan Kaufmann, 2008. – 528 p.



Richard H. Carver, Kuo-Chung Tai. Modern Multithreading : Implementing,
Testing, and Debugging Multithreaded Java and C++/Pthreads/Win32
Programs. – Wiley-Interscience, 2005. – 480 p.



Anthony Williams. C++ Concurrency in Action: Practical Multithreading. –
Manning Publications, 2012. – 528 p.



Träff J.L. Introduction to Parallel Computing //
http://www.par.tuwien.ac.at/teach/WS12/ParComp.html

37

More Related Content

What's hot

2010 Nikiforov diplom presentation
2010 Nikiforov diplom presentation2010 Nikiforov diplom presentation
2010 Nikiforov diplom presentationRF-Lab
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Лекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusЛекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusMikhail Kurnosov
 
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...Mikhail Kurnosov
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Mikhail Kurnosov
 
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыЛекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыAlexey Paznikov
 
Лекция 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
 
Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Dmitry Tsitelov
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)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
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времениTatyanazaxarova
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...Alexey Paznikov
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Mikhail Kurnosov
 
Многопоточные Алгоритмы (для BitByte 2014)
Многопоточные Алгоритмы (для BitByte 2014)Многопоточные Алгоритмы (для BitByte 2014)
Многопоточные Алгоритмы (для BitByte 2014)Roman Elizarov
 
Разработка систем управления для отечественных АКПП
Разработка систем управления для отечественных АКППРазработка систем управления для отечественных АКПП
Разработка систем управления для отечественных АКППMATLAB
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Mikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 
Lecture1: Introduction to Parallel Computing
Lecture1: Introduction to  Parallel ComputingLecture1: Introduction to  Parallel Computing
Lecture1: Introduction to Parallel ComputingAndrii Rodionov
 

What's hot (20)

2010 Nikiforov diplom presentation
2010 Nikiforov diplom presentation2010 Nikiforov diplom presentation
2010 Nikiforov diplom presentation
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusЛекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk Plus
 
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыЛекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времени
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
Многопоточные Алгоритмы (для BitByte 2014)
Многопоточные Алгоритмы (для BitByte 2014)Многопоточные Алгоритмы (для BitByte 2014)
Многопоточные Алгоритмы (для BitByte 2014)
 
Разработка систем управления для отечественных АКПП
Разработка систем управления для отечественных АКППРазработка систем управления для отечественных АКПП
Разработка систем управления для отечественных АКПП
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
 
CUDA-Aware MPI
CUDA-Aware MPICUDA-Aware MPI
CUDA-Aware MPI
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Lecture1: Introduction to Parallel Computing
Lecture1: Introduction to  Parallel ComputingLecture1: Introduction to  Parallel Computing
Lecture1: Introduction to Parallel Computing
 

Viewers also liked

О.В.Сухорослов "Многопотчное программирование. Часть 1"
О.В.Сухорослов "Многопотчное программирование. Часть 1"О.В.Сухорослов "Многопотчное программирование. Часть 1"
О.В.Сухорослов "Многопотчное программирование. Часть 1"Yandex
 
Java. Lecture 09. Network Programming
Java. Lecture 09. Network ProgrammingJava. Lecture 09. Network Programming
Java. Lecture 09. Network Programmingcolriot
 
О.В.Сухорослов "Многопотчное программирование. Часть 2"
О.В.Сухорослов "Многопотчное программирование. Часть 2"О.В.Сухорослов "Многопотчное программирование. Часть 2"
О.В.Сухорослов "Многопотчное программирование. Часть 2"Yandex
 
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...Mikhail Kurnosov
 
Масштабирование баз данных
Масштабирование баз данныхМасштабирование баз данных
Масштабирование баз данныхSQALab
 
Лекция 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
 

Viewers also liked (8)

О.В.Сухорослов "Многопотчное программирование. Часть 1"
О.В.Сухорослов "Многопотчное программирование. Часть 1"О.В.Сухорослов "Многопотчное программирование. Часть 1"
О.В.Сухорослов "Многопотчное программирование. Часть 1"
 
Java. Lecture 09. Network Programming
Java. Lecture 09. Network ProgrammingJava. Lecture 09. Network Programming
Java. Lecture 09. Network Programming
 
О.В.Сухорослов "Многопотчное программирование. Часть 2"
О.В.Сухорослов "Многопотчное программирование. Часть 2"О.В.Сухорослов "Многопотчное программирование. Часть 2"
О.В.Сухорослов "Многопотчное программирование. Часть 2"
 
Лекція №5
Лекція №5Лекція №5
Лекція №5
 
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...
 
Concurrency
ConcurrencyConcurrency
Concurrency
 
Масштабирование баз данных
Масштабирование баз данныхМасштабирование баз данных
Масштабирование баз данных
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
 

Similar to Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POSIX threads)

20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1Michael Karpov
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
инструменты параллельного программирования
инструменты параллельного программированияинструменты параллельного программирования
инструменты параллельного программированияAlexander Petrov
 
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)Michael Karpov
 
01 готовимся к экзамену по информатике. теория. задачи 2002
01  готовимся к экзамену по информатике. теория. задачи 200201  готовимся к экзамену по информатике. теория. задачи 2002
01 готовимся к экзамену по информатике. теория. задачи 2002dfdkfjs
 
кластеры и суперкомпьютеры
кластеры и суперкомпьютерыкластеры и суперкомпьютеры
кластеры и суперкомпьютерыnastena07051995
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Alexey Paznikov
 
Методики и инструменты для самостоятельного решения проблем в сети
Методики и инструменты для самостоятельного решения проблем в сетиМетодики и инструменты для самостоятельного решения проблем в сети
Методики и инструменты для самостоятельного решения проблем в сетиCisco Russia
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыMikhail Kurnosov
 
Стандарт MPI (Message Passing Interface)
Стандарт MPI (Message Passing Interface)Стандарт MPI (Message Passing Interface)
Стандарт MPI (Message Passing Interface)Mikhail Kurnosov
 
вспомогательные алгоритмы
вспомогательные алгоритмывспомогательные алгоритмы
вспомогательные алгоритмыЕлена Ключева
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...a15464321646213
 
Компонентная среда разработки инструментария нагрузочного тестирования
Компонентная среда разработки инструментария нагрузочного тестированияКомпонентная среда разработки инструментария нагрузочного тестирования
Компонентная среда разработки инструментария нагрузочного тестированияSQALab
 
Вебинар: Основы распараллеливания С++ программ при помощи OpenMP
Вебинар: Основы распараллеливания С++ программ при помощи OpenMPВебинар: Основы распараллеливания С++ программ при помощи OpenMP
Вебинар: Основы распараллеливания С++ программ при помощи OpenMPFlyElephant
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Platonov Sergey
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
 

Similar to Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POSIX threads) (20)

20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
 
инструменты параллельного программирования
инструменты параллельного программированияинструменты параллельного программирования
инструменты параллельного программирования
 
якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)якобовский - введение в параллельное программирование (1)
якобовский - введение в параллельное программирование (1)
 
01 готовимся к экзамену по информатике. теория. задачи 2002
01  готовимся к экзамену по информатике. теория. задачи 200201  готовимся к экзамену по информатике. теория. задачи 2002
01 готовимся к экзамену по информатике. теория. задачи 2002
 
кластеры и суперкомпьютеры
кластеры и суперкомпьютерыкластеры и суперкомпьютеры
кластеры и суперкомпьютеры
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
Методики и инструменты для самостоятельного решения проблем в сети
Методики и инструменты для самостоятельного решения проблем в сетиМетодики и инструменты для самостоятельного решения проблем в сети
Методики и инструменты для самостоятельного решения проблем в сети
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмы
 
Стандарт MPI (Message Passing Interface)
Стандарт MPI (Message Passing Interface)Стандарт MPI (Message Passing Interface)
Стандарт MPI (Message Passing Interface)
 
вспомогательные алгоритмы
вспомогательные алгоритмывспомогательные алгоритмы
вспомогательные алгоритмы
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...
 
Компонентная среда разработки инструментария нагрузочного тестирования
Компонентная среда разработки инструментария нагрузочного тестированияКомпонентная среда разработки инструментария нагрузочного тестирования
Компонентная среда разработки инструментария нагрузочного тестирования
 
Вебинар: Основы распараллеливания С++ программ при помощи OpenMP
Вебинар: Основы распараллеливания С++ программ при помощи OpenMPВебинар: Основы распараллеливания С++ программ при помощи OpenMP
Вебинар: Основы распараллеливания С++ программ при помощи OpenMP
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
 
лекция 2
лекция 2лекция 2
лекция 2
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
 
лр1
лр1лр1
лр1
 
Multithreading in go
Multithreading in goMultithreading in go
Multithreading in go
 

More from Mikhail Kurnosov

Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)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
 
Лекция 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
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Mikhail Kurnosov
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеMikhail Kurnosov
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовMikhail Kurnosov
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Mikhail Kurnosov
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаMikhail Kurnosov
 

More from Mikhail Kurnosov (20)

Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 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)
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 

Лекция 6: Многопоточное программирование: часть 2 (Speedup, Amdahl's law, POSIX threads)

  • 1. Лекция 6: Многопоточное программирование Часть 2 (Multithreading programming) Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net
  • 2. Программный инструментарий Прикладные библиотеки      Intel Threading Building Blocks (TBB) Microsoft Concurrency Runtime Apple Grand Central Dispatch Boost Threads Qthread, MassiveThreads Языки программирования  OpenMP (C/C++/Fortran)  Intel Cilk Plus  С++11 Threads  C11 Threads     C# Threads Java Threads Erlang Threads Haskell Threads Системные библиотеки (System libraries) Уровень пользователя (User space) GNU/Linux Pthreads Thread Thread Уровень ядра (Kernel space) Win32 API/.NET Threads Thread Thread Thread Apple OS X Cocoa, Pthreads Thread Thread … Thread Kernel thread … Kernel thread Системные вызовы (System calls) Kernel thread Kernel thread Kernel thread Kernel thread Kernel thread Kernel thread Process/thread scheduler Операционная система (Operating System) GNU/Linux, Microsoft Windows, Apple OS X, IBM AIX, Oracle Solaris, … Hardware (Multi-core processors, SMP/NUMA) 2
  • 3. Программный инструментарий Прикладные библиотеки      Intel Threading Building Blocks (TBB) Microsoft Concurrency Runtime Apple Grand Central Dispatch Boost Threads Qthread, MassiveThreads Языки программирования  OpenMP (C/C++/Fortran)  Intel Cilk Plus  С++11 Threads  C11 Threads     C# Threads Java Threads Erlang Threads Haskell Threads Системные библиотеки (System libraries) Уровень пользователя (User space) GNU/Linux Pthreads Thread Thread Уровень ядра (Kernel space) Win32 API/.NET Threads Thread Thread Thread Apple OS X Cocoa, Pthreads Thread Thread … Thread Kernel thread … Kernel thread Системные вызовы (System calls) Kernel thread Kernel thread Kernel thread Kernel thread Kernel thread Kernel thread Process/thread scheduler Операционная система (Operating System) GNU/Linux, Microsoft Windows, Apple OS X, IBM AIX, Oracle Solaris, … Hardware (Multi-core processors, SMP/NUMA) 3
  • 4. Коэффициент ускорения (Speedup)  Введем обозначения: o 𝑻(𝒏) – это время выполнения последовательной программы (sequential program) o 𝑻 𝒑 (𝒏) – это время выполнения параллельной программы (parallel program) на p процессорах  Коэффициент S ускорения параллельной программ (Speedup): 𝑺𝒑 𝒏 = 𝑻(𝒏) 𝑻 𝒑 (𝒏)  Коэффициент ускорения 𝑆 𝑝 𝑛 показывает во сколько раз параллельная программа выполняется на p процессорах быстрее последовательной программы при обработке одних и тех же входных данных размера n  Как правило 𝑆 𝑝 𝑛 ≤ 𝑝 4
  • 5. Коэффициент ускорения (Speedup)  Введем обозначения: o 𝑻(𝒏) – это время выполнения последовательной программы (sequential program) o 𝑻 𝒑 (𝒏) – это время выполнения параллельной программы (parallel program) на p процессорах  Коэффициент S ускорения параллельной программ (Speedup): 𝑺𝒑 𝒏 = 𝑻(𝒏) 𝑻 𝒑 (𝒏)  Цель распараллеливания – достичь линейного ускорения на максимально большом числе процессоров 𝑺 𝒑 𝒏 ≈ 𝒑 или 𝑺 𝒑 𝒏 = 𝑶(𝒑) при 𝒑 → ∞ 5
  • 6. Коэффициент ускорения (Speedup)  Какое время брать за 𝑻(𝒏) – за время выполнения последовательной программы? o Время лучшего известного алгоритма (в смысле вычислительной сложности)? o Время лучшего теоретически возможного алгоритма?  Что считать временем выполнения 𝑻 𝒑 𝒏 параллельной программы? o Среднее время выполнения потоков программы? o Время выполнения потока, завершившего работу первым? o Время выполнения потока, завершившего работу последним? 6
  • 7. Коэффициент ускорения (Speedup)  Какое время брать за 𝑻(𝒏) – за время выполнения последовательной программы? o Время лучшего известного алгоритма или время алгоритма, который подвергается распараллеливанию  Что считать временем выполнения 𝑻 𝒑 𝒏 параллельной программы? o Время выполнения потока, завершившего работу последним 7
  • 8. Коэффициент ускорения (Speedup)  Коэффициент относительного ускорения (Relative speedup) – отношения времени выполнения параллельной программы на одном процессоре к времени её выполнения на p процессорах 𝑺 𝑹𝒆𝒍𝒂𝒕𝒊𝒗𝒆 𝒑, 𝒏 = 𝑻 𝟏 (𝒏) 𝑻 𝒑 (𝒏)  Коэффициент эффективности (Efficiency) параллельной программы 𝑬𝒑 𝑺 𝒑 (𝒏) 𝑻(𝒏) 𝒏 = = ∈ [𝟎, 𝟏] 𝒏 𝒏𝑻 𝒑 (𝒏)  Коэффициент накладных расходов (Overhead) 𝑻 𝑺𝒚𝒏𝒄 (𝒑, 𝒏) 𝑻 𝑻𝒐𝒕𝒂𝒍 𝒑, 𝒏 − 𝑻 𝑪𝒐𝒎𝒑 (𝒑, 𝒏) 𝜺 𝒑, 𝒏 = = 𝑻 𝑪𝒐𝒎𝒑 (𝒑, 𝒏) 𝑻 𝑪𝒐𝒎𝒑 (𝒑, 𝒏)  𝑻 𝑺𝒚𝒏𝒄 (𝒑, 𝒏) – время создания, синхронизации и взаимодействия p потоков  𝑻 𝑪𝒐𝒎𝒑 (𝒑, 𝒏) – время вычислений в каждом из p потоков 8
  • 9. Коэффициент ускорения (Speedup) 35 S Linear (ideal) 30 Speedup 25 N = 60 * 2^20 20 N = 40 * 2^20 15 10 N = 20 * 2^20 5 p 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 Processors Зависимость коэффициента ускорения S параллельного алгоритма X от количества p процессоров  Ускорение программы может расти с увеличением размера входных данных – время вычислений превосходит накладные расходы на взаимодействия потоков (управление потоками, синхронизацию, обмен сообщениями, …) 9
  • 10. Коэффициент ускорения (Speedup) 35 S Linear (ideal) Линейное ускорение 30 Sp(n) = 4/5 * p = O(p) N = 60 * 2^20 Speedup 25 Линейное ускорение 20 N = 40 * 2^20 Sp(n) = 1/5 * p = O(p) 15 10 N = 20 * 2^20 5 p 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 Processors Зависимость коэффициента ускорения S параллельного алгоритма X от количества p процессоров  Ускорение программы может расти с увеличением размера входных данных – время вычислений превосходит накладные расходы на взаимодействия потоков (управление потоками, синхронизацию, обмен сообщениями, …) 10
  • 11. Коэффициент ускорения (Speedup)  Параллельная программа (алгоритм) коэффициент ускорения, которой линейной растет с увеличением p называется линейно масштабируемой или просто масштабируемой (scalable)  Масштабируемая параллельная программа допускает эффективную реализацию на различном числе процессоров 11
  • 12. Коэффициент ускорения (Speedup) 35 S 30 Sp(n) = log2p = O(log2p) 25 Speedup Linear (ideal) Логарифмическое ускорение 20 𝑺𝒑 𝒏 = 15 𝒑 = 𝑶( 𝒑) 10 5 p 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 Processors Зависимость коэффициента ускорения S параллельных алгоритмов Y и Z от количества p процессоров 12
  • 13. Суперлинейное ускорение (Superlinear speedup)  Параллельная программа может характеризоваться суперлинейным ускорением (Superlinear speedup) – коэффициент ускорения Sp(n) принимает значение больше p 𝑺𝒑 𝒏 > 𝒑  Причина: иерархическая организация памяти: Cache – RAM – Local disk (HDD/SSD) – Network storage  Последовательная программ выполняется на одном процессоре и обрабатывает данные размера n  Параллельная программа имеет p потоков на p процессорах, каждый поток работает со своей частью данных, большая часть которых может попасть в кеш-память, в результате в каждом потоке сокращается время доступа к данным  Тот же самый эффект можно наблюдать имя два уровня иерархической памяти: диск-память 13
  • 14. Суперлинейное ускорение (Superlinear speedup) Superlinear speedup 𝑻𝟒 𝑺𝟖 = = 𝟐. 𝟑𝟐 𝑻𝟖 Parallel Molecular Dynamic Simulation MPI, Spatial decomposition; Cluster nodes: 2 x AMD Opteron Dual Core; InfiniBand network http://phycomp.technion.ac.il/~pavelba/Comp_Phys/Project/Project.html 14
  • 15. Закон Дж. Амдала (Amdahl’s law)  Пусть имеется последовательная программа c временем выполнения T(n)  Обозначим:  r   𝒓 ∈ [𝟎, 𝟏] – часть программы, которая может быть распараллелена (perfectly parallelized) 𝒔 = 𝟏 − 𝒓 – часть программы, которая не может быть распараллелена (purely sequential) s Закон Дж. Амдала (Gene Amdahl) [1]: Максимальное ускорение Sp программы на p процессорах равняется 𝑺𝒑 = 𝑺∞ = lim 𝑆 𝑝 = lim 𝑝→∞  𝑝→∞ 𝟏 𝟏− 𝒓 + 𝒓 𝒑 1 1 𝟏 = = 𝑟 1− 𝑟 𝒔 1− 𝑟 + 𝑝 Amdahl Gene. Validity of the Single Processor Approach to Achieving Large-Scale Computing Capabilities // AFIPS Conference Proceedings, 1967, pp. 483-485, http://www-inst.eecs.berkeley.edu/~n252/paper/Amdahl.pdf 15
  • 16. Обоснование закона Дж. Амдала  Время выполнения последовательной программы есть 𝑇(𝑛)  Время выполнения параллельной программы на p процессорах (время каждого потока) складывается из последовательной части s и параллельной r: 𝑇𝑝  𝑇(𝑛) 𝑛 = 𝑇 𝑛 𝑠+ 𝑟 𝑝 r s Вычислим значение коэффициент ускорения (по определению) 𝑆𝑝 𝑛 = 𝑇(𝑛) = 𝑇𝑝 𝑛 𝑇(𝑛) 1 1 = = 𝑟 𝑟 𝑇(𝑛) 𝑠+ (1 − 𝑟) + 𝑇 𝑛 𝑠+ 𝑟 𝑝 𝑝 𝑝 16
  • 17. Закон Дж. Амдала (Amdahl’s law) 25 S∞ 20 15 10 5 r 0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 0,95 Зависимость коэффициента S∞ ускорения параллельной программы от доли r распараллеленного кода 17
  • 18. Закон Дж. Амдала (Amdahl’s law) Допущения закона Амдала  Последовательный алгоритм является наиболее оптимальным способом решения задачи. Возможны ситуации когда параллельная программа (алгоритм) эффективнее решает задачу (может эффективнее использовать кеш-память, конвейер, SIMD-инструкции, …)  Время выполнения параллельной программы оценивается через время выполнения последовательной, однако потоки параллельной программы могут выполнятся эффективнее 𝑇𝑝  𝑇(𝑛) 𝑛 = 𝑇 𝑛 𝑠+ 𝑟 𝑝 Ускорение Sp(n) оценивается для фиксированного размера n данных при любых значениях p. На практике при увеличении числа используемых процессоров размер n входных данных также увеличивают, так как может быть доступно больше памяти 18
  • 19. Закон Дж. Амдала (Amdahl’s law)  Следствие. Увеличение параллельной части r программ важнее, чем увеличение количества процессоров 90 T, % 80 r = 30% 70 60 50 r = 60% 40 30 20 r = 90% 10 p 0 2 4 8 16 32 Зависимость времени Tp(n) выполнения параллельной программы от количества p процессоров и доли r распараллеленного кода (время в % от времени T1(n)) 19
  • 20. Закон Дж. Амдала (Amdahl’s law)  Следствие. Увеличение параллельной части r программ важнее, чем увеличение количества процессоров 90 Удвоение числа процессоров сокращает время с 85% до 77,5% T, % 80 r = 30% 70 60 50 r = 60% 40 30 20 r = 90% 10 Удвоение доли параллельного 0 кода сокращает время 4 с 85% до 70%2 p 8 16 32 Зависимость времени Tp(n) выполнения параллельной программы от количества p процессоров и доли r распараллеленного кода (время в % от времени T1(n)) 20
  • 21. Закон Густафсона-Барсиса  В 1980-х годах показали, что некоторые практические приложения могут масштабироваться лучше (почти линейно), чем предсказывает закон Амдала!  Пусть имеется последовательная программа c временем выполнения T(n)  Обозначим 𝒔 ∈ [𝟎, 𝟏] – часть программы, которая не может быть распараллелена (purely sequential)  Закон Густафсона-Барсиса (Gustafson–Barsis' law) [1]: Масштабируемое ускорение Sp программы на p процессорах равняется 𝑺 𝒑 = 𝒑 − 𝒔(𝒑 − 𝟏)  Обоснование Пусть a – время последовательной части, b – время параллельной части 𝑻 𝒑 𝒏 = 𝒂 + 𝒃, 𝐬 = 𝒂/(𝒂 + 𝒃), 𝑻 𝒏 = 𝒂 + 𝒑𝒃 𝑺 𝒑 𝒏 = 𝒔 + 𝒑 𝟏 − 𝒔 = 𝒑 − 𝒔(𝒑 − 𝟏)  Время выполнения последовательной программы выражается через время выполнения параллельной  Reevaluating Amdahl's Law, John L. Gustafson, Communications of the ACM 31(5), 1988. pp. 532-533 // http://www.scl.ameslab.gov/Publications/Gus/AmdahlsLaw/Amdahls.html 21
  • 22. POSIX Threads  POSIX Threads – это стандарт (POSIX.1c Threads extensions (IEEE Std 1003.1c-1995)), в котором определяется API для создания и управления потоками  Библиотека pthread (pthread.h) ~ 100 функций     Thread management - creating, joining threads etc. Mutexes Condition variables Synchronization between threads using read/write locks and barriers  Семфафоры POSIX (префикс sem_) могут работать с потоками pthread, но не являются частью стандарта (определены в стандарте POSIX.1b, Real-time extensions (IEEE Std 1003.1b-1993)) 22
  • 23. POSIX pthreads API  Всем типы данных и функции начинаются с префикса pthread_ Prefix Functional group pthread_ Threads themselves and miscellaneous subroutines pthread_attr_ Thread attributes objects pthread_mutex_ Mutexes pthread_mutexattr_ Mutex attributes objects. pthread_cond_ Condition variables pthread_condattr_ Condition attributes objects pthread_key_ Thread-specific data keys pthread_rwlock_ Read/write locks pthread_barrier_ Synchronization barriers https://computing.llnl.gov/tutorials/pthreads 23
  • 24. POSIX pthreads API  Компиляция программы с поддержкой POSIX pthreads API Compiler / Platform Compiler Command Description Intel GNU/Linux icc -pthread C icpc -pthread C++ PGI GNU/Linux pgcc -lpthread C pgCC -lpthread C++ GNU GCC GNU/Linux, Blue Gene gcc -pthread GNU C g++ -pthread GNU C++ IBM Blue Gene bgxlc_r / bgcc_r bgxlC_r, bgxlc++_r C (ANSI / non-ANSI) C++ 24
  • 25. Создание потоков int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg);  Создает поток с заданными атрибутами attr и запускает в нем функцию start_routine, передавая ей аргумент arg  Количество создаваемых в процессе потоков стандартом не ограничивается и зависит от реализации  Размер стека потока можно задать через атрибут потока attr  Размер стека по умолчанию: getrlimit(RLIMIT_STRACK, &rlim); $ ulimit –s # The maximum stack size 8192 $ ulimit –u # The maximum number of processes 1024 # available to a single usere 25
  • 26. Завершение потоков  Возврат (return) из стартовой функции (start_routine)  Вызов pthread_exit()  Вызов pthread_cancel() другим потоком  Процесс (и его потоки) завершаются вызовом exit() 26
  • 27. Создание и завершение потоков #include <pthread.h> #define NTHREADS 5 void *thread_fun(void *threadid) { long tid = (long)threadid; printf("Hello from %ld!n", tid); pthread_exit(NULL); } int main(int argc, char *argv[]) { pthread_t threads[NTHREADS]; int rc; long t; for (t = 0; t < NTHREADS; t++) { rc = pthread_create(&threads[t], NULL, thread_fun, (void *)t); if (rc) { printf("ERROR %dn", rc); exit(-1); } } pthread_exit(NULL); } 27
  • 28. Создание и завершение потоков #include <pthread.h> prog ./prog.c $ gcc –pthread –o #define NTHREADS 5 $ ./prog void *thread_fun(void *threadid) { Hello from 1! long tid = (long)threadid; Hello from 4! from %ld!n", tid); printf("Hello pthread_exit(NULL); Hello from 0! } Hello from 2! int main(int argc, char *argv[]) { Hello from 3! pthread_t threads[NTHREADS]; int rc; long t; for (t = 0; t < NTHREADS; t++) { rc = pthread_create(&threads[t], NULL, thread_fun, (void *)t); if (rc) { printf("ERROR %dn", rc); exit(-1); } } pthread_exit(NULL); } 28
  • 29. Ожидание потоков  Функция pthread_join() – позволяет дождаться завершения заданного потока  Поток может быть типа “detached” или “joinable” (default)  К detached-потоку не применима функция pthread_join (поток создается и существует независимо от других)  Joinable-поток требует хранения дополнительных данных  Тип потока можно задать через его атрибуты или вызвав функцию pthread_detach 29
  • 30. Ожидание потоков #include <pthread.h> #define NTHREADS 5 // ... int main(int argc, char *argv[]) { pthread_t threads[NTHREADS]; int rc; long t; void *status; for (t = 0; t < NTHREADS; t++) { rc = pthread_create(&threads[t], NULL, thread_fun, (void *)t); } for (t = 0; t < NTHREADS; t++) { rc = pthread_join(threads[t], &status); } pthread_exit(NULL); } 30
  • 31. Синхронизация потоков  Функция pthread_self() – возвращает идентификатор потока  Функция pthread_equal() – позволяет сравнить идентификаторы двух потоков 31
  • 32. Взаимные исключения (mutex)  Mutex (mutual exclusion) – это объект синхронизации “взаимное исключение”  Мьютексы используются для создания критических секций (critical sections) – областей кода, которые выполняются в любой момент времени только одним потоком  В критических секциях, как правило, содержится код работы с разделяемыми переменными  pthread_mutex_init() – инициализирует мьютекс  pthread_mutex_destroy() – уничтожает мьютекс  pthread_mutex_lock() – блокирует выполнение потока, пока он не захватит (acquire) мьютекс  pthread_mutex_trylock() – осуществляет попытку захватить мьютекс  pthread_mutex_unlock() – освобождает (release) мьютекс 32
  • 33. Взаимные исключения (mutex) node_t *llist_delete(int value) { node_t *prev, *current; prev = &head; pthread_mutex_lock(&prev->lock); while ((current = prev->link) != NULL) { pthread_mutex_lock(&current->lock); if (current->value == value) { prev->link = current->link; pthread_mutex_unlock(&current->lock); pthread_mutex_unlock(&prev->lock); current->link = NULL; return current; } pthread_mutex_unlock(&prev->lock); prev = current; } pthread_mutex_unlock(&prev->lock); return NULL; } 33
  • 34. Вычисление числа π  Приближенное вычисление числа π 1 𝜋= 0 4 2 𝑑𝑥 1+ 𝑥 𝑛 𝜋≈ℎ 𝑖=1 4 1 + (ℎ(𝑖 − 0.5))2 1 ℎ= 𝑛 4,50 4,00 3,50 3,00 2,50 2,00 1,50 1,00 0,50 0,00 0,00 0,10 0,20 0,30 0,40 0,50 0,60 0,70 0,80 0,90 34
  • 35. pi.c #include <stdio.h> #include <stdlib.h> #include <pthread.h> volatile long double pi = 0.0; pthread_mutex_t piLock; long double intervals; int numThreads; void *computePI(void *id) { long double x, width, localSum = 0; int i, threadID = *((int*)id); width = 1.0 / intervals; for (i = threadID ; i < intervals; i += numThreads) { x = (i + 0.5) * width; localSum += 4.0 / (1.0 + x * x); } localSum *= width; pthread_mutex_lock(&piLock); pi += localSum; pthread_mutex_unlock(&piLock); return NULL; } 35
  • 36. pi.c (продолжение) int main(int argc, char **argv) { pthread_t *threads; void *retval; int *threadID; int i; if (argc == 3) { intervals = atoi(argv[1]); numThreads = atoi(argv[2]); threads = malloc(numThreads * sizeof(pthread_t)); threadID = malloc(numThreads * sizeof(int)); pthread_mutex_init(&piLock, NULL); for (i = 0; i < numThreads; i++) { threadID[i] = i; pthread_create(&threads[i], NULL, computePI, threadID + i); } for (i = 0; i < numThreads; i++) pthread_join(threads[i], &retval); printf("Estimation of pi is %32.30Lf n", pi); } else { printf("Usage: ./a.out <numIntervals> <numThreads>n"); } return 0; } 36
  • 37. Ссылки  Эхтер Ш., Робертс Дж. Многоядерное программирование. – СПб.: Питер, 2010. – 316 с.  Эндрюс Г.Р. Основы многопоточного, параллельного и распределенного программирования. – М.: Вильямс, 2003. – 512 с.  Darryl Gove. Multicore Application Programming: for Windows, Linux, and Oracle Solaris. – Addison-Wesley, 2010. – 480 p.  Maurice Herlihy, Nir Shavit. The Art of Multiprocessor Programming. – Morgan Kaufmann, 2008. – 528 p.  Richard H. Carver, Kuo-Chung Tai. Modern Multithreading : Implementing, Testing, and Debugging Multithreaded Java and C++/Pthreads/Win32 Programs. – Wiley-Interscience, 2005. – 480 p.  Anthony Williams. C++ Concurrency in Action: Practical Multithreading. – Manning Publications, 2012. – 528 p.  Träff J.L. Introduction to Parallel Computing // http://www.par.tuwien.ac.at/teach/WS12/ParComp.html 37