SlideShare a Scribd company logo
1 of 16
Download to read offline
Семинар 4
Стандарт OpenMP (часть 4)
Михаил Курносов
E-mail: mkurnosov@gmail.com
WWW: www.mkurnosov.net
Цикл семинаров «Основы параллельного программирования»
Институт физики полупроводников им. А. В. Ржанова СО РАН
Новосибирск, 2015 CC-BY
Stack (thread 0)
int b = 1.0
double c = 2.0
Stack (thread 1)
double c = 2.0
.tbss
int bufloc
const double goldenratio = 1.618; /* Static (.rodata) */
double vec[1000]; /* Static (.bss) */
int counter = 100; /* Static (.data) */
double fun(int a)
{
double b = 1.0; /* Automatic (stack, register) */
static double gsum = 0; /* Static (.data) */
_Thread_local static double sumloc = 5; /* Thread (.tdata) */
_Thread_local static double bufloc; /* Thread (.tbbs) */
double *v = malloc(sizeof(*v) * 100); /* Allocated (Heap) */
#pragma omp parallel num_threads(2)
{
double c = 2.0; /* Automatic (stack, register) */
/* Shared: goldenratio, vec[], counter, b, gsum, v[] */
/* Private: sumloc, bufloc, c */
}
free(v);
}
Видимость данных (C11 storage duration)
Thread 0
Heap
double v[100]
.tdata
int sumloc = 5
.tbss
int bufloc
.bss (uninitialized data)
double vec[1000]
.data (initialized data)
int counter = 100
double gsum = 0
.rodata (initialized read-only data)
сonst double goldenratio = 1.618
Thread 1
.tdata
int sumloc = 5
Shared data
Private data
Stack (thread 0)
int b = 1.0
double c = 2.0
Stack (thread 1)
double c = 2.0
.tbss
int bufloc
const double goldenratio = 1.618; /* Static (.rodata) */
double vec[1000]; /* Static (.bss) */
int counter = 100; /* Static (.data) */
double fun(int a)
{
double b = 1.0; /* Automatic (stack, register) */
static double gsum = 0; /* Static (.data) */
_Thread_local static double sumloc = 5; /* Thread (.tdata) */
_Thread_local static double bufloc; /* Thread (.tbbs) */
double *v = malloc(sizeof(*v) * 100); /* Allocated (Heap) */
#pragma omp parallel num_threads(2)
{
double c = 2.0; /* Automatic (stack, register) */
/* Shared: goldenratio, vec[], counter, b, gsum, v[] */
/* Private: sumloc, bufloc, c */
}
free(v);
}
Видимость данных (C11 storage duration)
Thread 0
Heap
double v[100]
.tdata
int sumloc = 5
.tbss
int bufloc
.bss (uninitialized data)
double vec[1000]
.data (initialized data)
int counter = 100
double gsum = 0
.rodata (initialized read-only data)
сonst double goldenratio = 1.618
Thread 1
.tdata
int sumloc = 5
Shared data
Private data
$ objdump --syms ./datasharing
./datasharing: file format elf64-x86-64
SYMBOL TABLE:
0000000000601088 l O .bss 0000000000000008 gsum.2231
0000000000000000 l .tdata 0000000000000008 sumloc.2232
0000000000000008 l .tbss 0000000000000008 bufloc.2233
00000000006010c0 g O .bss 0000000000001f40 vec
000000000060104c g O .data 0000000000000004 counter
00000000004008e0 g O .rodata 0000000000000008 goldenratio
Атрибуты видимости данных
#pragma omp parallel shared(a, b, c) private(x, y, z) firsprivate(i, j, k)
{
#pragma omp for lastprivate(v)
for (int i = 0; i < 100; i++)
}
 shared (list) – указанные переменные сохраняют исходный класс памяти (auto, static, thread_local),
все переменные кроме thread_local будут разделяемыми
 private (list) – для каждого потока создаются локальные копии указанных переменных
