Презентация Параллельное и многопоточное программирование. (Лекция 7) онлайн
На нашем сайте вы можете скачать и просмотреть онлайн доклад-презентацию на тему Параллельное и многопоточное программирование. (Лекция 7) абсолютно бесплатно. Урок-презентация на эту тему содержит всего 81 слайд. Все материалы созданы в программе PowerPoint и имеют формат ppt или же pptx. Материалы и темы для презентаций взяты из открытых источников и загружены их авторами, за качество и достоверность информации в них администрация сайта не отвечает, все права принадлежат их создателям. Если вы нашли то, что искали, отблагодарите авторов - поделитесь ссылкой в социальных сетях, а наш сайт добавьте в закладки.
Презентации » Устройства и комплектующие » Параллельное и многопоточное программирование. (Лекция 7)
Оцените!
Оцените презентацию от 1 до 5 баллов!
- Тип файла:ppt / pptx (powerpoint)
- Всего слайдов:81 слайд
- Для класса:1,2,3,4,5,6,7,8,9,10,11
- Размер файла:625.50 kB
- Просмотров:81
- Скачиваний:0
- Автор:неизвестен
Слайды и текст к этой презентации:
№21 слайд
![pragma omp parallel При входе](/documents_6/03e08b77e364481277cb2c629004b3a4/img20.jpg)
Содержание слайда: #pragma omp parallel
При входе в параллельную область порождаются новые OMP_NUM_THREADS-1 нитей, каждая нить получает свой уникальный номер, причём порождающая нить получает номер 0 и становится основной нитью группы (“мастером”). Остальные нити получают в качестве номера целые числа с 1 до OMP_NUM_THREADS-1. Количество нитей, выполняющих данную параллельную область, остаётся неизменным до момента выхода из области. При выходе из параллельной области производится неявная синхронизация и уничтожаются все нити, кроме породившей.
Когда поток встречает параллельную конструкцию, то создаётся группа потоков в одном из следующих случаев:
Не присутствует клауза if
Значение скалярного выражения в клаузе if не равно нулю
Клауза if может отключить параллельную секцию. Это может быть удобно для программного управления, типа «применять параллелизм или нет»
№22 слайд
![pragma omp parallel Главный](/documents_6/03e08b77e364481277cb2c629004b3a4/img21.jpg)
Содержание слайда: #pragma omp parallel
Главный поток группы (master thread), получает номер 0, и все потоки, включая основной, выполняют параллельно. Число потоков в группе управляется переменной окружения или библиотечной функцией. После создания параллельной области число, потоков на время выполнение этой области остается неизменным. После завершения этой области число потоков может быть изменено. Если выражение в клаузе if равно 0 (false), то область выполняется последовательно.
№23 слайд
![pragma omp parallel Директива](/documents_6/03e08b77e364481277cb2c629004b3a4/img22.jpg)
Содержание слайда: #pragma omp parallel
Директива parallel сообщает компилятору, что структурированный блок кода должен быть выполнен параллельно, в нескольких потоках.
Каждый поток будет выполнять один и тот же поток команд, но не один и тот же набор команд – все зависит от операторов, управляющих логикой программы, таких как if-else.
№24 слайд
![pragma omp parallel Пример](/documents_6/03e08b77e364481277cb2c629004b3a4/img23.jpg)
Содержание слайда: #pragma omp parallel
Пример
#include <stdio.h>
#include <omp.h>
void test(int val)
{
#pragma omp parallel if (val)
if (omp_in_parallel())
{
#pragma omp single
printf_s("val = %d, parallelized with %d threads\n",
val, omp_get_num_threads());
}
else
{
printf_s("val = %d, serialized\n", val);
}
}
int main( )
{
omp_set_num_threads(2);
test(0);
test(2);
}
№27 слайд
![pragma omp parallel Клаузы if](/documents_6/03e08b77e364481277cb2c629004b3a4/img26.jpg)
Содержание слайда: #pragma omp parallel
Клаузы
if (условие) – выполнение параллельной области по условию. Вхождение в параллельную область осуществляется только при выполнении некоторого условия. Если условие не выполнено, то директива не срабатывает и продолжается обработка программы в прежнем режиме;
num_threads (целочисленное выражение) – явное задание количества нитей, которые будут выполнять параллельную область; по умолчанию выбирается последнее значение, установленное с помощью функции omp_set_num_threads(), или значение переменной OMP_NUM_THREADS;
default(shared|none) – всем переменным в параллельной области, которым явно не назначен класс, будет назначен класс shared; none означает, что всем переменным в параллельной области класс должен быть назначен явно;
private (список) – задаёт список переменных, для которых порождается локальная копия в каждой нити; начальное значение локальных копий переменных из списка не определено;
firstprivate (список) – задаёт список переменных, для которых порождается локальная копия в каждой нити; локальные копии переменных инициализируются значениями этих переменных в нити-мастере;
№28 слайд
![pragma omp parallel Клаузы](/documents_6/03e08b77e364481277cb2c629004b3a4/img27.jpg)
Содержание слайда: #pragma omp parallel
Клаузы
shared (список) – задаёт список переменных, общих для всех нитей;
copyin (список) – задаёт список переменных, объявленных как threadprivate, которые при входе в параллельную область инициализируются значениями соответствующих переменных в нити-мастере;
reduction (оператор:список) – задаёт оператор и список общих переменных; для каждой переменной создаются локальные копии в каждой нити; локальные копии инициализируются соответственно типу оператора (для аддитивных операций – 0 или его аналоги, для мультипликативных операций – 1 или её аналоги); над локальными копиями переменных после выполнения всех операторов параллельной области выполняется заданный оператор; оператор это: +, *, -, &, |, ^, &&, ||; порядок выполнения операторов не определён, поэтому результат может отличаться от запуска к запуску.
№29 слайд
![pragma omp parallel Если](/documents_6/03e08b77e364481277cb2c629004b3a4/img28.jpg)
Содержание слайда: #pragma omp parallel
Если поток в группе, выполняя параллельную область кода, встретит другую параллельную конструкцию, она создает новую группу и становится основным потоком в новой группе. Вложенные параллельные области выполняются по умолчанию последовательно. И как следствие, по умолчанию вложенная параллельная область выполняется группой, состоящей из одного потока.
Поведение по умолчанию может быть изменено путем применения библиотечной функции времени выполнения omp_set_nested или переменной среды OMP_NESTED. Если вызывается библиотечные функции то нужно внести заголовочный файл omp.h .
№30 слайд
![pragma omp parallel](/documents_6/03e08b77e364481277cb2c629004b3a4/img29.jpg)
Содержание слайда: #pragma omp parallel
Вложенность. Пример
#include <omp.h>
#include <stdio.h>
void report_num_threads(int level)
{
#pragma omp single
{
printf("Level %d: number of threads in the team - %d\n",
level, omp_get_num_threads());
}
}
int main()
{
omp_set_dynamic(0);
omp_set_nested(…);//Меняем
#pragma omp parallel num_threads(2)
{
report_num_threads(1);
#pragma omp parallel num_threads(2)
{
report_num_threads(2);
#pragma omp parallel num_threads(2)
{
report_num_threads(3);
}
}
}
return 0;
}
№31 слайд
![omp set nested Функция omp](/documents_6/03e08b77e364481277cb2c629004b3a4/img30.jpg)
Содержание слайда: omp_set_nested
Функция omp_set_nested() разрешает или запрещает вложенный параллелизм. В качестве значения параметра задаётся 0 или 1.
Если вложенный параллелизм разрешён, то каждая нить, в которой встретится описание параллельной области, породит для её выполнения новую группу нитей. Сама породившая нить станет в новой группе нитью-мастером. Если система не поддерживает вложенный параллелизм, данная функция не будет иметь эффекта.
Узнать значение переменной OMP_NESTED можно при помощи функции omp_get_nested().
№33 слайд
![pragma omp parallel](/documents_6/03e08b77e364481277cb2c629004b3a4/img32.jpg)
Содержание слайда: #pragma omp parallel
Примечания
Если выполнение потока аварийно прерывается внутри параллельной области, то также прерывается выполнение всех потоков во всех группах. Порядок прерывания работы потоков не определен. Вся работа, проделанная группой до последней барьерной синхронизации, гарантированно будет выполнена. Объем выполненной работы, проделанной каждым потоком после последней барьерной синхронизации, до аварийного завершения работы потоков не определен.
Все порождённые нити исполняют один и тот же код, соответствующий параллельной области. Предполагается, что в SMP-системе нити будут распределены по различным процессорам (однако это, как правило, находится в ведении операционной системы).
Во время исполнения любой поток может приостоновить выполнение своей неявной задачи в точке планирования задач (task scheduling point) и переключиться на выполнение любой явно-сгенерированной задачи прежде чем возобновить выполнение неявной задачи.
Очень часто параллельная область не содержит ничего, кроме конструкции разделения работы (т.е. конструкция разделения работы тесно вложена в параллельную область). В этом случае можно указывать не две директивы, а указать одну комбинированную.
№34 слайд
![pragma omp parallel](/documents_6/03e08b77e364481277cb2c629004b3a4/img33.jpg)
Содержание слайда: #pragma omp parallel
Ограничения
Программа не должна зависеть от какого-либо порядка определения опций параллельной директивы, или от каких-либо побочных эффектов определения опций;
Только одна опция if может присутствовать в директиве;
Только одна опция num_threads может присутствовать в директиве. Выражение в опции num_threads должно быть целочисленным;
Бросок исключения выполненный внутри параллельной области должен вызывать обработку исключения в рамках одной параллельной области, и той же нити, которая бросила исключение.
№51 слайд
![Пример Директива omp sections](/documents_6/03e08b77e364481277cb2c629004b3a4/img50.jpg)
Содержание слайда: Пример:
Директива omp sections
#include <stdio.h>
#include <omp.h>
int main()
{ int i;
#pragma omp parallel sections private(i)
{
#pragma omp section
printf(“1st half\n”);
for (i=0;i<500;i++) printf(“%d ”);
#pragma omp section
printf(“2nd half\n”);
for (i=501;i<1000;i++) printf(“%d ”);
}
return 0;
}
№52 слайд
![Пример Директива omp single](/documents_6/03e08b77e364481277cb2c629004b3a4/img51.jpg)
Содержание слайда: Пример:
Директива omp single
#include <stdio.h>
#include <omp.h>
int main()
{ int i;
#pragma omp parallel private(i)
{
#pragma omp for
for (i=0;i<1000;i++) printf(“%d ”);
#pragma omp single
printf(“I’m thread %d!\n”,get_thread_num());
#pragma omp for
for (i=0;i<1000;i++) printf(“%d ”);
}
return 0;
}
№53 слайд
![Пример Директива omp master](/documents_6/03e08b77e364481277cb2c629004b3a4/img52.jpg)
Содержание слайда: Пример:
Директива omp master
#include <stdio.h>
#include <omp.h>
int main()
{ int i;
#pragma omp parallel private(i)
{
#pragma omp for
for (i=0;i<1000;i++) printf(“%d ”);
#pragma omp master
printf(“I’m Master!\n”)
#pragma omp for
for (i=0;i<1000;i++) printf(“%d ”);
}
return 0;
}
№54 слайд
![Способы разделения работы](/documents_6/03e08b77e364481277cb2c629004b3a4/img53.jpg)
Содержание слайда: Способы разделения работы между потоками
Параллельное исполнение цикла for
#pragma omp for параметры:
schedule - распределения итераций цикла между потоками
schedule(static,n) – статическое распределение
schedule(dynamic,n) – динамическое распределение
schedule(guided,n) – управляемое распределение
schedule(runtime) – определяется OMP_SCHEDULE
nowait – отключение синхронизации в конце цикла
ordered – выполнение итераций в последовательном порядке
Параметры области видимости переменных…
№55 слайд
![Пример Директива omp for](/documents_6/03e08b77e364481277cb2c629004b3a4/img54.jpg)
Содержание слайда: Пример:
Директива omp for
#include <stdio.h>
#include <omp.h>
int main()
{ int i;
#pragma omp parallel private(i)
{
#pragma omp for schedule(static,10) nowait
for (i=0;i<1000;i++) printf(“%d ”,i);
#pragma omp for schedule(dynamic,1)
for (i=‘a’;i<=‘z’;i++) printf(“%c ”,i);
}
return 0;
}
№65 слайд
![Синхронизация потоков](/documents_6/03e08b77e364481277cb2c629004b3a4/img64.jpg)
Содержание слайда: Синхронизация потоков
Блокировки
omp_lock_t
void omp_init_lock(omp_lock_t *lock)
void omp_destroy_lock(omp_lock_t *lock)
void omp_set_lock(omp_lock_t *lock)
void omp_unset_lock(omp_lock_t *lock)
int omp_test_lock(omp_lock_t *lock)
omp_nest_lock_t
void omp_init_nest_lock(omp_nest_lock_t *lock)
void omp_destroy_nest__lock(omp_nest_lock_t *lock)
void omp_set_nest__lock(omp_nest_lock_t *lock)
void omp_unset_nest__lock(omp_nest_lock_t *lock)
int omp_test_nest__lock(omp_nest_lock_t *lock)
№66 слайд
![Пример Использование](/documents_6/03e08b77e364481277cb2c629004b3a4/img65.jpg)
Содержание слайда: Пример:
Использование блокировок
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
int x[1000];
int main()
{ int i,max;
omp_lock_t lock;
omp_init_lock(&lock);
for (i=0;i<1000;i++) x[i]=rand();
max = x[0];
#pragma omp parallel for shared(x,lock)
for(i=0;i<1000;i++)
{ omp_set_lock(&lock);
if (x[i]>max) max=x[i];
omp_set_unlock(&lock);
}
omp_destroy_lock(&lock);
return 0;
}
№67 слайд
![Функции OpenMP void omp set](/documents_6/03e08b77e364481277cb2c629004b3a4/img66.jpg)
Содержание слайда: Функции OpenMP
void omp_set_num_threads(int num_threads)
int omp_get_num_threads(void)
int omp_get_max_threads(void)
int omp_get_thread_num(void)
int omp_get_num_procs(void)
int omp_in_parallel(void)
void omp_set_dynamic(int dynamic_threads)
int omp_get_dynamic(void)
void omp_set_nested(int nested)
int omp_get_nested (void)
double omp_get_wtick(void)
Функции работы с блокировками
№70 слайд
![Пример программы сложение](/documents_6/03e08b77e364481277cb2c629004b3a4/img69.jpg)
Содержание слайда: Пример программы: сложение двух векторов
Параллельная программа
#include<omp.h>
#define N 1000
double x[N],y[N],z[N];
int main()
{ int i;
int num;
for (i=0;i<N;i++) x[i]=y[i]=i;
num = omp_get_num_threads();
#pragma omp parallel for schedule(static,N/num)
for (i=0;i<N;i++)
z[i]=x[i]+y[i];
return 0;
}
№71 слайд
![Пример программы решение](/documents_6/03e08b77e364481277cb2c629004b3a4/img70.jpg)
Содержание слайда: Пример программы:
решение краевой задачи
Метод Зейделя
do {
dmax = 0; // максимальное изменение значений u
for ( i=1; i<N+1; i++ )
for ( j=1; j<N+1; j++ ) {
temp = u[i][j];
u[i][j] = 0.25*(u[i-1][j]+u[i+1][j]+
u[i][j-1]+u[i][j+1]–h*h*f[i][j]);
dm = fabs(temp-u[i][j]);
if ( dmax < dm ) dmax = dm;
}
} while ( dmax > eps );
№72 слайд
![Пример программы решение](/documents_6/03e08b77e364481277cb2c629004b3a4/img71.jpg)
Содержание слайда: Пример программы:
решение краевой задачи
omp_lock_t dmax_lock;
omp_init_lock (&dmax_lock);
do {
dmax = 0; // максимальное изменение значений u
#pragma omp parallel for shared(u,n,dmax) private(i,temp,d)
for ( i=1; i<N+1; i++ ) {
#pragma omp parallel for shared(u,n,dmax) private(j,temp,d)
for ( j=1; j<N+1; j++ ) {
temp = u[i][j];
u[i][j] = 0.25*(u[i-1][j]+u[i+1][j]+
u[i][j-1]+u[i][j+1]–h*h*f[i][j]);
d = fabs(temp-u[i][j]);
omp_set_lock(&dmax_lock);
if ( dmax < d ) dmax = d;
omp_unset_lock(&dmax_lock);
} // конец вложенной параллельной области
} // конец внешней параллельной области
} while ( dmax > eps );
№73 слайд
![Пример программы решение](/documents_6/03e08b77e364481277cb2c629004b3a4/img72.jpg)
Содержание слайда: Пример программы:
решение краевой задачи
omp_lock_t dmax_lock;
omp_init_lock (&dmax_lock);
do {
dmax = 0; // максимальное изменение значений u
#pragma omp parallel for shared(u,n,dmax) private(i,temp,d)
for ( i=1; i<N+1; i++ ) {
#pragma omp parallel for shared(u,n,dmax) private(j,temp,d)
for ( j=1; j<N+1; j++ ) {
temp = u[i][j];
u[i][j] = 0.25*(u[i-1][j]+u[i+1][j]+
u[i][j-1]+u[i][j+1]–h*h*f[i][j]);
d = fabs(temp-u[i][j])
omp_set_lock(&dmax_lock);
if ( dmax < d ) dmax = d;
omp_unset_lock(&dmax_lock);
} // конец вложенной параллельной области
} // конец внешней параллельной области
} while ( dmax > eps );
№74 слайд
![Пример программы решение](/documents_6/03e08b77e364481277cb2c629004b3a4/img73.jpg)
Содержание слайда: Пример программы:
решение краевой задачи
omp_lock_t dmax_lock;
omp_init_lock(&dmax_lock);
do {
dmax = 0; // максимальное изменение значений u
#pragma omp parallel for shared(u,n,dmax) private(i,temp,d,dm)
for ( i=1; i<N+1; i++ ) {
dm = 0;
for ( j=1; j<N+1; j++ ) {
temp = u[i][j];
u[i][j] = 0.25*(u[i-1][j]+u[i+1][j]+
u[i][j-1]+u[i][j+1]–h*h*f[i][j]);
d = fabs(temp-u[i][j])
if ( dm < d ) dm = d;
}
omp_set_lock(&dmax_lock);
if ( dmax < dm ) dmax = dm;
omp_unset_lock(&dmax_lock);
}
} // конец параллельной области
} while ( dmax > eps );
№75 слайд
![Пример программы решение](/documents_6/03e08b77e364481277cb2c629004b3a4/img74.jpg)
Содержание слайда: Пример программы:
решение краевой задачи
omp_lock_t dmax_lock;
omp_init_lock(&dmax_lock);
do {
dmax = 0; // максимальное изменение значений u
#pragma omp parallel for shared(u,n,dmax) private(i,temp,d,dm)
for ( i=1; i<N+1; i++ ) {
dm = 0;
for ( j=1; j<N+1; j++ ) {
temp = u[i][j];
u[i][j] = 0.25*(u[i-1][j]+u[i+1][j]+
u[i][j-1]+u[i][j+1]–h*h*f[i][j]);
d = fabs(temp-u[i][j])
if ( dm < d ) dm = d;
}
omp_set_lock(&dmax_lock);
if ( dmax < dm ) dmax = dm;
omp_unset_lock(&dmax_lock);
}
} // конец параллельной области
} while ( dmax > eps );
№76 слайд
![Пример программы решение](/documents_6/03e08b77e364481277cb2c629004b3a4/img75.jpg)
Содержание слайда: Пример программы:
решение краевой задачи
omp_lock_t dmax_lock;
omp_init_lock(&dmax_lock);
do {
dmax = 0; // максимальное изменение значений u
#pragma omp parallel for shared(u,n,dmax) private(i,temp,d,dm)
for ( i=1; i<N+1; i++ ) {
dm = 0;
for ( j=1; j<N+1; j++ ) {
temp = u[i][j];
un[i][j] = 0.25*(u[i-1][j]+u[i+1][j]+
u[i][j-1]+u[i][j+1]–h*h*f[i][j]);
d = fabs(temp-un[i][j])
if ( dm < d ) dm = d;
}
omp_set_lock(&dmax_lock);
if ( dmax < dm ) dmax = dm;
omp_unset_lock(&dmax_lock);
}
} // конец параллельной области
for ( i=1; i<N+1; i++ ) // обновление данных
for ( j=1; j<N+1; j++ )
u[i][j] = un[i][j];
} while ( dmax > eps );
№77 слайд
![Пример программы решение](/documents_6/03e08b77e364481277cb2c629004b3a4/img76.jpg)
Содержание слайда: Пример программы:
решение краевой задачи
omp_lock_t dmax_lock;
omp_init_lock(&dmax_lock);
do {
dmax = 0; // максимальное изменение значений u
#pragma omp parallel for shared(u,n,dmax) private(i,temp,d,dm)
for ( i=1; i<N+1; i++ ) {
dm = 0;
for ( j=1; j<N+1; j++ ) {
temp = u[i][j];
un[i][j] = 0.25*(u[i-1][j]+u[i+1][j]+
u[i][j-1]+u[i][j+1]–h*h*f[i][j]);
d = fabs(temp-un[i][j]);
if ( dm < d ) dm = d;
}
omp_set_lock(&dmax_lock);
if ( dmax < dm ) dmax = dm;
omp_unset_lock(&dmax_lock);
}
} // конец параллельной области
for ( i=1; i<N+1; i++ ) // обновление данных
for ( j=1; j<N+1; j++ )
u[i][j] = un[i][j];
} while ( dmax > eps );
№79 слайд
![Пример программы решение](/documents_6/03e08b77e364481277cb2c629004b3a4/img78.jpg)
Содержание слайда: Пример программы:
решение краевой задачи
omp_lock_t dmax_lock;
omp_init_lock(&dmax_lock);
do {
// максимальное изменение значений u
dmax = 0;
// нарастание волны (nx – размер волны)
for ( nx=1; nx<N+1; nx++ ) {
dm[nx] = 0;
#pragma omp parallel for \
shared(u,nx,dm) \
private(i,j,temp,d)
for ( i=1; i<nx+1; i++ ) {
j = nx + 1 – i;
temp = u[i][j];
u[i][j] = 0.25*(u[i-1][j]+
u[i+1][j]+u[i][j-1]+u[i][j+1]
–h*h*f[i][j]);
d = fabs(temp-u[i][j]);
if ( dm[i] < d ) dm[i] = d;
} // конец параллельной области
}
Скачать все slide презентации Параллельное и многопоточное программирование. (Лекция 7) одним архивом:
Похожие презентации
-
Параллельное и многопоточное программирование. OpenMP. (Лекция 6)
-
Параллельное программирование с использованием OpenMP. Лекция 2
-
Параллельное программирование с использованием OpenMP. Лекция 1
-
Модель параллельного программирования. Лекция 2
-
Параллельное программирование. Лекция 1
-
Расширенные возможности многопоточного программирования. Лекция 1
-
Параллельное программирование. Проблемы многопоточных приложений. Примитивы синхронизации потоков
-
Многопоточное программирование (Лекция 5). IPC, SysV
-
Многопоточное программирование (лекция 4). Создание процессов, copy-on-write, атрибуты процесса, ожидание потомка
-
Многопоточное программирование (Лекция 2). Сокеты Беркли, IPv4, IPv6, UDS, мультиплексирование