SlideShare ist ein Scribd-Unternehmen logo
1 von 16
Downloaden Sie, um offline zu lesen
Семинар 7
Стандарт OpenMP (часть 7)
Михаил Курносов
E-mail: mkurnosov@gmail.com
WWW: www.mkurnosov.net
Цикл семинаров «Основы параллельного программирования»
Институт физики полупроводников им. А. В. Ржанова СО РАН
Новосибирск, 2015 CC-BY
Рекурсивное суммирование
double sum(double *v, int low, int high)
{
if (low == high)
return v[low];
int mid = (low + high) / 2;
return sum(v, low, mid) + sum(v, mid + 1, high);
}
5 10 15 20 25 30 35 40 45 50
v[0..9]
v[5..9]v[0..4]
v[0..2]
v[0..1] v[2..2]
v[0..0] v[1..1]
v[3..4]
v[3..3] v[4..4]
v[5..7]
v[5..6] v[7..7]
v[5..5] v[6..6]
v[8..9]
v[8..8] v[9..9]
Параллельное рекурсивное суммирование
double sum(double *v, int low, int high)
{
if (low == high)
return v[low];
int mid = (low + high) / 2;
return sum(v, low, mid) + sum(v, mid + 1, high);
}
5 10 15 20 25 30 35 40 45 50
v[0..9]
v[5..9]v[0..4]
v[0..2]
v[0..1] v[2..2]
v[0..0] v[1..1]
v[3..4]
v[3..3] v[4..4]
v[5..7]
v[5..6] v[7..7]
v[5..5] v[6..6]
v[8..9]
v[8..8] v[9..9]
Thread Thread
Thread Thread Thread Thread
Вложенные
параллельные
регионы + секции
max_active_levels
Параллельное рекурсивное суммирование (nested sections)
double sum_omp(double *v, int low, int high)
{
if (low == high)
return v[low];
double sum_left, sum_right;
int mid = (low + high) / 2;
if (omp_get_active_level() >= omp_get_max_active_levels())
return sum(v, low, mid);
#pragma omp parallel num_threads(2)
{
#pragma omp sections
{
#pragma omp section
sum_left = sum_omp(v, low, mid);
#pragma omp section
sum_right = sum_omp(v, mid + 1, high);
}
}
return sum_left + sum_right;
}
omp_set_nested(1);
omp_set_max_active_levels(ilog2(nthreads));
Переключение на
последовательную версию
при достижении предельной
глубины вложенных
параллельных регионов
Параллелизм задач (task parallelism, >= OpenMP 3.0)
void fun()
{
int a, b;
#pragma omp parallel num_threads(2) shared(a) private(b)
{
#pragma omp single nowait
{
for (int i = 0; i < 3; i++) {
#pragma omp task default(firstprivate)
{
int c;
// A — shared, B — firstprivate, C - private
}
}
}
}
}
int main(int argc, char **argv)
{
fun();
return 0;
}
Task0 Task1
Task0
Task1
Task1
Thread0 Thread1
Team
of threads
Implicit
tasks
Explicit
tasks
Параллелизм задач (task parallelism, >= OpenMP 3.0)
#pragma omp parallel
{
#pragma omp single nowait
{
for (; list != NULL; list = list->next) {
#pragma omp task firstprivate(list)
{
process_node(list);
}
}
}
}
Параллельная обработка динамических структур данных
(связные списки, деревья, ...)
void postorder(node *p)
{
if (p->left) {
#pragma omp task
postorder(p->left);
}
if (p->right) {
#pragma omp task
postorder(p->right);
}
#pragma omp taskwait
process(p->data);
}
Параллельное рекурсивное суммирование (tasks v1)
double sum_omp_tasks(double *v, int low, int high)
{
if (low == high)
return v[low];
double sum_left, sum_right;
int mid = (low + high) / 2;
#pragma omp task shared(sum_left)
sum_left = sum_omp_tasks(v, low, mid);
#pragma omp task shared(sum_right)
sum_right = sum_omp_tasks(v, mid + 1, high);
#pragma omp taskwait
return sum_left + sum_right;
}
double sum_omp(double *v, int low, int high)
{
double s = 0;
#pragma omp parallel
{
#pragma omp single nowait
s = sum_omp_tasks(v, low, high);
}
return s;
}
Пул из N потоков + N задач (implicit tasks)
Отдельная задача для каждого
рекурсивного вызова
Ожидание завершения
дочерних задач
Параллельное рекурсивное суммирование (tasks v1)
double sum_omp_tasks(double *v, int low, int high)
{
if (low == high)
return v[low];
double sum_left, sum_right;
int mid = (low + high) / 2;
#pragma omp task shared(sum_left)
sum_left = sum_omp_tasks(v, low, mid);
#pragma omp task shared(sum_right)
sum_right = sum_omp_tasks(v, mid + 1, high);
#pragma omp taskwait
return sum_left + sum_right;
}
double sum_omp(double *v, int low, int high)
{
double s = 0;
#pragma omp parallel
{
#pragma omp single nowait
s = sum_omp_tasks(v, low, high);
}
return s;
}
5 10 15 20 25 30 35
Thread 0 Thread 1 ... Thread N - 1
v[0..6]
Task Task Task
Team
of threads
Implicit
tasks
Explicit
tasksv[0..3]
v[0..1] v[2..3]
v[0..0] v[1..1] v[2..2] v[3..3]
v[4..6]
v[4..5] v[6..6]
v[4..4] v[5..5]
Создается большое количество задач
Значительные накладные расходы
Параллельное рекурсивное суммирование (tasks v2)
double sum_omp_tasks_threshold(double *v, int low, int high)
{
if (low == high)
return v[low];
if (high - low < SUM_OMP_ARRAY_MIN_SIZE)
return sum(v, low, high);
double sum_left, sum_right;
int mid = (low + high) / 2;
#pragma omp task shared(sum_left)
sum_left = sum_omp_tasks_threshold(v, low, mid);
#pragma omp task shared(sum_right)
sum_right = sum_omp_tasks_threshold(v, mid + 1, high);
#pragma omp taskwait
return sum_left + sum_right;
}
double sum_omp(double *v, int low, int high)
{
double s = 0;
#pragma omp parallel
{
#pragma omp single nowait
s = sum_omp_tasks_threshold(v, low, high);
}
return s;
}
Переключение на
последовательную версию
при достижении предельного
размера подмассива
Task
v[0..6]
v[0..3]
v[0..1] v[2..3]
v[0..1] v[2..3]
v[4..6]
v[4..5] v[6..6]
v[4..5]
threshold
Параллельное рекурсивное суммирование (tasks v3)
double sum_omp_tasks_maxthreads(double *v, int low, int high, int nthreads)
{
if (low == high)
return v[low];
if (nthreads <= 1)
return sum(v, low, high);
double sum_left, sum_right;
int mid = (low + high) / 2;
#pragma omp task shared(sum_left)
sum_left = sum_omp_tasks_maxthreads(v, low, mid, nthreads / 2);
#pragma omp task shared(sum_right)
sum_right = sum_omp_tasks_maxthreads(v, mid + 1, high, nthreads - nthreads / 2);
#pragma omp taskwait
return sum_left + sum_right;
}
double sum_omp(double *v, int low, int high)
{
double s = 0;
#pragma omp parallel
{
#pragma omp single nowait
s = sum_omp_tasks_maxthreads(v, low, high, omp_get_num_procs());
}
return s;
}
Переключение на
последовательную версию
при достижении предельного
числа запущенных задач
Численное интегрирование (метод трапеций)
x
f(x)
a bm = (a + b) / 2
f(b)
f(a)
f((a + b) / 2)  Площадь левой трапеции:
SL = (f(a) + f(m)) * (m - a) / 2
 Площадь правой трапеции:
