🗊Презентация Среда программирования OpenMP. Синхронизация. (Лекция 2)

Нажмите для полного просмотра!
Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №1Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №2Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №3Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №4Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №5Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №6Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №7Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №8Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №9Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №10Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №11Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №12Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №13Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №14Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №15Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №16Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №17Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №18Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №19Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №20Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №21Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №22Среда программирования OpenMP. Синхронизация. (Лекция 2), слайд №23

Содержание

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

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


Слайд 1





ЛЕКЦИЯ 2
Среда программирования OpenMP.
Синхронизация
Описание слайда:
ЛЕКЦИЯ 2 Среда программирования OpenMP. Синхронизация

Слайд 2





1. Синхронизация в среде OpenMP
Описание слайда:
1. Синхронизация в среде OpenMP

Слайд 3





2. Пример использования директивы atomic
#include <stdio.h>
#include <omp.h>
int main(int argc, char *argv[])
{
int count = 0;
#pragma omp parallel
{
#pragma omp atomic
count++;
}
printf("Число потоков: %d\n", count);
}
Описание слайда:
2. Пример использования директивы atomic #include <stdio.h> #include <omp.h> int main(int argc, char *argv[]) { int count = 0; #pragma omp parallel { #pragma omp atomic count++; } printf("Число потоков: %d\n", count); }

Слайд 4





3. Критические секции
Описание слайда:
3. Критические секции

Слайд 5





4. Пример использования директивы  critical 
#include <stdio.h>
#include <omp.h>
int main(int argc, char *argv[])
{
int n;
#pragma omp parallel
       {
#pragma omp critical
                {
n=omp_get_thread_num();
printf("Нить %d\n", n);
                  }
          }
}
Описание слайда:
4. Пример использования директивы critical #include <stdio.h> #include <omp.h> int main(int argc, char *argv[]) { int n; #pragma omp parallel { #pragma omp critical { n=omp_get_thread_num(); printf("Нить %d\n", n); } } }

Слайд 6





5. Распределение вычислений между потоками
Описание слайда:
5. Распределение вычислений между потоками

Слайд 7





6. Директива  master
Описание слайда:
6. Директива master

Слайд 8





7. Пример использования директивы  master
#include <stdio.h>
int main(int argc, char *argv[])
{ int n;
#pragma omp parallel private(n)
             { n=1;
                #pragma omp master
                             { n=2;
                                       }
               printf("Первое значение n: %d\n", n);
               #pragma omp barrier
               #pragma omp master
                                  {n=3;
                                     }
                printf("Второе значение n: %d\n", n);
                 }
}
Описание слайда:
7. Пример использования директивы master #include <stdio.h> int main(int argc, char *argv[]) { int n; #pragma omp parallel private(n) { n=1; #pragma omp master { n=2; } printf("Первое значение n: %d\n", n); #pragma omp barrier #pragma omp master {n=3; } printf("Второе значение n: %d\n", n); } }

Слайд 9





8. Директива  single
Если в параллельной области какой-либо участок кода должен быть выполнен лишь один раз, то его нужно выделить директивами  single:#pragma omp single [опция [[,] опция]...]. ОПЦИИ:   private(список), firstprivate(список);   copyprivate(список) – после выполнения нити, содержащей конструкцию  single , новые значения переменных списка будут доступны всем одноименным частным переменным ( private и  firstprivate ), описанным в начале параллельной области и  спользуемым всеми её потоками (опция не может использоваться совместно с опцией  nowait, переменные списка не должны быть перечислены в опциях  private и firstprivate данной директивы  single); 
nowait – после выполнения выделенного участка происходит неявная барьерная синхронизация параллельных потоков ( их дальнейшее выполнение происходит только тогда, когда все они достигнут данной точки), если в подобной задержке нет необходимости, опция nowait позволяет потокам, дошедшим до конца участка, продолжить выполнение без синхронизации с остальными.
Описание слайда:
8. Директива single Если в параллельной области какой-либо участок кода должен быть выполнен лишь один раз, то его нужно выделить директивами single:#pragma omp single [опция [[,] опция]...]. ОПЦИИ: private(список), firstprivate(список); copyprivate(список) – после выполнения нити, содержащей конструкцию single , новые значения переменных списка будут доступны всем одноименным частным переменным ( private и firstprivate ), описанным в начале параллельной области и спользуемым всеми её потоками (опция не может использоваться совместно с опцией nowait, переменные списка не должны быть перечислены в опциях private и firstprivate данной директивы single); nowait – после выполнения выделенного участка происходит неявная барьерная синхронизация параллельных потоков ( их дальнейшее выполнение происходит только тогда, когда все они достигнут данной точки), если в подобной задержке нет необходимости, опция nowait позволяет потокам, дошедшим до конца участка, продолжить выполнение без синхронизации с остальными.

Слайд 10





9. Пример использования директивы single
#include <stdio.h>
int main(int argc, char *argv[])
{
#pragma omp parallel
                {
                printf("Сообщение 1\n");
                #pragma omp single nowait
                                       {
                                      printf("Одна нить\n");
                                            }
printf("Сообщение 2\n");
                  }
}
Описание слайда:
9. Пример использования директивы single #include <stdio.h> int main(int argc, char *argv[]) { #pragma omp parallel { printf("Сообщение 1\n"); #pragma omp single nowait { printf("Одна нить\n"); } printf("Сообщение 2\n"); } }

Слайд 11





10. Информационные зависимости
Описание слайда:
10. Информационные зависимости

Слайд 12





11. Примеры информационной зависимости
Описание слайда:
11. Примеры информационной зависимости

Слайд 13





12. Информационная зависимость итераций
Описание слайда:
12. Информационная зависимость итераций

Слайд 14





13. Пример информационной зависимости итераций
Описание слайда:
13. Пример информационной зависимости итераций