(automatic storage duration)
 firstprivate (list) – для каждого потока создаются локальные копии переменных (automatic storage
duration), они инициализируются значениями, которые имели соответствующие переменные до входа в
параллельный регион
 lastprivate (list) – для каждого потока создаются локальные копии переменных (automatic storage
duration), в переменные копируются значения последней итерации цикла, либо значения последней
параллельной секции в коде (#pragma omp section)
 #pragma omp threadprivate(list) — делает указанные статические переменные локальными (TLS)
Атрибуты видимости данных
void fun()
{
int a = 100;
int b = 200;
int c = 300;
int d = 400;
static int sum = 0;
printf("Before parallel: a = %d, b = %d, c = %d, d = %dn", a, b, c, d);
#pragma omp parallel private(a) firstprivate(b) num_threads(2)
{
int tid = omp_get_thread_num();
printf("Thread %d: a = %d, b = %d, c = %d, d = %dn", tid, a, b, c, d);
a = 1;
b = 2;
#pragma omp threadprivate(sum)
sum++;
#pragma omp for lastprivate(c)
for (int i = 0; i < 100; i++)
c = i;
/* c=99 - has the value from last iteration */
}
// a = 100, b = 200, c = 99, d = 400, sum = 1
printf("After parallel: a = %d, b = %d, c = %d, d = %dn", a, b, c, d);
}
Before parallel: a = 100, b = 200, c = 300, d = 400
Thread 0: a = 0, b = 200, c = 300, d = 400
Thread 1: a = 0, b = 200, c = 300, d = 400
After parallel: a = 100, b = 200, c = 99, d = 400
Численное интегрирование (метод прямоугольников)
f(x)
x
x0
ba
x1
x2
x3
xn − 1
Формула средних прямоугольников const double a = -4.0; /* [a, b] */
const double b = 4.0;
const int nsteps = 40000000; /* n */
double func(double x)
{
return exp(-x * x);
}
double integrate(double a, double b, int n)
{
double h = (b - a) / n;
double sum = 0.0;
for (int i = 0; i < n; i++)
sum += func(a + h * (i + 0.5));
sum *= h;
return sum;
}
Параллельная версия
int count_prime_numbers_omp(int a, int b)
{
int nprimes = 0;
if (a <= 2) {
nprimes = 1; /* Count '2' as a prime number */
a = 2;
}
if (a % 2 == 0) /* Shift 'a' to odd number */
a++;
#pragma omp parallel
{
int nloc = 0;
/* Loop over odd numbers: a, a + 2, a + 4, ... , b */
#pragma omp for schedule(dynamic,100) nowait
for (int i = a; i <= b; i += 2) {
if (is_prime_number(i))
nloc++;
} /* 'nowait' disables barrier after for */
#pragma omp atomic
nprimes += nloc;
}
return nprimes;
}
Суммируем результаты всех потоков
Редукция (reduction, reduce)
int count_prime_numbers_omp(int a, int b)
{
int nprimes = 0;
/* Count '2' as a prime number */
if (a <= 2) {
nprimes = 1;
a = 2;
}
/* Shift 'a' to odd number */
if (a % 2 == 0)
a++;
#pragma omp parallel
{
#pragma omp for schedule(dynamic,100) reduction(+:nprimes)
for (int i = a; i <= b; i += 2) {
if (is_prime_number(i))
nprimes++;
}
}
return nprimes;
}
 В каждом потоке создает private-переменная nprimes
 После завершения параллельного региона к локальным
копиям применяется операция «+»
 Результат редукции записывается в переменную nprimes
 Допустимые операции: +, -, *, &, |, ^, &&, ||
Начальные значения переменных редукции
Объединение пространств итераций циклов
enum {
M = 4,
N = 1000000
};
float m[M * N];
void fun()
{
#pragma omp parallel
{
#pragma omp for
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
m[i * N + j] = i * j;
}
}
}
}
 Число потоков может быть больше числа итераций цикла
 Часть потоков будет простаивать (не хватит итераций)