SR = (f(m) + f(b)) * (b - m) / 2
S = SL
+ SR
Численное интегрирование (метод трапеций)
const double eps = 1E-24;
double f(double x)
{
return 4.0 / (1.0 + x * x);
}
double integrate(double left, double right, double f_left,
double f_right, double leftright_area)
{
double mid = (left + right) / 2;
double f_mid = f(mid);
double left_area = (f_left + f_mid) * (mid - left) / 2;
double right_area = (f_mid + f_right) * (right - mid) / 2;
if (fabs((left_area + right_area) - leftright_area) > eps) {
left_area = integrate(left, mid, f_left, f_mid, left_area);
right_area = integrate(mid, right, f_mid, f_right, right_area);
}
return left_area + right_area;
}
double run_serial()
{
double pi = integrate(0.0, 1.0, f(0), f(1), (f(0) + f(1)) / 2);
}
left_area right_area
Численное интегрирование (метод трапеций)
left_area right_area
const double threshold = 0.05;
double integrate_omp(double left, double right, double f_left,
double f_right, double leftright_area)
{
double mid = (left + right) / 2;
double f_mid = f(mid);
double left_area = (f_left + f_mid) * (mid - left) / 2;
double right_area = (f_mid + f_right) * (right - mid) / 2;
if (fabs((left_area + right_area) - leftright_area) > eps) {
if (right - left < threshold) {
return integrate(left, right, f_left, f_right, leftright_area);
}
#pragma omp task shared(left_area)
left_area = integrate_omp(left, mid, f_left, f_mid, left_area);
right_area = integrate_omp(mid, right, f_mid, f_right, right_area);
#pragma omp taskwait
}
return left_area + right_area;
}
double run_parallel()
{
double pi;
#pragma omp parallel
{
#pragma omp single nowait
pi = integrate_omp(0.0, 1.0, f(0), f(1), (f(0) + f(1)) / 2);
}
}
Быстрая сортировка (QuickSort)
int partition(double *v, int low, int high)
{
double pivot = v[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (v[j] <= pivot) {
i++;
swap(v, i, j);
}
}
swap(v, i + 1, high);
return i + 1;
}
void quicksort(double *v, int low, int high)
{
if (low < high) {
int k = partition(v, low, high);
quicksort(v, low, k - 1);
quicksort(v, k + 1, high);
}
}
double run_serial()
{
quicksort(v, 0, N - 1);
}
Многопоточная быстрая сортировка (QuickSort)
const int threshold = 1000;
void quicksort_omp_tasks(double *v, int low, int high)
{
if (low < high) {
if (high - low < threshold) {
quicksort(v, low, high);
} else {
int k = partition(v, low, high);
#pragma omp task
quicksort_omp_tasks(v, low, k - 1);
quicksort_omp_tasks(v, k + 1, high);
}
}
}
double run_parallel()
{
#pragma omp parallel
{
#pragma omp single nowait
quicksort_omp_tasks(v, 0, N - 1);
}
}
Задание
 Разработать на OpenMP многопоточную версию функции быстрой сортировки —
