PPt4Web Хостинг презентаций

Главная / Информатика / Многопоточное программирование в OpenMP
X Код для использования на сайте:

Скопируйте этот код и вставьте его на свой сайт

X

Чтобы скачать данную презентацию, порекомендуйте, пожалуйста, её своим друзьям в любой соц. сети.

После чего скачивание начнётся автоматически!

Кнопки:

Презентация на тему: Многопоточное программирование в OpenMP


Скачать эту презентацию

Презентация на тему: Многопоточное программирование в OpenMP


Скачать эту презентацию

№ слайда 1 Многопоточное программирование в OpenMP Киреев Сергей ИВМиМГ
Описание слайда:

Многопоточное программирование в OpenMP Киреев Сергей ИВМиМГ

№ слайда 2 Процессы и потоки Процесс – это среда выполнения задачи (программы).
Описание слайда:

Процессы и потоки Процесс – это среда выполнения задачи (программы).

№ слайда 3 Процессы и потоки Поток – это «облегченный процесс».
Описание слайда:

Процессы и потоки Поток – это «облегченный процесс».

№ слайда 4 Многопоточное программирование Используется для создания параллельных программ д
Описание слайда:

Многопоточное программирование Используется для создания параллельных программ для систем с общей памятью И для других целей…

№ слайда 5 OpenMP – это… Стандарт интерфейса для многопоточного программирования над общей
Описание слайда:

OpenMP – это… Стандарт интерфейса для многопоточного программирования над общей памятью Набор средств для языков C/C++ и Fortran: Директивы компилятора #pragma omp … Библиотечные подпрограммы get_num_threads() Переменные окружения OMP_NUM_THREADS

№ слайда 6 Модель программирования Fork-join параллелизм Явное указание параллельных секций
Описание слайда:

Модель программирования Fork-join параллелизм Явное указание параллельных секций Поддержка вложенного параллелизма Поддержка динамических потоков

№ слайда 7 Пример: Объявление параллельной секции #include <omp.h> int main() { // по
Описание слайда:

Пример: Объявление параллельной секции #include <omp.h> int main() { // последовательный код #pragma omp parallel { // параллельный код } // последовательный код return 0; }

№ слайда 8 Пример: Hello, World! #include <stdio.h> #include <omp.h> int main()
Описание слайда:

Пример: Hello, World! #include <stdio.h> #include <omp.h> int main() { printf(“Hello, World!\n”); #pragma omp parallel { int i,n; i = omp_get_thread_num(); n = omp_get_num_threads(); printf(“I’m thread %d of %d\n”,i,n); } return 0; }

№ слайда 9 Задание числа потоков Переменная окружения OMP_NUM_THREADS >env OMP_NUM_THREA
Описание слайда:

Задание числа потоков Переменная окружения OMP_NUM_THREADS >env OMP_NUM_THREADS=4 ./a.out Функция omp_set_num_threads(int) omp_set_num_threads(4); #pragma omp parallel { . . . } Параметр num_threads #pragma omp parallel num_threads(4) { . . . }

№ слайда 10 Способы разделения работы между потоками
Описание слайда:

Способы разделения работы между потоками

№ слайда 11 Пример: Директива omp for #include <stdio.h> #include <omp.h> int ma
Описание слайда:

Пример: Директива omp for #include <stdio.h> #include <omp.h> int main() { int i; #pragma omp parallel { #pragma omp for for (i=0;i<1000;i++) printf(“%d ”,i); } return 0; }

№ слайда 12 Пример: Директива omp for #include <stdio.h> #include <omp.h> int ma
Описание слайда:

Пример: Директива omp for #include <stdio.h> #include <omp.h> int main() { int i; #pragma omp parallel for for (i=0;i<1000;i++) printf(“%d ”,i); return 0; }

№ слайда 13 Пример: Директива omp sections #include <stdio.h> #include <omp.h> i
Описание слайда:

Пример: Директива 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; }

№ слайда 14 Пример: Директива omp single #include <stdio.h> #include <omp.h> int
Описание слайда:

Пример: Директива 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; }

№ слайда 15 Пример: Директива omp master #include <stdio.h> #include <omp.h> int
Описание слайда:

Пример: Директива 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; }

№ слайда 16 Способы разделения работы между потоками Параллельное исполнение цикла for #prag
Описание слайда:

