Презентация Параллельное и многопоточное программирование. (Лекция 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
  • Автор:
    неизвестен



Слайды и текст к этой презентации:

№1 слайд
Параллельное и многопоточное
Содержание слайда: Параллельное и многопоточное программирование лекция 7

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

№3 слайд
Модель памяти OpenMP
Содержание слайда: Модель памяти OpenMP

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

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

№6 слайд
Подключение в Visual Studio
Содержание слайда: Подключение в Visual Studio

№7 слайд
Формат записи директив и
Содержание слайда: Формат записи директив и клауз OpenMP Формат записи

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

№9 слайд
Некоторые функции OpenMP
Содержание слайда: Некоторые функции OpenMP

№10 слайд
Пример Hello, World! include
Содержание слайда: Пример: 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; }

№11 слайд
Задание числа потоков
Содержание слайда: Задание числа потоков Переменная среды OMP_NUM_THREADS Функция omp_set_num_threads(int) omp_set_num_threads(4); #pragma omp parallel { . . . } Параметр(клауза, условие) num_threads #pragma omp parallel num_threads(4) { . . . }

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

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

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

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

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

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

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

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

№20 слайд
pragma omp parallel Директива
Содержание слайда: #pragma omp parallel Директива определяет параллельную область. Область программы, которая выполняется несколькими потоками одновременно. Это фундаментальная конструкция, которая начинает параллельное выполнение.

№21 слайд
pragma omp parallel При входе
Содержание слайда: #pragma omp parallel При входе в параллельную область порождаются новые OMP_NUM_THREADS-1 нитей, каждая нить получает свой уникальный номер, причём порождающая нить получает номер 0 и становится основной нитью группы (“мастером”). Остальные нити получают в качестве номера целые числа с 1 до OMP_NUM_THREADS-1. Количество нитей, выполняющих данную параллельную область, остаётся неизменным до момента выхода из области. При выходе из параллельной области производится неявная синхронизация и уничтожаются все нити, кроме породившей. Когда поток встречает параллельную конструкцию, то создаётся группа потоков в одном из следующих случаев: Не присутствует клауза if Значение скалярного выражения в клаузе if не равно нулю Клауза if может отключить параллельную секцию. Это может быть удобно для программного управления, типа «применять параллелизм или нет»

№22 слайд
pragma omp parallel Главный
Содержание слайда: #pragma omp parallel Главный поток группы (master thread), получает номер 0, и все потоки, включая основной, выполняют параллельно. Число потоков в группе управляется переменной окружения или библиотечной функцией. После создания параллельной области число, потоков на время выполнение этой области остается неизменным. После завершения этой области число потоков может быть изменено. Если выражение в клаузе if равно 0 (false), то область выполняется последовательно.

№23 слайд
pragma omp parallel Директива
Содержание слайда: #pragma omp parallel Директива parallel сообщает компилятору, что структурированный блок кода должен быть выполнен параллельно, в нескольких потоках. Каждый поток будет выполнять один и тот же поток команд, но не один и тот же набор команд – все зависит от операторов, управляющих логикой программы, таких как if-else.

№24 слайд
pragma omp parallel Пример
Содержание слайда: #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); }

№25 слайд
pragma omp parallel В конце
Содержание слайда: #pragma omp parallel В конце параллельной области осуществляется, не указанная явно, барьерная синхронизация.

№26 слайд
pragma omp parallel Клауза
Содержание слайда: #pragma omp parallel Клауза одна из следующих: if (скалярное выражение) num_threads (целое число) private (список) shared (список) default (shared | none) firstprivate (список) reduction (оператор : список) copyin (список) proc_bind (master | close | spread)