написать код функции quicksort_omp_tasks
 Провести анализ масштабируемости параллельной программы
 Шаблон программы находится в каталоге _task

Weitere ähnliche Inhalte

Was ist angesagt?

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

Was ist angesagt? (20)

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

Andere mochten auch

Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Olga Maksimenkova
 
Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовMikhail Kurnosov
 
Migration To Multi Core - Parallel Programming Models
Migration To Multi Core - Parallel Programming ModelsMigration To Multi Core - Parallel Programming Models
Migration To Multi Core - Parallel Programming ModelsZvi Avraham
 
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Mikhail Kurnosov
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовMikhail Kurnosov
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаMikhail Kurnosov
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовMikhail Kurnosov
 
Intel® MPI Library e OpenMP* - Intel Software Conference 2013
Intel® MPI Library e OpenMP* - Intel Software Conference 2013Intel® MPI Library e OpenMP* - Intel Software Conference 2013
Intel® MPI Library e OpenMP* - Intel Software Conference 2013Intel Software Brasil
 

Andere mochten auch (12)

Scheduling for Parallel and Multi-Core Systems
Scheduling for Parallel and Multi-Core SystemsScheduling for Parallel and Multi-Core Systems
Scheduling for Parallel and Multi-Core Systems
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).
 
How to Use OpenMP on Native Activity
How to Use OpenMP on Native ActivityHow to Use OpenMP on Native Activity
How to Use OpenMP on Native Activity
 
Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графов
 
Migration To Multi Core - Parallel Programming Models
Migration To Multi Core - Parallel Programming ModelsMigration To Multi Core - Parallel Programming Models
Migration To Multi Core - Parallel Programming Models
 
Introduccion a MPI
Introduccion a MPIIntroduccion a MPI
Introduccion a MPI
 
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировки
 
Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмов
 