Ручное объединение пространств итераций циклов
void fun()
{
#pragma omp parallel
{
#pragma omp for
for (int ij = 0; ij < M * N; ij++) {
int i = ij / N;
int j = ij % N;
m[i * N + j] = i * j;
}
}
}
Пример
Cтрок M = 2
Столбцов N = 5
Потоков p = 4
for ij = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Стандартное распределение итераций:
n = p * q — r, q = ceil(n / p) = 3
0: 0, 1, 2 -- (0, 0), (0, 1), (0, 2)
1: 3, 4, 5 -- (0, 3), (0, 4), (1, 0)
2: 6, 7 -- (1, 1), (1, 2)
3: 8, 9 -- (1, 3), (1, 4)
Объединение пространств итераций циклов
Пример
Cтрок M = 2
Столбцов N = 5
Потоков p = 4
for ij = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Стандартное распределение итераций:
n = p * q — r, q = ceil(n / p) = 3
0: 0, 1, 2 -- (0, 0), (0, 1), (0, 2)
1: 3, 4, 5 -- (0, 3), (0, 4), (1, 0)
2: 6, 7 -- (1, 1), (1, 2)
3: 8, 9 -- (1, 3), (1, 4)
void fun()
{
#pragma omp parallel
{
#pragma omp for collapse(2)
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
m[i * N + j] = i * j;
}
}
}
}
void fun()
{
#pragma omp parallel
{
#pragma omp master
{
printf("Thread in master %dn", omp_get_thread_num());
}
#pragma omp single
{
printf("Thread in single %dn", omp_get_thread_num());
}
}
}
Директивы master и single
Выполняется потоком с номером 0
Выполняется один раз, любым потоком
Барьерная синхронизация
void fun()
{
#pragma omp parallel
{
// Parallel code
#pragma omp for nowait
for (int i = 0; i < n; i++)
x[i] = f(i);
// Serial code
#pragma omp single
do_stuff();
#pragma omp barrier
// Ждем готовности x[0:n-1]
// Parallel code
#pragma omp for nowait
for (int i = 0; i < n; i++)
y[i] = x[i] + 2.0 * f(i);
// Serial code
#pragma omp master
do_stuff_last();
}
}
#pragma omp barrier
Потоки ждут пока все не достигнут
этого места в программе
Нормализация яркости изображения
const uint64_t width = 32 * 1024; const uint64_t height = 32 * 1024;
void hist_serial(uint8_t *pixels, int height, int width)
{
uint64_t npixels = height * width;
int *h = xmalloc(sizeof(*h) * 256);
for (int i = 0; i < 256; i++)
h[i] = 0;
for (int i = 0; i < npixels; i++)
h[pixels[i]]++;
int mini, maxi;
for (mini = 0; mini < 256 && h[mini] == 0; mini++);
for (maxi = 255; maxi >= 0 && h[maxi] == 0; maxi--);
int q = 255 / (maxi - mini);
for (int i = 0; i < npixels; i++)
pixels[i] = (pixels[i] - mini) * q;
free(h);
}
int main(int argc, char *argv[])
{
uint64_t npixels = width * height;
pixels1 = xmalloc(sizeof(*pixels1) * npixels);
hist_serial(pixels1, height, width);
// ...
}
h[i] — количество точек цвета i в изображении (гистограмма)
Задание
 Разработать на OpenMP параллельную версию программы — написать код
функции hist_omp
 Шаблон программы находится в каталоге _task
Вариант решения находиться в каталоге 7_hist

More Related Content

What's hot

Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Mikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...Alexey Paznikov
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Mikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияAlexey Paznikov
 
Лекция 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
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...Alexey Paznikov
 
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...Alexey Paznikov
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Mikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 

What's hot (20)

Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
 
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 

