🗊 Презентация Логические ошибки Не подключено OpenMP

Категория: Образование
Нажмите для полного просмотра!
Логические ошибки Не подключено OpenMP, слайд №1 Логические ошибки Не подключено OpenMP, слайд №2 Логические ошибки Не подключено OpenMP, слайд №3 Логические ошибки Не подключено OpenMP, слайд №4 Логические ошибки Не подключено OpenMP, слайд №5 Логические ошибки Не подключено OpenMP, слайд №6 Логические ошибки Не подключено OpenMP, слайд №7 Логические ошибки Не подключено OpenMP, слайд №8 Логические ошибки Не подключено OpenMP, слайд №9 Логические ошибки Не подключено OpenMP, слайд №10 Логические ошибки Не подключено OpenMP, слайд №11 Логические ошибки Не подключено OpenMP, слайд №12 Логические ошибки Не подключено OpenMP, слайд №13 Логические ошибки Не подключено OpenMP, слайд №14 Логические ошибки Не подключено OpenMP, слайд №15 Логические ошибки Не подключено OpenMP, слайд №16 Логические ошибки Не подключено OpenMP, слайд №17 Логические ошибки Не подключено OpenMP, слайд №18 Логические ошибки Не подключено OpenMP, слайд №19 Логические ошибки Не подключено OpenMP, слайд №20 Логические ошибки Не подключено OpenMP, слайд №21 Логические ошибки Не подключено OpenMP, слайд №22 Логические ошибки Не подключено OpenMP, слайд №23 Логические ошибки Не подключено OpenMP, слайд №24 Логические ошибки Не подключено OpenMP, слайд №25 Логические ошибки Не подключено OpenMP, слайд №26

Содержание

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

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


Слайд 1


Типичные ошибки по материалам статьи «32 подводных камня OpenMP при программировании на Си++» Речь об ошибках, которые не обнаруживаются...
Описание слайда:
Типичные ошибки по материалам статьи «32 подводных камня OpenMP при программировании на Си++» Речь об ошибках, которые не обнаруживаются компилятором. Выделяют логические ошибки и ошибки производительности. Логические ошибки приводят к неожиданным результатам, то есть к некорректной работе программы. Ошибки производительности приводят к снижению быстродействия программы.

Слайд 2


Логические ошибки Не подключено OpenMP Пропущено parallel Некорректно: #pragma omp for ... //код
Описание слайда:
Логические ошибки Не подключено OpenMP Пропущено parallel Некорректно: #pragma omp for ... //код

Слайд 3


Пропущено omp Пропущено omp Некорректно: #pragma omp parallel num_threads(2) { #pragma single { printf("me\n"); } } Напечатает 2 раза
Описание слайда:
Пропущено omp Пропущено omp Некорректно: #pragma omp parallel num_threads(2) { #pragma single { printf("me\n"); } } Напечатает 2 раза

Слайд 4


Пропущено for Пропущено for Некорректно: #pragma omp parallel num_threads(2) for (int i = 0; i < 10; i++) myFunc(); Вызовет функцию 20 раз
Описание слайда:
Пропущено for Пропущено for Некорректно: #pragma omp parallel num_threads(2) for (int i = 0; i < 10; i++) myFunc(); Вызовет функцию 20 раз

Слайд 5


Лишнее parallel Лишнее parallel Некорректно - вызовет функцию 20 раз #pragma omp parallel num_threads(2) { ... // N строк кода #pragma omp parallel...
Описание слайда:
Лишнее parallel Лишнее parallel Некорректно - вызовет функцию 20 раз #pragma omp parallel num_threads(2) { ... // N строк кода #pragma omp parallel for for (int i = 0; i < 10; i++) { myFunc(); } }

Слайд 6


Пропущено ordered Пропущено ordered Некорректно: #pragma omp parallel for ordered for (int i = 0; i < 10; i++) { myFunc(i); } Не указана область –...
Описание слайда:
Пропущено ordered Пропущено ordered Некорректно: #pragma omp parallel for ordered for (int i = 0; i < 10; i++) { myFunc(i); } Не указана область – ordered игнорируется, цикл выполняется в произвольном порядке

Слайд 7


Переопределение количества тредов внутри параллельной секции Переопределение количества тредов внутри параллельной секции Некорректно: #pragma omp...
Описание слайда:
Переопределение количества тредов внутри параллельной секции Переопределение количества тредов внутри параллельной секции Некорректно: #pragma omp parallel { omp_set_num_threads(2); #pragma omp for for (int i = 0; i < 10; i++) { myFunc(); } }

Слайд 8


