🗊Презентация Параллельное и многопоточное программирование. (Лекция 7)

Нажмите для полного просмотра!
Параллельное и многопоточное программирование. (Лекция 7), слайд №1Параллельное и многопоточное программирование. (Лекция 7), слайд №2Параллельное и многопоточное программирование. (Лекция 7), слайд №3Параллельное и многопоточное программирование. (Лекция 7), слайд №4Параллельное и многопоточное программирование. (Лекция 7), слайд №5Параллельное и многопоточное программирование. (Лекция 7), слайд №6Параллельное и многопоточное программирование. (Лекция 7), слайд №7Параллельное и многопоточное программирование. (Лекция 7), слайд №8Параллельное и многопоточное программирование. (Лекция 7), слайд №9Параллельное и многопоточное программирование. (Лекция 7), слайд №10Параллельное и многопоточное программирование. (Лекция 7), слайд №11Параллельное и многопоточное программирование. (Лекция 7), слайд №12Параллельное и многопоточное программирование. (Лекция 7), слайд №13Параллельное и многопоточное программирование. (Лекция 7), слайд №14Параллельное и многопоточное программирование. (Лекция 7), слайд №15Параллельное и многопоточное программирование. (Лекция 7), слайд №16Параллельное и многопоточное программирование. (Лекция 7), слайд №17Параллельное и многопоточное программирование. (Лекция 7), слайд №18Параллельное и многопоточное программирование. (Лекция 7), слайд №19Параллельное и многопоточное программирование. (Лекция 7), слайд №20Параллельное и многопоточное программирование. (Лекция 7), слайд №21Параллельное и многопоточное программирование. (Лекция 7), слайд №22Параллельное и многопоточное программирование. (Лекция 7), слайд №23Параллельное и многопоточное программирование. (Лекция 7), слайд №24Параллельное и многопоточное программирование. (Лекция 7), слайд №25Параллельное и многопоточное программирование. (Лекция 7), слайд №26Параллельное и многопоточное программирование. (Лекция 7), слайд №27Параллельное и многопоточное программирование. (Лекция 7), слайд №28Параллельное и многопоточное программирование. (Лекция 7), слайд №29Параллельное и многопоточное программирование. (Лекция 7), слайд №30Параллельное и многопоточное программирование. (Лекция 7), слайд №31Параллельное и многопоточное программирование. (Лекция 7), слайд №32Параллельное и многопоточное программирование. (Лекция 7), слайд №33Параллельное и многопоточное программирование. (Лекция 7), слайд №34Параллельное и многопоточное программирование. (Лекция 7), слайд №35Параллельное и многопоточное программирование. (Лекция 7), слайд №36Параллельное и многопоточное программирование. (Лекция 7), слайд №37Параллельное и многопоточное программирование. (Лекция 7), слайд №38Параллельное и многопоточное программирование. (Лекция 7), слайд №39Параллельное и многопоточное программирование. (Лекция 7), слайд №40Параллельное и многопоточное программирование. (Лекция 7), слайд №41Параллельное и многопоточное программирование. (Лекция 7), слайд №42Параллельное и многопоточное программирование. (Лекция 7), слайд №43Параллельное и многопоточное программирование. (Лекция 7), слайд №44Параллельное и многопоточное программирование. (Лекция 7), слайд №45Параллельное и многопоточное программирование. (Лекция 7), слайд №46Параллельное и многопоточное программирование. (Лекция 7), слайд №47Параллельное и многопоточное программирование. (Лекция 7), слайд №48Параллельное и многопоточное программирование. (Лекция 7), слайд №49Параллельное и многопоточное программирование. (Лекция 7), слайд №50Параллельное и многопоточное программирование. (Лекция 7), слайд №51Параллельное и многопоточное программирование. (Лекция 7), слайд №52Параллельное и многопоточное программирование. (Лекция 7), слайд №53Параллельное и многопоточное программирование. (Лекция 7), слайд №54Параллельное и многопоточное программирование. (Лекция 7), слайд №55Параллельное и многопоточное программирование. (Лекция 7), слайд №56Параллельное и многопоточное программирование. (Лекция 7), слайд №57Параллельное и многопоточное программирование. (Лекция 7), слайд №58Параллельное и многопоточное программирование. (Лекция 7), слайд №59Параллельное и многопоточное программирование. (Лекция 7), слайд №60Параллельное и многопоточное программирование. (Лекция 7), слайд №61Параллельное и многопоточное программирование. (Лекция 7), слайд №62Параллельное и многопоточное программирование. (Лекция 7), слайд №63Параллельное и многопоточное программирование. (Лекция 7), слайд №64Параллельное и многопоточное программирование. (Лекция 7), слайд №65Параллельное и многопоточное программирование. (Лекция 7), слайд №66Параллельное и многопоточное программирование. (Лекция 7), слайд №67Параллельное и многопоточное программирование. (Лекция 7), слайд №68Параллельное и многопоточное программирование. (Лекция 7), слайд №69Параллельное и многопоточное программирование. (Лекция 7), слайд №70Параллельное и многопоточное программирование. (Лекция 7), слайд №71Параллельное и многопоточное программирование. (Лекция 7), слайд №72Параллельное и многопоточное программирование. (Лекция 7), слайд №73Параллельное и многопоточное программирование. (Лекция 7), слайд №74Параллельное и многопоточное программирование. (Лекция 7), слайд №75Параллельное и многопоточное программирование. (Лекция 7), слайд №76Параллельное и многопоточное программирование. (Лекция 7), слайд №77Параллельное и многопоточное программирование. (Лекция 7), слайд №78Параллельное и многопоточное программирование. (Лекция 7), слайд №79Параллельное и многопоточное программирование. (Лекция 7), слайд №80Параллельное и многопоточное программирование. (Лекция 7), слайд №81

Содержание

Вы можете ознакомиться и скачать презентацию на тему Параллельное и многопоточное программирование. (Лекция 7). Доклад-сообщение содержит 81 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

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


Слайд 1





Параллельное и многопоточное программирование

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

Слайд 2





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

Слайд 3





Модель памяти OpenMP
Описание слайда:
Модель памяти OpenMP

Слайд 4





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

Слайд 5





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

Слайд 6





Подключение в Visual Studio
Описание слайда:
Подключение в Visual Studio

Слайд 7





Формат записи директив и клауз OpenMP

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

Слайд 8





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

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

Слайд 9





Некоторые функции OpenMP
Описание слайда:
Некоторые функции OpenMP

Слайд 10





Пример:
			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;
}
Описание слайда:
Пример: 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)
		{ . . .
		}
Описание слайда:
Задание числа потоков Переменная среды 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
Описание слайда:
Области видимости переменных Переменные, объявленные вне параллельного блока, определяются параметрами директив OpenMP: private firstprivate lastprivate shared default reduction threadprivate copyin

Слайд 13





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

Слайд 14





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

Слайд 15





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

Слайд 16





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

Слайд 17





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

Слайд 18





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

Слайд 19





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

Слайд 20





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

Слайд 21





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

Слайд 22





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

Слайд 23





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

Слайд 24





#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);
}
Описание слайда:
#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
Клауза одна из следующих:
if (скалярное выражение)
num_threads (целое число)
private (список)
shared (список)
default (shared | none)
firstprivate (список)
reduction (оператор : список)
copyin (список)
proc_bind (master | close | spread)
Описание слайда:
#pragma omp parallel Клауза одна из следующих: if (скалярное выражение) num_threads (целое число) private (список) shared (список) default (shared | none) firstprivate (список) reduction (оператор : список) copyin (список) proc_bind (master | close | spread)

Слайд 27





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

Слайд 28





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

Слайд 29





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

Слайд 30





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

Слайд 32





omp_set_dynamic
Omp_set_dynamic функция позволяет включить или отключить динамическую корректировку числа потоков, доступных для выполнения параллельных областей. Формат следующий:
Описание слайда:
omp_set_dynamic Omp_set_dynamic функция позволяет включить или отключить динамическую корректировку числа потоков, доступных для выполнения параллельных областей. Формат следующий:

Слайд 33





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

Слайд 34





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

Слайд 35





#pragma omp parallel
Распределение работы
OpenMP определяет следующие конструкции распределения работ:
директива for
директива sections
директива single
директива workshare
Описание слайда:
#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
Клауза schedule (static, X)
Описание слайда:
#pragma omp for Клауза schedule (static, X)

Слайд 42





#pragma omp for
Клауза schedule (static, X)
Описание слайда:
#pragma omp for Клауза schedule (static, X)

Слайд 43





#pragma omp for
Клауза schedule (dynamic, X)
Описание слайда:
#pragma omp for Клауза schedule (dynamic, X)

Слайд 44





#pragma omp for
Клауза schedule (dynamic, X)
Описание слайда:
#pragma omp for Клауза schedule (dynamic, X)

Слайд 45





#pragma omp for
Клауза schedule (guided, X)
Описание слайда:
#pragma omp for Клауза schedule (guided, X)

Слайд 46





#pragma omp for
Клауза schedule (guided, X)
Описание слайда:
#pragma omp for Клауза schedule (guided, X)

Слайд 47





#pragma omp for
Клауза schedule (guided, X)
Описание слайда:
#pragma omp for Клауза schedule (guided, X)

Слайд 48





#pragma omp for
Клауза schedule (guided, X)
Описание слайда:
#pragma omp for Клауза schedule (guided, X)

Слайд 49





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

Слайд 55





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

Слайд 57





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

Слайд 58





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

Слайд 59





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

Слайд 60





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

Слайд 61





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

Слайд 62





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

Слайд 63





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

Слайд 64





Синхронизация потоков
Директивы синхронизации потоков:
master
critical
barrier
atomic
flush
ordered
Описание слайда:
Синхронизация потоков Директивы синхронизации потоков: 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)
Описание слайда:
Синхронизация потоков Блокировки 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;
}
Описание слайда:
Пример: Использование блокировок #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_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) 
Функции работы с блокировками
Описание слайда:
Функции 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
Задать переменные окружения
Запустить программу
Описание слайда:
Порядок создания параллельных программ Написать и отладить последовательную программу Дополнить программу директивами 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;
}
Описание слайда:
Пример программы: сложение двух векторов Последовательная программа #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;
}
Описание слайда:
Пример программы: сложение двух векторов Параллельная программа #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 );
Описание слайда:
Пример программы: решение краевой задачи Метод Зейделя 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 );
Описание слайда:
Пример программы: решение краевой задачи 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 );
Описание слайда:
Пример программы: решение краевой задачи 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 );
Описание слайда:
Пример программы: решение краевой задачи 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 );
Описание слайда:
Пример программы: решение краевой задачи 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 );
Описание слайда:
Пример программы: решение краевой задачи 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 );
Описание слайда:
Пример программы: решение краевой задачи 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;
    } // конец параллельной области
  }
Описание слайда:
Пример программы: решение краевой задачи 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/
Описание слайда:
Рекомендуемая литература по OpenMP http://openmp.org http://www.parallel.ru/tech/tech_dev/openmp.html https://computing.llnl.gov/tutorials/openMP/



Похожие презентации
Mypresentation.ru
Загрузить презентацию