Viewers also liked

Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыЛекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыAlexey Paznikov
 
Язык параллельного программирования Intel Cilk Plus
Язык параллельного программирования Intel Cilk PlusЯзык параллельного программирования Intel Cilk Plus
Язык параллельного программирования Intel Cilk PlusMikhail Kurnosov
 
Лекция 9. Программирование GPU
Лекция 9. Программирование GPUЛекция 9. Программирование GPU
Лекция 9. Программирование GPUMikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
What Makes Great Infographics
What Makes Great InfographicsWhat Makes Great Infographics
What Makes Great InfographicsSlideShare
 
Masters of SlideShare
Masters of SlideShareMasters of SlideShare
Masters of SlideShareKapost
 
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareSTOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareEmpowered Presentations
 
10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation OptimizationOneupweb
 
How To Get More From SlideShare - Super-Simple Tips For Content Marketing
How To Get More From SlideShare - Super-Simple Tips For Content MarketingHow To Get More From SlideShare - Super-Simple Tips For Content Marketing
How To Get More From SlideShare - Super-Simple Tips For Content MarketingContent Marketing Institute
 
How to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & TricksHow to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & TricksSlideShare
 

Viewers also liked (13)

Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыЛекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
 
Язык параллельного программирования Intel Cilk Plus
Язык параллельного программирования Intel Cilk PlusЯзык параллельного программирования Intel Cilk Plus
Язык параллельного программирования Intel Cilk Plus
 
Лекция 9. Программирование GPU
Лекция 9. Программирование GPUЛекция 9. Программирование GPU
Лекция 9. Программирование GPU
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
What Makes Great Infographics
What Makes Great InfographicsWhat Makes Great Infographics
What Makes Great Infographics
 
Masters of SlideShare
Masters of SlideShareMasters of SlideShare
Masters of SlideShare
 
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareSTOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
 
You Suck At PowerPoint!
You Suck At PowerPoint!You Suck At PowerPoint!
You Suck At PowerPoint!
 
10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization
 
How To Get More From SlideShare - Super-Simple Tips For Content Marketing
How To Get More From SlideShare - Super-Simple Tips For Content MarketingHow To Get More From SlideShare - Super-Simple Tips For Content Marketing
How To Get More From SlideShare - Super-Simple Tips For Content Marketing
 
How to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & TricksHow to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & Tricks
 

Similar to Семинар 4. Многопоточное программирование на OpenMP (часть 4)

Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
 
презентации продолжение банкета
презентации продолжение банкетапрезентации продолжение банкета
презентации продолжение банкетаstudent_kai
 
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...Ontico
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...Alexey Paznikov
 
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
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компиляторAndrew Aksyonoff
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кодаTatyanazaxarova
 
ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаAndrey Karpov
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...Alexey Paznikov
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)Smolensk Computer Science Club
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
основы программирования на языке C
основы программирования на языке Cосновы программирования на языке C
основы программирования на языке Cstudent_kai
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Alexander Granin
 
Александр Гранин, "Декларативно-функциональный дизайн на С++11"
Александр Гранин, "Декларативно-функциональный дизайн на С++11"Александр Гранин, "Декларативно-функциональный дизайн на С++11"
Александр Гранин, "Декларативно-функциональный дизайн на С++11"Platonov Sergey
 

Similar to Семинар 4. Многопоточное программирование на OpenMP (часть 4) (20)

Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
 
презентации продолжение банкета
презентации продолжение банкетапрезентации продолжение банкета
презентации продолжение банкета
 
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
 
Progr labrab-4-2013-c++
Progr labrab-4-2013-c++Progr labrab-4-2013-c++
Progr labrab-4-2013-c++
 
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
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компилятор
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кода
 
ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кода
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)
 
Erlang
ErlangErlang
Erlang
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Array Work C
Array Work CArray Work C
Array Work C
 
основы программирования на языке C
основы программирования на языке Cосновы программирования на языке C
основы программирования на языке C
 