Способы разделения работы между потоками Параллельное исполнение цикла for #pragma omp for параметры: schedule - распределения итераций цикла между потоками schedule(static,n) – статическое распределение schedule(dynamic,n) – динамическое распределение schedule(guided,n) – управляемое распределение schedule(runtime) – определяется OMP_SCHEDULE nowait – отключение синхронизации в конце цикла ordered – выполнение итераций в последовательном порядке Параметры области видимости переменных…

№ слайда 17 Пример: Директива omp for #include <stdio.h> #include <omp.h> int ma
Описание слайда:

Пример: Директива 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; }

№ слайда 18 Области видимости переменных Переменные, объявленные внутри параллельного блока,
Описание слайда:

Области видимости переменных Переменные, объявленные внутри параллельного блока, являются локальными для потока: #pragma omp parallel { int num; num = omp_get_thread_num() printf(“Поток %d\n”,num); }

№ слайда 19 Области видимости переменных Переменные, объявленные вне параллельного блока, оп
Описание слайда:

Области видимости переменных Переменные, объявленные вне параллельного блока, определяются параметрами директив OpenMP: private firstprivate lastprivate shared default reduction threadprivate copying

№ слайда 20 Области видимости переменных Переменные, объявленные вне параллельного блока, оп
Описание слайда:

Области видимости переменных Переменные, объявленные вне параллельного блока, определяются параметрами директив OpenMP: private firstprivate lastprivate shared default reduction threadprivate copying

№ слайда 21 Области видимости переменных Переменные, объявленные вне параллельного блока, оп
Описание слайда:

Области видимости переменных Переменные, объявленные вне параллельного блока, определяются параметрами директив OpenMP: private firstprivate lastprivate shared default reduction threadprivate copying

№ слайда 22 Области видимости переменных Переменные, объявленные вне параллельного блока, оп
Описание слайда:

Области видимости переменных Переменные, объявленные вне параллельного блока, определяются параметрами директив OpenMP: private firstprivate lastprivate shared default reduction threadprivate copying

№ слайда 23 Области видимости переменных Переменные, объявленные вне параллельного блока, оп
Описание слайда:

Области видимости переменных Переменные, объявленные вне параллельного блока, определяются параметрами директив OpenMP: private firstprivate lastprivate shared default reduction threadprivate copying

№ слайда 24 Области видимости переменных Переменные, объявленные вне параллельного блока, оп
Описание слайда:

Области видимости переменных Переменные, объявленные вне параллельного блока, определяются параметрами директив OpenMP: private firstprivate lastprivate shared default reduction threadprivate copying

№ слайда 25 Области видимости переменных Переменные, объявленные вне параллельного блока, оп
Описание слайда:

Области видимости переменных Переменные, объявленные вне параллельного блока, определяются параметрами директив OpenMP: private firstprivate lastprivate shared default reduction threadprivate copying

№ слайда 26 Области видимости переменных Переменные, объявленные вне параллельного блока, оп
Описание слайда:

Области видимости переменных Переменные, объявленные вне параллельного блока, определяются параметрами директив OpenMP: private firstprivate lastprivate shared default reduction threadprivate copying

№ слайда 27 Области видимости переменных Переменные, объявленные вне параллельного блока, оп
Описание слайда:

Области видимости переменных Переменные, объявленные вне параллельного блока, определяются параметрами директив OpenMP: private firstprivate lastprivate shared default reduction threadprivate copying

№ слайда 28 Синхронизация потоков Директивы синхронизации потоков: master critical barrier a
Описание слайда:

Синхронизация потоков Директивы синхронизации потоков: master critical barrier atomic flush ordered Блокировки omp_lock_t

№ слайда 29 Синхронизация потоков Директивы синхронизации потоков: master critical barrier a
Описание слайда:

Синхронизация потоков Директивы синхронизации потоков: master critical barrier atomic flush ordered

№ слайда 30 Синхронизация потоков Директивы синхронизации потоков: master critical barrier a
Описание слайда:

Синхронизация потоков Директивы синхронизации потоков: master critical barrier atomic flush ordered

№ слайда 31 Синхронизация потоков Директивы синхронизации потоков: master critical barrier a
Описание слайда:

Синхронизация потоков Директивы синхронизации потоков: master critical barrier atomic flush ordered

№ слайда 32 Синхронизация потоков Директивы синхронизации потоков: master critical barrier a
Описание слайда:

Синхронизация потоков Директивы синхронизации потоков: master critical barrier atomic flush ordered

№ слайда 33 Синхронизация потоков Директивы синхронизации потоков: master critical barrier a
Описание слайда:

Синхронизация потоков Директивы синхронизации потоков: master critical barrier atomic flush ordered

№ слайда 34 Синхронизация потоков Директивы синхронизации потоков: master critical barrier a
Описание слайда:

Синхронизация потоков Директивы синхронизации потоков: master critical barrier atomic flush ordered

№ слайда 35 Синхронизация потоков Блокировки omp_lock_t void omp_init_lock(omp_lock_t *lock)
Описание слайда:

Синхронизация потоков Блокировки 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)

№ слайда 36 Пример: Использование блокировок #include <stdio.h> #include <stdlib.h&
Описание слайда:

Пример: Использование блокировок #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; }

№ слайда 37 Функции OpenMP void omp_set_num_threads(int num_threads) int omp_get_num_threads
Описание слайда:

Функции 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) Функции работы с блокировками

№ слайда 38 Порядок создания параллельных программ Написать и отладить последовательную прог
Описание слайда:

Порядок создания параллельных программ Написать и отладить последовательную программу Дополнить программу директивами OpenMP Скомпилировать программу компилятором с поддержкой OpenMP Задать переменные окружения Запустить программу

№ слайда 39 Пример программы: сложение двух векторов Последовательная программа #define N 10
Описание слайда:

Пример программы: сложение двух векторов Последовательная программа #define N 1000 double x[N],y[N],z[N]; int main() { int i; for (i=0;i<N;i++) x[i]=y[i]=i; for (i=0;i<N;i++) z[i]=x[i]+y[i]; return 0; }

№ слайда 40 Пример программы: сложение двух векторов Параллельная программа #include<omp.
Описание слайда:

Пример программы: сложение двух векторов Параллельная программа #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; }

№ слайда 41 Пример программы: решение краевой задачи Метод Зейделя do { dmax = 0; // максима
Описание слайда:

Пример программы: решение краевой задачи Метод Зейделя 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 );

№ слайда 42 Пример программы: решение краевой задачи omp_lock_t dmax_lock; omp_init_lock (&a
Описание слайда:

Пример программы: решение краевой задачи 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 );

№ слайда 43 Пример программы: решение краевой задачи omp_lock_t dmax_lock; omp_init_lock (&a
Описание слайда:

Пример программы: решение краевой задачи 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 );

№ слайда 44 Пример программы: решение краевой задачи omp_lock_t dmax_lock; omp_init_lock(&am
Описание слайда:

Пример программы: решение краевой задачи 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 );

№ слайда 45 Пример программы: решение краевой задачи omp_lock_t dmax_lock; omp_init_lock(&am
Описание слайда:

Пример программы: решение краевой задачи 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 );

№ слайда 46 Пример программы: решение краевой задачи omp_lock_t dmax_lock; omp_init_lock(&am
Описание слайда:

Пример программы: решение краевой задачи 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 );

№ слайда 47 Пример программы: решение краевой задачи omp_lock_t dmax_lock; omp_init_lock(&am
Описание слайда:

Пример программы: решение краевой задачи 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 );

№ слайда 48 Пример программы: решение краевой задачи Другие способы устранения зависимостей
Описание слайда:

Пример программы: решение краевой задачи Другие способы устранения зависимостей Четно-нечетное упорядочивание Волновые схемы

№ слайда 49 Пример программы: решение краевой задачи omp_lock_t dmax_lock; omp_init_lock(&am
Описание слайда:

Пример программы: решение краевой задачи 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; } // конец параллельной области }

№ слайда 50 Пример программы: решение краевой задачи Волновая схема с разбиением на блоки
Описание слайда:

Пример программы: решение краевой задачи Волновая схема с разбиением на блоки

№ слайда 51 Рекомендуемая литература по OpenMP http://openmp.org http://www.parallel.ru/tech
Описание слайда:

Рекомендуемая литература по OpenMP http://openmp.org http://www.parallel.ru/tech/tech_dev/openmp.html https://computing.llnl.gov/tutorials/openMP/

Скачать эту презентацию

Презентации по предмету
Презентации из категории
Лучшее на fresher.ru