Зависимость поведения программы от числа тредов Зависимость поведения программы от числа тредов Число тредов: По умолчанию, как правило, равно числу...
Описание слайда:
Зависимость поведения программы от числа тредов Зависимость поведения программы от числа тредов Число тредов: По умолчанию, как правило, равно числу установленных на компьютере процессоров. Может также задаваться программистом: функция omp_set_num_threads, опция num_threads, переменная среды OMP_NUM_THREADS. По умолчанию может оказаться разным на разных компьютерах. Если это специально не заложено в алгоритм, то поведение кода не должно зависеть от количества выполняющих его тредов. Распределение работы между тредами выполняет компилятор. Можно использовать опцию schedule.

Слайд 9


Вывод алфавита Вывод алфавита Некорректно: omp_set_num_threads(4); #pragma omp parallel private(i) { int LettersPerThread = 26 /...
Описание слайда:
Вывод алфавита Вывод алфавита Некорректно: omp_set_num_threads(4); #pragma omp parallel private(i) { int LettersPerThread = 26 / omp_get_num_threads(); int ThisThreadNum = omp_get_thread_num(); int StartLetter = 'a' + ThisThreadNum * LettersPerThread; int EndLetter = 'a' + ThisThreadNum * LettersPerThread + LettersPerThread; for (int i=StartLetter; i

Слайд 10


Некорректное динамическое создание тредов Некорректное динамическое создание тредов Переменная среды bool OMP_DYNAMIC задает возможность...
Описание слайда:
Некорректное динамическое создание тредов Некорректное динамическое создание тредов Переменная среды bool OMP_DYNAMIC задает возможность динамического определения числа тредов. Переменная имеет больший приоритет, чем опция num_threads. Если выполнение кода зависит от количества выполняющих его тредов, поведение программы может стать некорректным. Спецификация OpenMP - значение OMP_DYNAMIC зависит от конкретной реализации. Следовательно, необходимы доп. проверки.

Слайд 11


Вывод алфавита Вывод алфавита Корректно: if (omp_get_dynamic()) omp_set_dynamic(0);//запрет на динамическое изменение omp_set_num_threads(2);...
Описание слайда:
Вывод алфавита Вывод алфавита Корректно: if (omp_get_dynamic()) omp_set_dynamic(0);//запрет на динамическое изменение omp_set_num_threads(2); //omp_set_num_threads(4); #pragma omp parallel private(i) { int LettersPerThread = 26 / omp_get_num_threads(); int ThisThreadNum = omp_get_thread_num(); int StartLetter = 'a' + ThisThreadNum * LettersPerThread; int EndLetter = 'a' + ThisThreadNum * LettersPerThread + LettersPerThread; for (int i=StartLetter; i

Слайд 12


Одновременное использование общего ресурса Одновременное использование общего ресурса Пример - операция вывода (через printf) строки на экран не...
Описание слайда:
Одновременное использование общего ресурса Одновременное использование общего ресурса Пример - операция вывода (через printf) строки на экран не является атомарной.  два (и более) треда будут выводить свои символы одновременно. Аналогично для стандартного потока вывода cout, для любого другого объекта, доступного нескольким тредам. Для корректного выполнения действия, изменяющего состояние таких объектов из нескольких тредов, необходимо обеспечить: в каждый момент времени действие выполняется только одним из тредов. Для этого можно использовать директиву critical. #pragma omp parallel num_threads(4) { #pragma omp critical { printf("Hello World\n"); } }

Слайд 13


Незащищенный доступ к общей памяти Незащищенный доступ к общей памяти Для корректного выполнения действия, изменяющего состояние общей памяти из...
Описание слайда:
Незащищенный доступ к общей памяти Незащищенный доступ к общей памяти Для корректного выполнения действия, изменяющего состояние общей памяти из нескольких тредов, необходимо обеспечить: в каждый момент времени действие выполняется только одним из тредов. Для этого можно использовать директиву atomic.

Слайд 14


Некорректно: Некорректно: int a = 0; #pragma omp parallel { a++; }
Описание слайда:
Некорректно: Некорректно: int a = 0; #pragma omp parallel { a++; }

Слайд 15


Отсутствие директивы flush Отсутствие директивы flush Директива flush неявно не выполняется : При входе в параллельную секцию директивы for. При...
Описание слайда:
Отсутствие директивы flush Отсутствие директивы flush Директива flush неявно не выполняется : При входе в параллельную секцию директивы for. При входе и при выходе из секции директивы master. При входе в параллельную секцию директивы sections. При входе в секцию директивы single. При выходе из секции директивы for, single или sections, если есть опция nowait. Поэтому нужно явное указание!

Слайд 16


Некорректно: Некорректно: int a = 0; #pragma omp parallel num_threads(2) { a++; #pragma omp single { cout
Описание слайда:
Некорректно: Некорректно: int a = 0; #pragma omp parallel num_threads(2) { a++; #pragma omp single { cout

Слайд 17