лекция 1
лекция 1лекция 1
лекция 1
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
 
Александр Гранин, "Декларативно-функциональный дизайн на С++11"
Александр Гранин, "Декларативно-функциональный дизайн на С++11"Александр Гранин, "Декларативно-функциональный дизайн на С++11"
Александр Гранин, "Декларативно-функциональный дизайн на С++11"
 

More from 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
 
Лекция 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. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)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
 
Лекция 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
 
Лекция 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. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Mikhail Kurnosov
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовMikhail Kurnosov
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаMikhail Kurnosov
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыMikhail Kurnosov
 

More from Mikhail Kurnosov (15)

Лекция 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. 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. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Лекция 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. Методы разработки алгоритмов
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицы
 

Семинар 4. Многопоточное программирование на OpenMP (часть 4)

  • 1. Семинар 4 Стандарт OpenMP (часть 4) Михаил Курносов E-mail: mkurnosov@gmail.com WWW: www.mkurnosov.net Цикл семинаров «Основы параллельного программирования» Институт физики полупроводников им. А. В. Ржанова СО РАН Новосибирск, 2015 CC-BY
  • 2. Stack (thread 0) int b = 1.0 double c = 2.0 Stack (thread 1) double c = 2.0 .tbss int bufloc const double goldenratio = 1.618; /* Static (.rodata) */ double vec[1000]; /* Static (.bss) */ int counter = 100; /* Static (.data) */ double fun(int a) { double b = 1.0; /* Automatic (stack, register) */ static double gsum = 0; /* Static (.data) */ _Thread_local static double sumloc = 5; /* Thread (.tdata) */ _Thread_local static double bufloc; /* Thread (.tbbs) */ double *v = malloc(sizeof(*v) * 100); /* Allocated (Heap) */ #pragma omp parallel num_threads(2) { double c = 2.0; /* Automatic (stack, register) */ /* Shared: goldenratio, vec[], counter, b, gsum, v[] */ /* Private: sumloc, bufloc, c */ } free(v); } Видимость данных (C11 storage duration) Thread 0 Heap double v[100] .tdata int sumloc = 5 .tbss int bufloc .bss (uninitialized data) double vec[1000] .data (initialized data) int counter = 100 double gsum = 0 .rodata (initialized read-only data) сonst double goldenratio = 1.618 Thread 1 .tdata int sumloc = 5 Shared data Private data
  • 3. Stack (thread 0) int b = 1.0 double c = 2.0 Stack (thread 1) double c = 2.0 .tbss int bufloc const double goldenratio = 1.618; /* Static (.rodata) */ double vec[1000]; /* Static (.bss) */ int counter = 100; /* Static (.data) */ double fun(int a) { double b = 1.0; /* Automatic (stack, register) */ static double gsum = 0; /* Static (.data) */ _Thread_local static double sumloc = 5; /* Thread (.tdata) */ _Thread_local static double bufloc; /* Thread (.tbbs) */ double *v = malloc(sizeof(*v) * 100); /* Allocated (Heap) */ #pragma omp parallel num_threads(2) { double c = 2.0; /* Automatic (stack, register) */ /* Shared: goldenratio, vec[], counter, b, gsum, v[] */ /* Private: sumloc, bufloc, c */ } free(v); } Видимость данных (C11 storage duration) Thread 0 Heap double v[100] .tdata int sumloc = 5 .tbss int bufloc .bss (uninitialized data) double vec[1000] .data (initialized data) int counter = 100 double gsum = 0 .rodata (initialized read-only data) сonst double goldenratio = 1.618 Thread 1 .tdata int sumloc = 5 Shared data Private data $ objdump --syms ./datasharing ./datasharing: file format elf64-x86-64 SYMBOL TABLE: 0000000000601088 l O .bss 0000000000000008 gsum.2231 0000000000000000 l .tdata 0000000000000008 sumloc.2232 0000000000000008 l .tbss 0000000000000008 bufloc.2233 00000000006010c0 g O .bss 0000000000001f40 vec 000000000060104c g O .data 0000000000000004 counter 00000000004008e0 g O .rodata 0000000000000008 goldenratio
  • 4. Атрибуты видимости данных #pragma omp parallel shared(a, b, c) private(x, y, z) firsprivate(i, j, k) { #pragma omp for lastprivate(v) for (int i = 0; i < 100; i++) }  shared (list) – указанные переменные сохраняют исходный класс памяти (auto, static, thread_local), все переменные кроме thread_local будут разделяемыми  private (list) – для каждого потока создаются локальные копии указанных переменных (automatic storage duration)  firstprivate (list) – для каждого потока создаются локальные копии переменных (automatic storage duration), они инициализируются значениями, которые имели соответствующие переменные до входа в параллельный регион  lastprivate (list) – для каждого потока создаются локальные копии переменных (automatic storage duration), в переменные копируются значения последней итерации цикла, либо значения последней параллельной секции в коде (#pragma omp section)  #pragma omp threadprivate(list) — делает указанные статические переменные локальными (TLS)
  • 5. Атрибуты видимости данных void fun() { int a = 100; int b = 200; int c = 300; int d = 400; static int sum = 0; printf("Before parallel: a = %d, b = %d, c = %d, d = %dn", a, b, c, d); #pragma omp parallel private(a) firstprivate(b) num_threads(2) { int tid = omp_get_thread_num(); printf("Thread %d: a = %d, b = %d, c = %d, d = %dn", tid, a, b, c, d); a = 1; b = 2; #pragma omp threadprivate(sum) sum++; #pragma omp for lastprivate(c) for (int i = 0; i < 100; i++) c = i; /* c=99 - has the value from last iteration */ } // a = 100, b = 200, c = 99, d = 400, sum = 1 printf("After parallel: a = %d, b = %d, c = %d, d = %dn", a, b, c, d); } Before parallel: a = 100, b = 200, c = 300, d = 400 Thread 0: a = 0, b = 200, c = 300, d = 400 Thread 1: a = 0, b = 200, c = 300, d = 400 After parallel: a = 100, b = 200, c = 99, d = 400
  • 6. Численное интегрирование (метод прямоугольников) f(x) x x0 ba x1 x2 x3 xn − 1 Формула средних прямоугольников const double a = -4.0; /* [a, b] */ const double b = 4.0; const int nsteps = 40000000; /* n */ double func(double x) { return exp(-x * x); } double integrate(double a, double b, int n) { double h = (b - a) / n; double sum = 0.0; for (int i = 0; i < n; i++) sum += func(a + h * (i + 0.5)); sum *= h; return sum; }
  • 7. Параллельная версия int count_prime_numbers_omp(int a, int b) { int nprimes = 0; if (a <= 2) { nprimes = 1; /* Count '2' as a prime number */ a = 2; } if (a % 2 == 0) /* Shift 'a' to odd number */ a++; #pragma omp parallel { int nloc = 0; /* Loop over odd numbers: a, a + 2, a + 4, ... , b */ #pragma omp for schedule(dynamic,100) nowait for (int i = a; i <= b; i += 2) { if (is_prime_number(i)) nloc++; } /* 'nowait' disables barrier after for */ #pragma omp atomic nprimes += nloc; } return nprimes; } Суммируем результаты всех потоков
  • 8. Редукция (reduction, reduce) int count_prime_numbers_omp(int a, int b) { int nprimes = 0; /* Count '2' as a prime number */ if (a <= 2) { nprimes = 1; a = 2; } /* Shift 'a' to odd number */ if (a % 2 == 0) a++; #pragma omp parallel { #pragma omp for schedule(dynamic,100) reduction(+:nprimes) for (int i = a; i <= b; i += 2) { if (is_prime_number(i)) nprimes++; } } return nprimes; }  В каждом потоке создает private-переменная nprimes  После завершения параллельного региона к локальным копиям применяется операция «+»  Результат редукции записывается в переменную nprimes  Допустимые операции: +, -, *, &, |, ^, &&, ||
  • 10. Объединение пространств итераций циклов enum { M = 4, N = 1000000 }; float m[M * N]; void fun() { #pragma omp parallel { #pragma omp for for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { m[i * N + j] = i * j; } } } }  Число потоков может быть больше числа итераций цикла  Часть потоков будет простаивать (не хватит итераций)
  • 11. Ручное объединение пространств итераций циклов void fun() { #pragma omp parallel { #pragma omp for for (int ij = 0; ij < M * N; ij++) { int i = ij / N; int j = ij % N; m[i * N + j] = i * j; } } } Пример Cтрок M = 2 Столбцов N = 5 Потоков p = 4 for ij = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Стандартное распределение итераций: n = p * q — r, q = ceil(n / p) = 3 0: 0, 1, 2 -- (0, 0), (0, 1), (0, 2) 1: 3, 4, 5 -- (0, 3), (0, 4), (1, 0) 2: 6, 7 -- (1, 1), (1, 2) 3: 8, 9 -- (1, 3), (1, 4)
  • 12. Объединение пространств итераций циклов Пример Cтрок M = 2 Столбцов N = 5 Потоков p = 4 for ij = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Стандартное распределение итераций: n = p * q — r, q = ceil(n / p) = 3 0: 0, 1, 2 -- (0, 0), (0, 1), (0, 2) 1: 3, 4, 5 -- (0, 3), (0, 4), (1, 0) 2: 6, 7 -- (1, 1), (1, 2) 3: 8, 9 -- (1, 3), (1, 4) void fun() { #pragma omp parallel { #pragma omp for collapse(2) for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { m[i * N + j] = i * j; } } } }
  • 13. void fun() { #pragma omp parallel { #pragma omp master { printf("Thread in master %dn", omp_get_thread_num()); } #pragma omp single { printf("Thread in single %dn", omp_get_thread_num()); } } } Директивы master и single Выполняется потоком с номером 0 Выполняется один раз, любым потоком
  • 14. Барьерная синхронизация void fun() { #pragma omp parallel { // Parallel code #pragma omp for nowait for (int i = 0; i < n; i++) x[i] = f(i); // Serial code #pragma omp single do_stuff(); #pragma omp barrier // Ждем готовности x[0:n-1] // Parallel code #pragma omp for nowait for (int i = 0; i < n; i++) y[i] = x[i] + 2.0 * f(i); // Serial code #pragma omp master do_stuff_last(); } } #pragma omp barrier Потоки ждут пока все не достигнут этого места в программе
  • 15. Нормализация яркости изображения const uint64_t width = 32 * 1024; const uint64_t height = 32 * 1024; void hist_serial(uint8_t *pixels, int height, int width) { uint64_t npixels = height * width; int *h = xmalloc(sizeof(*h) * 256); for (int i = 0; i < 256; i++) h[i] = 0; for (int i = 0; i < npixels; i++) h[pixels[i]]++; int mini, maxi; for (mini = 0; mini < 256 && h[mini] == 0; mini++); for (maxi = 255; maxi >= 0 && h[maxi] == 0; maxi--); int q = 255 / (maxi - mini); for (int i = 0; i < npixels; i++) pixels[i] = (pixels[i] - mini) * q; free(h); } int main(int argc, char *argv[]) { uint64_t npixels = width * height; pixels1 = xmalloc(sizeof(*pixels1) * npixels); hist_serial(pixels1, height, width); // ... } h[i] — количество точек цвета i в изображении (гистограмма)
  • 16. Задание  Разработать на OpenMP параллельную версию программы — написать код функции hist_omp  Шаблон программы находится в каталоге _task Вариант решения находиться в каталоге 7_hist