Intel® MPI Library e OpenMP* - Intel Software Conference 2013
Intel® MPI Library e OpenMP* - Intel Software Conference 2013Intel® MPI Library e OpenMP* - Intel Software Conference 2013
Intel® MPI Library e OpenMP* - Intel Software Conference 2013
 

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

Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовMikhail Kurnosov
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Alex Tumanoff
 
Cocoheads Moscow September
Cocoheads Moscow SeptemberCocoheads Moscow September
Cocoheads Moscow SeptemberAlexander Zimin
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Fwdays
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовТранслируем.бел
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Функциональное программирование и Clojure
Функциональное программирование и ClojureФункциональное программирование и Clojure
Функциональное программирование и ClojureAnjLab
 
Как очистить массив
Как очистить массивКак очистить массив
Как очистить массивAndrew Shitov
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptSmartTools
 
Отладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbgОтладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbgYuri Zhloba
 
Something about Golang
Something about GolangSomething about Golang
Something about GolangAnton Arhipov
 
C# Desktop. Занятие 03.
C# Desktop. Занятие 03.C# Desktop. Занятие 03.
C# Desktop. Занятие 03.Igor Shkulipa
 

Ähnlich wie Семинар 7. Многопоточное программирование на OpenMP (часть 7) (15)

Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графов
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2
 
Cocoheads Moscow September
Cocoheads Moscow SeptemberCocoheads Moscow September
Cocoheads Moscow September
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
 
Pri3
Pri3Pri3
Pri3
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
 
Функциональное программирование и Clojure
Функциональное программирование и ClojureФункциональное программирование и Clojure
Функциональное программирование и Clojure
 
Как очистить массив
Как очистить массивКак очистить массив
Как очистить массив
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
 
Отладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbgОтладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbg
 
Основы Python. Функции
Основы Python. ФункцииОсновы Python. Функции
Основы Python. Функции
 
Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 
Something about Golang
Something about GolangSomething about Golang
Something about Golang
 
C# Desktop. Занятие 03.
C# Desktop. Занятие 03.C# Desktop. Занятие 03.
C# Desktop. Занятие 03.
 