Отсутствие явной синхронизации тредов Отсутствие явной синхронизации тредов (как в последнем коде) Корректно : int a = 0; #pragma omp parallel...
Описание слайда:
Отсутствие явной синхронизации тредов Отсутствие явной синхронизации тредов (как в последнем коде) Корректно : int a = 0; #pragma omp parallel num_threads(2) { #pragma omp atomic a++; #pragma omp barrier //явная синхронизация! #pragma omp single { cout

Слайд 18


Не инициализированы локальные переменные Не инициализированы локальные переменные Некорректно: int a = 0; #pragma omp parallel private(a) { a++; }
Описание слайда:
Не инициализированы локальные переменные Не инициализированы локальные переменные Некорректно: int a = 0; #pragma omp parallel private(a) { a++; }

Слайд 19


Ограничения для локальных переменных Ограничения для локальных переменных Если требуется создать локальную копию объекта, массива или ссылочной...
Описание слайда:
Ограничения для локальных переменных Ограничения для локальных переменных Если требуется создать локальную копию объекта, массива или ссылочной переменной, то соответствующая ссылка должна быть общей переменной. Локальные переменные явно не выделены Если переменная не помечена как локальная, то она используется как общая по умолчанию.

Слайд 20


Не определен порядок итераций цикла Не определен порядок итераций цикла Некорректно: int* arr = new int[10]; for(int i = 0; i < 10; i++) arr[i] = i;...
Описание слайда:
Не определен порядок итераций цикла Не определен порядок итераций цикла Некорректно: int* arr = new int[10]; for(int i = 0; i < 10; i++) arr[i] = i; #pragma omp parallel for for (int i = 1; i < 10; i++) arr[i] = arr[i - 1]; for(int i = 0; i < 10; i++) printf("\narr[%d] = %d", i, arr[i]); Теоретически программа должна вывести нули. НО: на двухпроцессорной машине будет выведено некоторое количество нулей и пятерок - итерации (как правило) делятся между тредами пополам.

Слайд 21


Корректно: Корректно: int* arr = new int[10]; for(int i = 0; i < 10; i++) arr[i] = i; #pragma omp parallel for ordered for (int i = 1; i < 10; i++) {...
Описание слайда:
Корректно: Корректно: int* arr = new int[10]; for(int i = 0; i < 10; i++) arr[i] = i; #pragma omp parallel for ordered for (int i = 1; i < 10; i++) { #pragma omp ordered arr[i] = arr[i - 1]; } for(int i = 0; i < 10; i++) printf("\narr[%d] = %d", i, arr[i]); Программа выведет нули.

Слайд 22


Ошибки производительности (программа работает корректно, но неэффективно) Лишняя директива flush Директива выполняется по умолчанию: В директиве...
Описание слайда:
Ошибки производительности (программа работает корректно, но неэффективно) Лишняя директива flush Директива выполняется по умолчанию: В директиве barrier При входе и при выходе из параллельной секции директивы critical При входе и при выходе из параллельной секции директивы ordered При входе и при выходе из параллельной секции директивы parallel При выходе из параллельной секции директивы for При выходе из параллельной секции директивы sections При выходе из параллельной секции директивы single При входе и при выходе из параллельной секции директивы parallel for При входе и при выходе из параллельной секции директивы parallel sections Поэтому дополнительно ее вызывать не надо!

Слайд 23


Использование critical вместо atomic Использование critical вместо atomic Директива atomic работает быстрее, чем critical, поскольку некоторые...
Описание слайда:
Использование critical вместо atomic Использование critical вместо atomic Директива atomic работает быстрее, чем critical, поскольку некоторые атомарные операции могут быть напрямую заменены командами процессора. директиву желательно применять для защиты общей памяти при элементарных операциях: x binop= expr x++ ++x x-- --x binop: +, *, -, /, &, ^, |, .

Слайд 24


Лишняя защита от одновременной записи Лишняя защита от одновременной записи Любая защита памяти от одновременной записи (atomic, critical) замедляет...
Описание слайда:
Лишняя защита от одновременной записи Лишняя защита от одновременной записи Любая защита памяти от одновременной записи (atomic, critical) замедляет выполнение программы. Без необходимости эту защиту лучше не использовать. Переменную не нужно защищать от одновременной записи если она: является локальной для треда; участвует в выражении firstprivate, private или lastprivate; участвует в коде, который гарантированно выполняется только одним тредом – в параллельной секции директивы master или директивы single.

Слайд 25


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

Слайд 26


Пример – сокращение входов в критические секции Пример – сокращение входов в критические секции Неэффективно: #pragma omp parallel for for ( i = 0 ;...
Описание слайда:
Пример – сокращение входов в критические секции Пример – сокращение входов в критические секции Неэффективно: #pragma omp parallel for for ( i = 0 ; i < N; ++i ) { #pragma omp critical { if (arr[i] > max) max = arr[i]; } }



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