№27 слайд
pragma omp parallel Клаузы if
Содержание слайда: #pragma omp parallel Клаузы if (условие) – выполнение параллельной области по условию. Вхождение в параллельную область осуществляется только при выполнении некоторого условия. Если условие не выполнено, то директива не срабатывает и продолжается обработка программы в прежнем режиме; num_threads (целочисленное выражение) – явное задание количества нитей, которые будут выполнять параллельную область; по умолчанию выбирается последнее значение, установленное с помощью функции omp_set_num_threads(), или значение переменной OMP_NUM_THREADS; default(shared|none) – всем переменным в параллельной области, которым явно не назначен класс, будет назначен класс shared; none означает, что всем переменным в параллельной области класс должен быть назначен явно; private (список) – задаёт список переменных, для которых порождается локальная копия в каждой нити; начальное значение локальных копий переменных из списка не определено; firstprivate (список) – задаёт список переменных, для которых порождается локальная копия в каждой нити; локальные копии переменных инициализируются значениями этих переменных в нити-мастере;

№28 слайд
pragma omp parallel Клаузы
Содержание слайда: #pragma omp parallel Клаузы shared (список) – задаёт список переменных, общих для всех нитей; copyin (список) – задаёт список переменных, объявленных как threadprivate, которые при входе в параллельную область инициализируются значениями соответствующих переменных в нити-мастере; reduction (оператор:список) – задаёт оператор и список общих переменных; для каждой переменной создаются локальные копии в каждой нити; локальные копии инициализируются соответственно типу оператора (для аддитивных операций – 0 или его аналоги, для мультипликативных операций – 1 или её аналоги); над локальными копиями переменных после выполнения всех операторов параллельной области выполняется заданный оператор; оператор это: +, *, -, &, |, ^, &&, ||; порядок выполнения операторов не определён, поэтому результат может отличаться от запуска к запуску.

№29 слайд
pragma omp parallel Если
Содержание слайда: #pragma omp parallel Если поток в группе, выполняя параллельную область кода, встретит другую параллельную конструкцию, она создает новую группу и становится основным потоком в новой группе. Вложенные параллельные области выполняются по умолчанию последовательно. И как следствие, по умолчанию вложенная параллельная область выполняется группой, состоящей из одного потока. Поведение по умолчанию может быть изменено путем применения библиотечной функции времени выполнения omp_set_nested или переменной среды OMP_NESTED. Если вызывается библиотечные функции то нужно внести заголовочный файл omp.h .

№30 слайд
pragma omp parallel
Содержание слайда: #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
Содержание слайда: omp_set_nested Функция omp_set_nested() разрешает или запрещает вложенный параллелизм. В качестве значения параметра задаётся 0 или 1. Если вложенный параллелизм разрешён, то каждая нить, в которой встретится описание параллельной области, породит для её выполнения новую группу нитей. Сама породившая нить станет в новой группе нитью-мастером. Если система не поддерживает вложенный параллелизм, данная функция не будет иметь эффекта. Узнать значение переменной OMP_NESTED можно при помощи функции omp_get_nested().

№32 слайд
omp set dynamic Omp set
Содержание слайда: omp_set_dynamic Omp_set_dynamic функция позволяет включить или отключить динамическую корректировку числа потоков, доступных для выполнения параллельных областей. Формат следующий:

№33 слайд
pragma omp parallel
Содержание слайда: #pragma omp parallel Примечания Если выполнение потока аварийно прерывается внутри параллельной области, то также прерывается выполнение всех потоков во всех группах. Порядок прерывания работы потоков не определен. Вся работа, проделанная группой до последней барьерной синхронизации, гарантированно будет выполнена. Объем выполненной работы, проделанной каждым потоком после последней барьерной синхронизации, до аварийного завершения работы потоков не определен. Все порождённые нити исполняют один и тот же код, соответствующий параллельной области. Предполагается, что в SMP-системе нити будут распределены по различным процессорам (однако это, как правило, находится в ведении операционной системы). Во время исполнения любой поток может приостоновить выполнение своей неявной задачи в точке планирования задач (task scheduling point) и переключиться на выполнение любой явно-сгенерированной задачи прежде чем возобновить выполнение неявной задачи. Очень часто параллельная область не содержит ничего, кроме конструкции разделения работы (т.е. конструкция разделения работы тесно вложена в параллельную область). В этом случае можно указывать не две директивы, а указать одну комбинированную.

