Логические ошибки Не подключено OpenMP презентация в формате PowerPoint - скачать бесплатно

Скачать презентацию на тему: "Логические ошибки Не подключено OpenMP" с количеством слайдов в размере 26 страниц. У нас вы найдете презентацию на любую тему и для каждого класса школьной программы. Мы уверены, что наши слайды помогут найти вам свою аудиторию. Весь материал предоставлен бесплатно, в знак благодарности мы просим Вас поделиться ссылками в социальных сетях и по возможности добавьте наш сайт MirPpt.ru в закладки.

Содержание [Показать]

Нажмите для просмотра
Логические ошибки Не подключено OpenMP

1: Типичные ошибки по материалам статьи «32 подводных камня OpenMP при программировании на Си» http://software. intel. com/ru-ru/articles/32-openmp-traps-for-c-developers/ Речь об ошибках, которые не обнаруживаются компилятором. Выделяют логические ошибки и ошибки производительности. Логические ошибки приводят к неожиданным результатам, то есть к некорректной работе программы. Ошибки производительности приводят к снижению быстродействия программы.

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

3: Пропущено omp Пропущено omp Некорректно: pragma omp parallel numthreads(2) pragma single printf("men"); Напечатает 2 раза

4: Пропущено for Пропущено for Некорректно: pragma omp parallel numthreads(2) for (int i 0; i 10; i) myFunc(); Вызовет функцию 20 раз

5: Лишнее parallel Лишнее parallel Некорректно - вызовет функцию 20 раз pragma omp parallel numthreads(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 игнорируется, цикл выполняется в произвольном порядке

7: Переопределение количества тредов внутри параллельной секции Переопределение количества тредов внутри параллельной секции Некорректно: pragma omp parallel ompsetnumthreads(2); pragma omp for for (int i 0; i 10; i) myFunc();

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

9: Вывод алфавита Вывод алфавита Некорректно: ompsetnumthreads(4); pragma omp parallel private(i) int LettersPerThread 26 / ompgetnumthreads(); int ThisThreadNum ompgetthreadnum(); int StartLetter a ThisThreadNum LettersPerThread; int EndLetter a ThisThreadNum LettersPerThread LettersPerThread; for (int iStartLetter; i

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

11: Вывод алфавита Вывод алфавита Корректно: if (ompgetdynamic()) ompsetdynamic(0);//запрет на динамическое изменение ompsetnumthreads(2); //ompsetnumthreads(4); pragma omp parallel private(i) int LettersPerThread 26 / ompgetnumthreads(); int ThisThreadNum ompgetthreadnum(); int StartLetter a ThisThreadNum LettersPerThread; int EndLetter a ThisThreadNum LettersPerThread LettersPerThread; for (int iStartLetter; i

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

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

14: Некорректно: Некорректно: int a 0; pragma omp parallel a;

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

16: Некорректно: Некорректно: int a 0; pragma omp parallel numthreads(2) a; pragma omp single cout

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

18: Не инициализированы локальные переменные Не инициализированы локальные переменные Некорректно: int a 0; pragma omp parallel private(a) a;

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

20: Не определен порядок итераций цикла Не определен порядок итераций цикла Некорректно: int arr new int10; for(int i 0; i 10; i) arri i; pragma omp parallel for for (int i 1; i 10; i) arri arri - 1; for(int i 0; i 10; i) printf("narrd d", i, arri); Теоретически программа должна вывести нули. НО: на двухпроцессорной машине будет выведено некоторое количество нулей и пятерок - итерации (как правило) делятся между тредами пополам.

21: Корректно: Корректно: int arr new int10; for(int i 0; i 10; i) arri i; pragma omp parallel for ordered for (int i 1; i 10; i) pragma omp ordered arri arri - 1; for(int i 0; i 10; i) printf("narrd d", i, arri); Программа выведет нули.

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

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

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

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

26: Пример – сокращение входов в критические секции Пример – сокращение входов в критические секции Неэффективно: pragma omp parallel for for ( i 0 ; i N; i ) pragma omp critical if (arri max) max arri;

Скачать презентацию


MirPpt.ru