Mehr von Mikhail Kurnosov

Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)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. Оптимизация доступа к памяти (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
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыMikhail Kurnosov
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаMikhail Kurnosov
 

Mehr von Mikhail Kurnosov (17)

Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 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. Оптимизация доступа к памяти (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)
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицы
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поиска
 

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

  • 1. Семинар 7 Стандарт OpenMP (часть 7) Михаил Курносов E-mail: mkurnosov@gmail.com WWW: www.mkurnosov.net Цикл семинаров «Основы параллельного программирования» Институт физики полупроводников им. А. В. Ржанова СО РАН Новосибирск, 2015 CC-BY
  • 2. Рекурсивное суммирование double sum(double *v, int low, int high) { if (low == high) return v[low]; int mid = (low + high) / 2; return sum(v, low, mid) + sum(v, mid + 1, high); } 5 10 15 20 25 30 35 40 45 50 v[0..9] v[5..9]v[0..4] v[0..2] v[0..1] v[2..2] v[0..0] v[1..1] v[3..4] v[3..3] v[4..4] v[5..7] v[5..6] v[7..7] v[5..5] v[6..6] v[8..9] v[8..8] v[9..9]
  • 3. Параллельное рекурсивное суммирование double sum(double *v, int low, int high) { if (low == high) return v[low]; int mid = (low + high) / 2; return sum(v, low, mid) + sum(v, mid + 1, high); } 5 10 15 20 25 30 35 40 45 50 v[0..9] v[5..9]v[0..4] v[0..2] v[0..1] v[2..2] v[0..0] v[1..1] v[3..4] v[3..3] v[4..4] v[5..7] v[5..6] v[7..7] v[5..5] v[6..6] v[8..9] v[8..8] v[9..9] Thread Thread Thread Thread Thread Thread Вложенные параллельные регионы + секции max_active_levels
  • 4. Параллельное рекурсивное суммирование (nested sections) double sum_omp(double *v, int low, int high) { if (low == high) return v[low]; double sum_left, sum_right; int mid = (low + high) / 2; if (omp_get_active_level() >= omp_get_max_active_levels()) return sum(v, low, mid); #pragma omp parallel num_threads(2) { #pragma omp sections { #pragma omp section sum_left = sum_omp(v, low, mid); #pragma omp section sum_right = sum_omp(v, mid + 1, high); } } return sum_left + sum_right; } omp_set_nested(1); omp_set_max_active_levels(ilog2(nthreads)); Переключение на последовательную версию при достижении предельной глубины вложенных параллельных регионов
  • 5. Параллелизм задач (task parallelism, >= OpenMP 3.0) void fun() { int a, b; #pragma omp parallel num_threads(2) shared(a) private(b) { #pragma omp single nowait { for (int i = 0; i < 3; i++) { #pragma omp task default(firstprivate) { int c; // A — shared, B — firstprivate, C - private } } } } } int main(int argc, char **argv) { fun(); return 0; } Task0 Task1 Task0 Task1 Task1 Thread0 Thread1 Team of threads Implicit tasks Explicit tasks
  • 6. Параллелизм задач (task parallelism, >= OpenMP 3.0) #pragma omp parallel { #pragma omp single nowait { for (; list != NULL; list = list->next) { #pragma omp task firstprivate(list) { process_node(list); } } } } Параллельная обработка динамических структур данных (связные списки, деревья, ...) void postorder(node *p) { if (p->left) { #pragma omp task postorder(p->left); } if (p->right) { #pragma omp task postorder(p->right); } #pragma omp taskwait process(p->data); }
  • 7. Параллельное рекурсивное суммирование (tasks v1) double sum_omp_tasks(double *v, int low, int high) { if (low == high) return v[low]; double sum_left, sum_right; int mid = (low + high) / 2; #pragma omp task shared(sum_left) sum_left = sum_omp_tasks(v, low, mid); #pragma omp task shared(sum_right) sum_right = sum_omp_tasks(v, mid + 1, high); #pragma omp taskwait return sum_left + sum_right; } double sum_omp(double *v, int low, int high) { double s = 0; #pragma omp parallel { #pragma omp single nowait s = sum_omp_tasks(v, low, high); } return s; } Пул из N потоков + N задач (implicit tasks) Отдельная задача для каждого рекурсивного вызова Ожидание завершения дочерних задач
  • 8. Параллельное рекурсивное суммирование (tasks v1) double sum_omp_tasks(double *v, int low, int high) { if (low == high) return v[low]; double sum_left, sum_right; int mid = (low + high) / 2; #pragma omp task shared(sum_left) sum_left = sum_omp_tasks(v, low, mid); #pragma omp task shared(sum_right) sum_right = sum_omp_tasks(v, mid + 1, high); #pragma omp taskwait return sum_left + sum_right; } double sum_omp(double *v, int low, int high) { double s = 0; #pragma omp parallel { #pragma omp single nowait s = sum_omp_tasks(v, low, high); } return s; } 5 10 15 20 25 30 35 Thread 0 Thread 1 ... Thread N - 1 v[0..6] Task Task Task Team of threads Implicit tasks Explicit tasksv[0..3] v[0..1] v[2..3] v[0..0] v[1..1] v[2..2] v[3..3] v[4..6] v[4..5] v[6..6] v[4..4] v[5..5] Создается большое количество задач Значительные накладные расходы
  • 9. Параллельное рекурсивное суммирование (tasks v2) double sum_omp_tasks_threshold(double *v, int low, int high) { if (low == high) return v[low]; if (high - low < SUM_OMP_ARRAY_MIN_SIZE) return sum(v, low, high); double sum_left, sum_right; int mid = (low + high) / 2; #pragma omp task shared(sum_left) sum_left = sum_omp_tasks_threshold(v, low, mid); #pragma omp task shared(sum_right) sum_right = sum_omp_tasks_threshold(v, mid + 1, high); #pragma omp taskwait return sum_left + sum_right; } double sum_omp(double *v, int low, int high) { double s = 0; #pragma omp parallel { #pragma omp single nowait s = sum_omp_tasks_threshold(v, low, high); } return s; } Переключение на последовательную версию при достижении предельного размера подмассива Task v[0..6] v[0..3] v[0..1] v[2..3] v[0..1] v[2..3] v[4..6] v[4..5] v[6..6] v[4..5] threshold
  • 10. Параллельное рекурсивное суммирование (tasks v3) double sum_omp_tasks_maxthreads(double *v, int low, int high, int nthreads) { if (low == high) return v[low]; if (nthreads <= 1) return sum(v, low, high); double sum_left, sum_right; int mid = (low + high) / 2; #pragma omp task shared(sum_left) sum_left = sum_omp_tasks_maxthreads(v, low, mid, nthreads / 2); #pragma omp task shared(sum_right) sum_right = sum_omp_tasks_maxthreads(v, mid + 1, high, nthreads - nthreads / 2); #pragma omp taskwait return sum_left + sum_right; } double sum_omp(double *v, int low, int high) { double s = 0; #pragma omp parallel { #pragma omp single nowait s = sum_omp_tasks_maxthreads(v, low, high, omp_get_num_procs()); } return s; } Переключение на последовательную версию при достижении предельного числа запущенных задач
  • 11. Численное интегрирование (метод трапеций) x f(x) a bm = (a + b) / 2 f(b) f(a) f((a + b) / 2)  Площадь левой трапеции: SL = (f(a) + f(m)) * (m - a) / 2  Площадь правой трапеции: SR = (f(m) + f(b)) * (b - m) / 2 S = SL + SR
  • 12. Численное интегрирование (метод трапеций) const double eps = 1E-24; double f(double x) { return 4.0 / (1.0 + x * x); } double integrate(double left, double right, double f_left, double f_right, double leftright_area) { double mid = (left + right) / 2; double f_mid = f(mid); double left_area = (f_left + f_mid) * (mid - left) / 2; double right_area = (f_mid + f_right) * (right - mid) / 2; if (fabs((left_area + right_area) - leftright_area) > eps) { left_area = integrate(left, mid, f_left, f_mid, left_area); right_area = integrate(mid, right, f_mid, f_right, right_area); } return left_area + right_area; } double run_serial() { double pi = integrate(0.0, 1.0, f(0), f(1), (f(0) + f(1)) / 2); } left_area right_area
  • 13. Численное интегрирование (метод трапеций) left_area right_area const double threshold = 0.05; double integrate_omp(double left, double right, double f_left, double f_right, double leftright_area) { double mid = (left + right) / 2; double f_mid = f(mid); double left_area = (f_left + f_mid) * (mid - left) / 2; double right_area = (f_mid + f_right) * (right - mid) / 2; if (fabs((left_area + right_area) - leftright_area) > eps) { if (right - left < threshold) { return integrate(left, right, f_left, f_right, leftright_area); } #pragma omp task shared(left_area) left_area = integrate_omp(left, mid, f_left, f_mid, left_area); right_area = integrate_omp(mid, right, f_mid, f_right, right_area); #pragma omp taskwait } return left_area + right_area; } double run_parallel() { double pi; #pragma omp parallel { #pragma omp single nowait pi = integrate_omp(0.0, 1.0, f(0), f(1), (f(0) + f(1)) / 2); } }
  • 14. Быстрая сортировка (QuickSort) int partition(double *v, int low, int high) { double pivot = v[high]; int i = low - 1; for (int j = low; j < high; j++) { if (v[j] <= pivot) { i++; swap(v, i, j); } } swap(v, i + 1, high); return i + 1; } void quicksort(double *v, int low, int high) { if (low < high) { int k = partition(v, low, high); quicksort(v, low, k - 1); quicksort(v, k + 1, high); } } double run_serial() { quicksort(v, 0, N - 1); }
  • 15. Многопоточная быстрая сортировка (QuickSort) const int threshold = 1000; void quicksort_omp_tasks(double *v, int low, int high) { if (low < high) { if (high - low < threshold) { quicksort(v, low, high); } else { int k = partition(v, low, high); #pragma omp task quicksort_omp_tasks(v, low, k - 1); quicksort_omp_tasks(v, k + 1, high); } } } double run_parallel() { #pragma omp parallel { #pragma omp single nowait quicksort_omp_tasks(v, 0, N - 1); } }
  • 16. Задание  Разработать на OpenMP многопоточную версию функции быстрой сортировки — написать код функции quicksort_omp_tasks  Провести анализ масштабируемости параллельной программы  Шаблон программы находится в каталоге _task