№34 слайд
pragma omp parallel
Содержание слайда: #pragma omp parallel Ограничения Программа не должна зависеть от какого-либо порядка определения опций параллельной директивы, или от каких-либо побочных эффектов определения опций; Только одна опция if может присутствовать в директиве; Только одна опция num_threads может присутствовать в директиве. Выражение в опции num_threads должно быть целочисленным; Бросок исключения выполненный внутри параллельной области должен вызывать обработку исключения в рамках одной параллельной области, и той же нити, которая бросила исключение.

№35 слайд
pragma omp parallel
Содержание слайда: #pragma omp parallel Распределение работы OpenMP определяет следующие конструкции распределения работ: директива for директива sections директива single директива workshare

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

№37 слайд
pragma omp for Бесконечный
Содержание слайда: #pragma omp for Бесконечный цикл — это дать сонному человеку треугольное одеяло. Автор неизвестен

№38 слайд
pragma omp for Ограничения
Содержание слайда: #pragma omp for Ограничения

№39 слайд
pragma omp for
Содержание слайда: #pragma omp for

№40 слайд
pragma omp for Клауза schedule
Содержание слайда: #pragma omp for Клауза schedule

№41 слайд
pragma omp for Клауза
Содержание слайда: #pragma omp for Клауза schedule (static, X)

№42 слайд
pragma omp for Клауза
Содержание слайда: #pragma omp for Клауза schedule (static, X)

№43 слайд
pragma omp for Клауза
Содержание слайда: #pragma omp for Клауза schedule (dynamic, X)

№44 слайд
pragma omp for Клауза
Содержание слайда: #pragma omp for Клауза schedule (dynamic, X)

№45 слайд
pragma omp for Клауза
Содержание слайда: #pragma omp for Клауза schedule (guided, X)

№46 слайд
pragma omp for Клауза
Содержание слайда: #pragma omp for Клауза schedule (guided, X)

№47 слайд
pragma omp for Клауза
Содержание слайда: #pragma omp for Клауза schedule (guided, X)

№48 слайд
pragma omp for Клауза
Содержание слайда: #pragma omp for Клауза schedule (guided, X)

№49 слайд
Пример Директива omp for
Содержание слайда: Пример: Директива 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; }

№50 слайд
Пример Директива omp for
Содержание слайда: Пример: Директива 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; }

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

№55 слайд
Пример Директива omp for
Содержание слайда: Пример: Директива 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; }

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

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

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

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

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

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

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

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

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

№65 слайд
Синхронизация потоков
Содержание слайда: Синхронизация потоков Блокировки 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 слайд
Пример Использование
Содержание слайда: Пример: Использование блокировок #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
Содержание слайда: Функции 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) Функции работы с блокировками

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

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

№70 слайд
Пример программы сложение
Содержание слайда: Пример программы: сложение двух векторов Параллельная программа #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 слайд
Пример программы решение
Содержание слайда: Пример программы: решение краевой задачи Метод Зейделя 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 слайд
Пример программы решение
Содержание слайда: Пример программы: решение краевой задачи 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 слайд
Пример программы решение
Содержание слайда: Пример программы: решение краевой задачи 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 слайд
Пример программы решение
Содержание слайда: Пример программы: решение краевой задачи 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 слайд
Пример программы решение
Содержание слайда: Пример программы: решение краевой задачи 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 слайд
Пример программы решение
Содержание слайда: Пример программы: решение краевой задачи 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 слайд
Пример программы решение
Содержание слайда: Пример программы: решение краевой задачи 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 );

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

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

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

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

Скачать все slide презентации Параллельное и многопоточное программирование. (Лекция 7) одним архивом: