🗊 Презентация Директивы OpenMP - parallel

Категория: Образование
Нажмите для полного просмотра!
Директивы OpenMP - parallel, слайд №1 Директивы OpenMP - parallel, слайд №2 Директивы OpenMP - parallel, слайд №3 Директивы OpenMP - parallel, слайд №4 Директивы OpenMP - parallel, слайд №5 Директивы OpenMP - parallel, слайд №6 Директивы OpenMP - parallel, слайд №7 Директивы OpenMP - parallel, слайд №8 Директивы OpenMP - parallel, слайд №9 Директивы OpenMP - parallel, слайд №10 Директивы OpenMP - parallel, слайд №11 Директивы OpenMP - parallel, слайд №12 Директивы OpenMP - parallel, слайд №13 Директивы OpenMP - parallel, слайд №14 Директивы OpenMP - parallel, слайд №15 Директивы OpenMP - parallel, слайд №16 Директивы OpenMP - parallel, слайд №17 Директивы OpenMP - parallel, слайд №18 Директивы OpenMP - parallel, слайд №19 Директивы OpenMP - parallel, слайд №20 Директивы OpenMP - parallel, слайд №21 Директивы OpenMP - parallel, слайд №22 Директивы OpenMP - parallel, слайд №23 Директивы OpenMP - parallel, слайд №24 Директивы OpenMP - parallel, слайд №25 Директивы OpenMP - parallel, слайд №26 Директивы OpenMP - parallel, слайд №27 Директивы OpenMP - parallel, слайд №28 Директивы OpenMP - parallel, слайд №29 Директивы OpenMP - parallel, слайд №30 Директивы OpenMP - parallel, слайд №31 Директивы OpenMP - parallel, слайд №32 Директивы OpenMP - parallel, слайд №33 Директивы OpenMP - parallel, слайд №34 Директивы OpenMP - parallel, слайд №35 Директивы OpenMP - parallel, слайд №36 Директивы OpenMP - parallel, слайд №37 Директивы OpenMP - parallel, слайд №38 Директивы OpenMP - parallel, слайд №39 Директивы OpenMP - parallel, слайд №40 Директивы OpenMP - parallel, слайд №41 Директивы OpenMP - parallel, слайд №42 Директивы OpenMP - parallel, слайд №43 Директивы OpenMP - parallel, слайд №44 Директивы OpenMP - parallel, слайд №45 Директивы OpenMP - parallel, слайд №46

Содержание

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

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


Слайд 1


Директивы OpenMP - parallel Основная директива для создания параллельной области int main () { //последовательная область, выполняется корневой тред...
Описание слайда:
Директивы OpenMP - parallel Основная директива для создания параллельной области int main () { //последовательная область, выполняется корневой тред . . . //Начало параллельной области #pragma omp parallel [опции] { //операторы выполняются всеми тредами . . . //все треды завершают работу, остается только корневой тред } //последовательная область, выполняется корневой тред . . . }

Слайд 2


Синтаксис директивы parallel #pragma omp parallel [опции ...] newline { } if (scalar_expression) num_threads (integer_expression) private (list)...
Описание слайда:
Синтаксис директивы parallel #pragma omp parallel [опции ...] newline { } if (scalar_expression) num_threads (integer_expression) private (list) firstprivate (list) shared (list) default (shared | none) reduction (operator: list) copyin (list)

Слайд 3


Опция if if (scalar_expression) – распараллеливание по условию. Если значение выражения ≠ 0, то осуществляется распараллеливание. Иначе операторы...
Описание слайда:
Опция if if (scalar_expression) – распараллеливание по условию. Если значение выражения ≠ 0, то осуществляется распараллеливание. Иначе операторы параллельной области выполняются единственным корневым тредом.

Слайд 4


Пример #include #include using namespace std; int main() { int n; cout 1 ) { int k = omp_get_thread_num(); cout
Описание слайда:
Пример #include #include using namespace std; int main() { int n; cout 1 ) { int k = omp_get_thread_num(); cout

Слайд 5


Опция num_threads num_threads (integer_expression) – явное задание количества тредов, которые будут выполнять операторы параллельной области. По...
Описание слайда:
Опция num_threads num_threads (integer_expression) – явное задание количества тредов, которые будут выполнять операторы параллельной области. По умолчанию выбирается последнее значение, установленное функцией omp_set_num_threads(), или (если не вызывалась функция) значение переменной OMP_NUM_THREADS

Слайд 6


Пример #include #include using namespace std; int main() { int n; cout 1 ) num_threads(n) { int k = omp_get_thread_num(); cout
Описание слайда:
Пример #include #include using namespace std; int main() { int n; cout 1 ) num_threads(n) { int k = omp_get_thread_num(); cout

Слайд 7


Чем определяется количество тредов? Количество тредов в параллельной области определяется следующими параметрами в порядке старшинства: Значением...
Описание слайда:
Чем определяется количество тредов? Количество тредов в параллельной области определяется следующими параметрами в порядке старшинства: Значением опции if Значением опции num_threads Функцией omp_set_num_threads() Значением переменной окружения OMP_NUM_THREADS По умолчанию – обычно это число CPU в узле.

Слайд 8


Опции доступности данных Данные – Разделяемые, или общие (для всех тредов) Локальные (копии в каждом треде). Преимущество OpenMP – динамическое...
Описание слайда:
Опции доступности данных Данные – Разделяемые, или общие (для всех тредов) Локальные (копии в каждом треде). Преимущество OpenMP – динамическое определение количества копий – В одной параллельной области переменная х – локальная В другой – разделяемая.

Слайд 9


Опция private private (list) - задаёт список переменных, для которых создается локальная копия в каждом треде. Переменные должны быть объявлены до...
Описание слайда:
Опция private private (list) - задаёт список переменных, для которых создается локальная копия в каждом треде. Переменные должны быть объявлены до вхождения в параллельную область. Начальное значение локальных копий переменных из списка не определено  задается в параллельной области.

Слайд 10


Пример float s = 0; #pragma omp parallel private(s) { s = s + 1;//некорректно } Значение копий переменной в параллельной области не определено
Описание слайда:
Пример float s = 0; #pragma omp parallel private(s) { s = s + 1;//некорректно } Значение копий переменной в параллельной области не определено

Слайд 11


Опция firstprivate firstprivate (list) - задаёт список переменных, для которых создается локальная копия в каждом треде. Переменные должны быть...
Описание слайда:
Опция firstprivate firstprivate (list) - задаёт список переменных, для которых создается локальная копия в каждом треде. Переменные должны быть объявлены до вхождения в параллельную область. Начальное значение локальных копий переменных из списка определяется их значением в корневом треде.

Слайд 12


Пример float s = 0; #pragma omp parallel firstprivate(s) { s = s + 1;//корректно } Значение копий переменной в параллельной области определяется...
Описание слайда:
Пример float s = 0; #pragma omp parallel firstprivate(s) { s = s + 1;//корректно } Значение копий переменной в параллельной области определяется последним значением в последовательной области

Слайд 13


Опция shared shared (list) - задаёт список переменных, которые являются общими для всех тредов. Переменные должны быть объявлены до вхождения в...
Описание слайда:
Опция shared shared (list) - задаёт список переменных, которые являются общими для всех тредов. Переменные должны быть объявлены до вхождения в параллельную область. Все треды могут не только считывать, но и изменять их значения  корректность использования обеспечивает программист.

Слайд 14


Опция default default (shared|none) default (shared) всем переменным в параллельной области, которым явно не назначена локализация, будет назначена...
Описание слайда:
Опция default default (shared|none) default (shared) всем переменным в параллельной области, которым явно не назначена локализация, будет назначена shared (эта опция используется по умолчанию) default (none) всем переменным в параллельной области локализация должна быть назначена явно.

Слайд 15


Опция reduction reduction (operator: list) operator: +, *, -, &, |, ^, &&, || задаёт оператор и список переменных (ранее объявленных); для каждой...
Описание слайда:
Опция reduction reduction (operator: list) operator: +, *, -, &, |, ^, &&, || задаёт оператор и список переменных (ранее объявленных); для каждой переменной создаются локальные копии в каждом треде; локальные копии инициализируются : для + - | ^ || – 0 или аналоги, для * & && – 1 или аналоги; над локальными копиями переменных после выполнения всех операторов параллельной области выполняется заданный оператор

Слайд 16


Пример ... int n = 0; #pragma omp parallel reduction (+: n) { n++; cout
Описание слайда:
Пример ... int n = 0; #pragma omp parallel reduction (+: n) { n++; cout

Слайд 17


Директивы OpenMP – parallel for Основная директива для распараллеливания вычислений (распределения итераций цикла между тредами) . . . //Начало...
Описание слайда:
Директивы OpenMP – parallel for Основная директива для распараллеливания вычислений (распределения итераций цикла между тредами) . . . //Начало параллельной области #pragma omp parallel for [опции] { //должен быть цикл . . . }

Слайд 18


Ограничения на параллельные циклы Результат программы не зависит от того, какой именно тред выполнит конкретную итерацию цикла. Нельзя использовать...
Описание слайда:
Ограничения на параллельные циклы Результат программы не зависит от того, какой именно тред выполнит конкретную итерацию цикла. Нельзя использовать побочный выход (break, goto) из параллельного цикла. Размер блока итераций, указанный в опции schedule, не должен изменяться в рамках цикла. Формат параллельных циклов: for([int_type] i = инвариант цикла; i {,=,=} инвариант цикла; i {+,-}= инвариант цикла)

Слайд 19


Синтаксис директивы parallel for #pragma omp parallel for[опции ...] newline { ...for ... } schedule (type [,chunk]) ordered private (list)...
Описание слайда:
Синтаксис директивы parallel for #pragma omp parallel for[опции ...] newline { ...for ... } schedule (type [,chunk]) ordered private (list) firstprivate (list) lastprivate (list) shared (list) reduction (operator: list) collapse (n) nowait

Слайд 20


Синтаксис директивы for #pragma omp for[опции ...] newline { ...for ... } Используется внутри параллельной области, заданной директивой parallel, для...
Описание слайда:
Синтаксис директивы for #pragma omp for[опции ...] newline { ...for ... } Используется внутри параллельной области, заданной директивой parallel, для указания на распараллеливание конкретного цикла. Блок не является обязательным для единственного оператора: #pragma omp for[опции ...] newline for ...

Слайд 21


Пример: вычисление суммы void main () { int i; double ZZ, res=0.0; omp_set_num_threads(2) #pragma omp parallel for reduction(+:res) private(ZZ) for...
Описание слайда:
Пример: вычисление суммы void main () { int i; double ZZ, res=0.0; omp_set_num_threads(2) #pragma omp parallel for reduction(+:res) private(ZZ) for (i=0; i< 1000; i++) { ZZ = func(i); res = res + ZZ; } }

Слайд 22


Оценка времени выполнения последовательной и параллельной программ Функция double omp_get_wtime() возвращает в вызвавшем треде время в секундах,...
Описание слайда:
Оценка времени выполнения последовательной и параллельной программ Функция double omp_get_wtime() возвращает в вызвавшем треде время в секундах, прошедшее с некоторого момента в прошлом. Если фрагмент кода окружить вызовами функции, то разность возвращаемых значений равна времени выполнения команд данного фрагмента. Функция double omp_get_wtick() возвращает в вызвавшем треде разрешение таймера в секундах. Это время можно рассматривать как меру точности таймера

Слайд 23


Пример замера времени ... double start_time, end_time, tick; start_time = omp_get_wtime(); ... end_time = omp_get_wtime(); tick = omp_get_wtick();...
Описание слайда:
Пример замера времени ... double start_time, end_time, tick; start_time = omp_get_wtime(); ... end_time = omp_get_wtime(); tick = omp_get_wtick(); cout

Слайд 24


Пример: вычисление числа π
Описание слайда:
Пример: вычисление числа π

Слайд 25


Пример: вычисление числа π void main () { long num_steps; cout > num_steps; double step = 1./ num_steps; double x, pi, sum = 0.0; #pragma omp...
Описание слайда:
Пример: вычисление числа π void main () { long num_steps; cout > num_steps; double step = 1./ num_steps; double x, pi, sum = 0.0; #pragma omp parallel for private(x) reduction(+:sum) for (int i = 0; i

Слайд 26


Опции директивы parallel for #pragma omp parallel for[опции ...] newline { ...for ... } schedule (type [,chunk]) ordered private (list) firstprivate...
Описание слайда:
Опции директивы parallel for #pragma omp parallel for[опции ...] newline { ...for ... } schedule (type [,chunk]) ordered private (list) firstprivate (list) lastprivate (list) shared (list) reduction (operator: list) collapse (n) nowait

Слайд 27


Опция lastprivate lastprivate (list) переменным из списка присваивается результат с последней итерации цикла - значение из команд того треда, который...
Описание слайда:
Опция lastprivate lastprivate (list) переменным из списка присваивается результат с последней итерации цикла - значение из команд того треда, который бы последним исполнялся последовательно Пример int i,k; #pragma omp parallel for private(i) lastprivate(k) for(i=0; i

Слайд 28


Опция schedule – управление нагрузкой schedule (type [,num_iters]) В зависимости от параметров (type, num_iters) выполнение итераций цикла...
Описание слайда:
Опция schedule – управление нагрузкой schedule (type [,num_iters]) В зависимости от параметров (type, num_iters) выполнение итераций цикла распределяется между тредами. По умолчанию num_iters=1 Если опция schedule не указана, то по умолчанию распределение зависит от реализации (CPU, OC). Возможные значения type dynamic guided runtime num_iters не задается static

Слайд 29


static – статическое распределение загрузки тредов: - каждый тред (с нулевого) берет для выполнения блок из итераций цикла , -oставшиеся итерации...
Описание слайда:
static – статическое распределение загрузки тредов: - каждый тред (с нулевого) берет для выполнения блок из итераций цикла , -oставшиеся итерации снова последовательно распределяются по тредам, пока не будут выполнены все итерации. Если не указано, то итерации равномерно распределяются между тредами. … #pragma omp for schedule(static,2) for (i=0; i

Слайд 30


dynamic – динамическое распределение загрузки тредов: каждый тред берет для выполнения блок из итераций цикла. Освободившиеся треды снова берут по...
Описание слайда:
dynamic – динамическое распределение загрузки тредов: каждый тред берет для выполнения блок из итераций цикла. Освободившиеся треды снова берут по случайных итераций, пока не будут выполнены все итерации … #pragma omp for schedule(dynamic) for (i=0; i

Слайд 31


guided – динамическое распределение загрузки тредов: - каждый тред берет для выполнения N0 (зависит от реализации) итераций, которое (отличие от...
Описание слайда:
guided – динамическое распределение загрузки тредов: - каждый тред берет для выполнения N0 (зависит от реализации) итераций, которое (отличие от dynamic) на следующих шагах уменьшается до N0 пропорционально: / Ni пропорционально / …

Слайд 32


runtime – динамическое распределение загрузки тредов Cпособ распределения итераций выбирается во время работы программы по значению переменной среды...
Описание слайда:
runtime – динамическое распределение загрузки тредов Cпособ распределения итераций выбирается во время работы программы по значению переменной среды OMP_SCHEDULE.

Слайд 33


Пример 1 #include #include #include int main(int argc, char *argv[]) {int i; #pragma omp parallel private(i) {//#pragma omp for schedule (static)...
Описание слайда:
Пример 1 #include #include #include int main(int argc, char *argv[]) {int i; #pragma omp parallel private(i) {//#pragma omp for schedule (static) //#pragma omp for schedule (static, 1) //#pragma omp for schedule (static, 2) //#pragma omp for schedule (dynamic) //#pragma omp for schedule (dynamic, 2) //#pragma omp for schedule (guided) #pragma omp for schedule (guided, 2) for (i=0; i

Слайд 34


Результат
Описание слайда:
Результат

Слайд 35


Задание Варьируя число итераций, тредов и размер начального блока, проанализировать распределение итераций по тредам. Изменяется ли распределение...
Описание слайда:
Задание Варьируя число итераций, тредов и размер начального блока, проанализировать распределение итераций по тредам. Изменяется ли распределение итераций по тредам при нескольких запусках одной и той же программы? Примечание. void Sleep(int k) – задержка в миллисекундах (здесь для имитации вычислений). !Если задать значение параметра (0), то работа потока может быть приостановлена для того, чтобы позволить другим ожидающим потокам выполняться (в примере 2).

Слайд 36


Пример 2 msdn.microsoft.com/ru-ru/library/x5aw0hdf(v=vs.90).aspx
Описание слайда:
Пример 2 msdn.microsoft.com/ru-ru/library/x5aw0hdf(v=vs.90).aspx

Слайд 37


Задание Протестировать программу, изменяя значения основных параметров. Отобразить результат графически. Для каких режимов существенно количество...
Описание слайда:
Задание Протестировать программу, изменяя значения основных параметров. Отобразить результат графически. Для каких режимов существенно количество тредов? Как изменится работа программы, если установить явно время задержки? Добавить свои комментарии в текст программы.

Слайд 38


Пример иллюстрации
Описание слайда:
Пример иллюстрации

Слайд 39


Опция collapse collapse(n) — n последовательных тесновложенных циклов ассоциируется с данной директивой. Для циклов образуется общее пространство...
Описание слайда:
Опция collapse collapse(n) — n последовательных тесновложенных циклов ассоциируется с данной директивой. Для циклов образуется общее пространство итераций, которое делится между тредами. Если опция не задана, то директива относится только к одному - непосредственно следующему за ней циклу.

Слайд 40


Опция ordered Опция для указания о том, что в цикле могут встречаться директивы ordered. В этом случае определяется блок внутри тела цикла, который...
Описание слайда:
Опция ordered Опция для указания о том, что в цикле могут встречаться директивы ordered. В этом случае определяется блок внутри тела цикла, который должен выполняться в порядке, установленном в последовательном цикле

Слайд 41


Опция nowait По умолчанию в конце параллельного цикла происходит неявная барьерная синхронизация параллельно работающих тредов – дальнейшее...
Описание слайда:
Опция nowait По умолчанию в конце параллельного цикла происходит неявная барьерная синхронизация параллельно работающих тредов – дальнейшее выполнение происходит только тогда, когда все треды достигнут данной точки (барьера). Если подобная задержка не нужна, используют опцию nowait. Это позволяет тредам, уже дошедшим до конца цикла, продолжить выполнение без синхронизации с остальными тредами.

Слайд 42


Пример #include #define CHUNKSIZE 100 #define N 1000 main () { int i, chunk; float a[N], b[N], c[N]; // Some initializations for (i=0; i < N; i++)...
Описание слайда:
Пример #include #define CHUNKSIZE 100 #define N 1000 main () { int i, chunk; float a[N], b[N], c[N]; // Some initializations for (i=0; i < N; i++) a[i] = b[i] = i * 1.0; chunk = CHUNKSIZE; #pragma omp parallel shared(a,b,c,chunk) private(i) { #pragma omp for schedule(dynamic,chunk) nowait for (i=0; i < N; i++) c[i] = a[i] + b[i]; } // end of parallel section }

Слайд 43


Заключение по распараллеливанию циклов При распараллеливании цикла надо убедиться в том, что итерации данного цикла не имеют информационных...
Описание слайда:
Заключение по распараллеливанию циклов При распараллеливании цикла надо убедиться в том, что итерации данного цикла не имеют информационных зависимостей. Если цикл не содержит зависимостей, его итерации можно выполнять в любом порядке, в том числе параллельно. Соблюдение этого требования компилятор не проверяет, вся ответственность - на программисте. Если дать указание компилятору распараллелить цикл, содержащий зависимости, результат работы программы может оказаться некорректным. Задание – подобрать пример такого цикла, проверить выполнение параллельной программы.

Слайд 44


Директива sections Используется для реализации функционального параллелизма. Эта директива определяет набор независимых секций кода, каждая из...
Описание слайда:
Директива sections Используется для реализации функционального параллелизма. Эта директива определяет набор независимых секций кода, каждая из которых выполняется своим тредом.

Слайд 45


Синтаксис директивы sections #pragma omp sections [опции ...] newline private (list) firstprivate (list) lastprivate (list) reduction (operator:...
Описание слайда:
Синтаксис директивы sections #pragma omp sections [опции ...] newline private (list) firstprivate (list) lastprivate (list) reduction (operator: list) nowait { #pragma omp section newline structured_block //отдельный тред #pragma omp section newline structured_block //отдельный тред … }

Слайд 46


Пример int main() { int n; #pragma omp parallel private(n) { n=omp_get_thread_num(); #pragma omp sections { #pragma omp section {...
Описание слайда:
Пример int main() { int n; #pragma omp parallel private(n) { n=omp_get_thread_num(); #pragma omp sections { #pragma omp section { printf("section1, thread %d\n", n); } #pragma omp section { printf("section2, thread %d\n", n); } #pragma omp section { printf("section3, thread %d\n", n); } } printf("parallel region, thread %d\n", n); } }



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