Слайд 15





14. Разбиение на независимые блоки. Директива  section
Описание слайда:
14. Разбиение на независимые блоки. Директива section

Слайд 16





15. Пример применения директивы  sections
#include <stdio.h>
#include <omp.h>
int main(int argc, char *argv[])
{ int n;
       #pragma omp parallel private(n)
       { n=omp_get_thread_num();
          #pragma omp sections
                          {#pragma omp section
                                    {printf("Первая секция, процесс %d\n", n);}
                            #pragma omp section
                                      {printf("Вторая секция, процесс %d\n", n);}
                             #pragma omp section
                                       {printf("Третья секция, процесс %d\n", n);}
                         }
            printf("Параллельная область, процесс %d\n", n);
        }
}
Описание слайда:
15. Пример применения директивы sections #include <stdio.h> #include <omp.h> int main(int argc, char *argv[]) { int n; #pragma omp parallel private(n) { n=omp_get_thread_num(); #pragma omp sections {#pragma omp section {printf("Первая секция, процесс %d\n", n);} #pragma omp section {printf("Вторая секция, процесс %d\n", n);} #pragma omp section {printf("Третья секция, процесс %d\n", n);} } printf("Параллельная область, процесс %d\n", n); } }

Слайд 17





16. Параллельные циклы
Описание слайда:
16. Параллельные циклы

Слайд 18





17. Требования к оператору цикла
for([целочисленный тип] i = инвариант цикла;
i {<,>,=,<=,>=} инвариант цикла;
i {+,-}= инвариант цикла)
Эти требования введены для того, чтобы OpenMP мог при входе в цикл точно
определить число итераций. Если директива параллельного выполнения стоит перед гнездом циклов, завершающихся одним оператором, то директива действует только на самый
внешний цикл. Итеративная переменная распределяемого цикла по смыслу должна быть локальной, поэтому в случае, если она специфицирована общей, то она неявно
делается локальной при входе в цикл. После завершения цикла значение итеративной переменной цикла не определено, если она не указана в опции lastprivate.
Описание слайда:
17. Требования к оператору цикла for([целочисленный тип] i = инвариант цикла; i {<,>,=,<=,>=} инвариант цикла; i {+,-}= инвариант цикла) Эти требования введены для того, чтобы OpenMP мог при входе в цикл точно определить число итераций. Если директива параллельного выполнения стоит перед гнездом циклов, завершающихся одним оператором, то директива действует только на самый внешний цикл. Итеративная переменная распределяемого цикла по смыслу должна быть локальной, поэтому в случае, если она специфицирована общей, то она неявно делается локальной при входе в цикл. После завершения цикла значение итеративной переменной цикла не определено, если она не указана в опции lastprivate.

Слайд 19





18. Возможные опции:
private(список) ,  firstprivate(список) ,  lastprivate(список) ; reduction(оператор:список) – задаёт оператор и список общих переменных; для каждой переменной создаются локальные копии в каждом потоке, локальные копии инициализируются соответственно типу оператора (для аддитивных операций –  0 или его аналоги, для мультипликативных операций –  1 или её аналоги), над локальными копиями переменных после завершения всех итераций цикла выполняется заданный оператор;  оператор это: для языка Си –  + ,  * ,  - ,  & ,  | ,  ^ ,  && ,  || ,  порядок выполнения операторов не определён, поэтому результат может отличаться от запуска к запуску;
schedule(type[, chunk]) – опция задаёт, каким образом итерации
цикла распределяются между потоками;
collapse(n) — опция указывает, что  n последовательных тесновложенных циклов ассоциируется с данной директивой, для циклов образуется общее пространство итераций, которое делится между потоками, если опция  collapse не задана, то директива относится только к одному непосредственно следующему за ней циклу;
nowait – в конце параллельного цикла происходит неявная барьерная синхронизация параллельно работающих нитей: их дальнейшее выполнение происходит только тогда, когда все они достигнут данной точки, опция  nowait позволяет потокам, уже дошедшим до конца цикла, продолжить выполнение без синхронизации с остальными.
Описание слайда:
18. Возможные опции: private(список) , firstprivate(список) , lastprivate(список) ; reduction(оператор:список) – задаёт оператор и список общих переменных; для каждой переменной создаются локальные копии в каждом потоке, локальные копии инициализируются соответственно типу оператора (для аддитивных операций – 0 или его аналоги, для мультипликативных операций – 1 или её аналоги), над локальными копиями переменных после завершения всех итераций цикла выполняется заданный оператор; оператор это: для языка Си – + , * , - , & , | , ^ , && , || , порядок выполнения операторов не определён, поэтому результат может отличаться от запуска к запуску; schedule(type[, chunk]) – опция задаёт, каким образом итерации цикла распределяются между потоками; collapse(n) — опция указывает, что n последовательных тесновложенных циклов ассоциируется с данной директивой, для циклов образуется общее пространство итераций, которое делится между потоками, если опция collapse не задана, то директива относится только к одному непосредственно следующему за ней циклу; nowait – в конце параллельного цикла происходит неявная барьерная синхронизация параллельно работающих нитей: их дальнейшее выполнение происходит только тогда, когда все они достигнут данной точки, опция nowait позволяет потокам, уже дошедшим до конца цикла, продолжить выполнение без синхронизации с остальными.

Слайд 20





19. Использование директивы for
Описание слайда:
19. Использование директивы for

Слайд 21





20. Устранение зависимости по данным
Описание слайда:
20. Устранение зависимости по данным

Слайд 22





21. Использование опции reduction
Описание слайда:
21. Использование опции reduction

Слайд 23





22. Сравнение последовательного и параллельного варианта
Описание слайда:
22. Сравнение последовательного и параллельного варианта



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