Содержание
- 2. OpenMP OpenMP – технология параллельного программирования для компьютеров с общей памятью. Стандарт 3.0 принят в мае
- 3. OpenMP Макрос _OPENMP определён в формате yyyymm, где yyyy и mm – цифры года и месяца,
- 4. OpenMP Распараллеливание в OpenMP: вставка в текст программы специальных директив, а также вызов вспомогательных функций. SPMD-модель
- 5. OpenMP Программа начинается с последовательной области – работает одна нить, при входе в параллельную область порождается
- 6. OpenMP В OpenMP переменные в параллельных областях программы разделяются на два основных класса: shared (общие; все
- 7. OpenMP Директивы OpenMP в языке Си задаются указаниями препроцессору, начинающимися с #pragma omp. #pragma omp directive-name
- 8. OpenMP Чтобы задействовать функции библиотеки OpenMP периода выполнения (исполняющей среды), в программу нужно включить заголовочный файл
- 9. OpenMP Функции для работы с системным таймером: double omp_get_wtime(void); Возвращает астрономическое время в секундах, прошедшее с
- 10. OpenMP Параллельные и последовательные области: #pragma omp parallel [опция[[,] опция]...] Порождаются новые OMP_NUM_THREADS-1 нитей, каждая нить
- 11. OpenMP if(условие) – выполнение параллельной области по условию; num_threads (целочисленное выражение) – явное задание количества нитей,
- 12. OpenMP firstprivate(список) – переменные, для которых порождается локальная копия в каждой нити; локальные копии инициализируются значениями
- 13. OpenMP reduction(оператор:список) – задаёт оператор и список общих переменных; для каждой переменной создаются локальные копии в
- 14. OpenMP #include int main(int argc, char *argv[]) { printf("Последовательная область 1\n"); #pragma omp parallel { printf("Параллельная
- 15. OpenMP #include int main(int argc, char *argv[]) { int count = 0; #pragma omp parallel reduction
- 16. OpenMP Если внутри параллельной области содержится только один параллельный цикл, одна конструкция sections или одна конструкция
- 17. OpenMP void omp_set_num_threads(int num); #include #include int main(int argc, char *argv[]) { omp_set_num_threads(2); #pragma omp parallel
- 18. OpenMP Функция omp_get_max_threads() возвращает максимально допустимое число нитей для использования в следующей параллельной области. int omp_get_max_threads(void);
- 19. OpenMP Параллельные области могут быть вложенными; по умолчанию вложенная параллельная область выполняется одной нитью. Это управляется
- 20. OpenMP Функция omp_in_parallel() возвращает 1, если она была вызвана из активной параллельной области программы. int omp_in_parallel(void);
- 21. OpenMP Если в параллельной области какой-либо участок кода должен быть выполнен лишь один раз, то его
- 22. OpenMP nowait – после выполнения участка происходит неявная барьерная синхронизация нитей: их дальнейшее выполнение происходит только
- 23. OpenMP Директива master выделяет участок кода, который будет выполнен только нитью-мастером. Остальные нити пропускают данный участок
- 24. OpenMP Все нити в параллельной области нумеруются последовательными целыми числами от 0 до N-1, где N
- 25. OpenMP #include #include int main(int argc, char *argv[]) { int n=1; printf("в посл. области (1): %d\n",
- 26. OpenMP #include #include int main(int argc, char *argv[]) { int n=1; printf("в посл. области (1): %d\n",
- 27. OpenMP Если в параллельной области встретился оператор цикла, то, согласно общему правилу, он будет выполнен всеми
- 28. OpenMP private(список); firstprivate(список); lastprivate(список) – переменным, перечисленным в списке, присваивается результат с последнего витка цикла; reduction(оператор:список);
- 29. OpenMP collapse(n) — опция указывает, что n последовательных тесновложенных циклов ассоциируется с данной директивой; для циклов
- 30. OpenMP На вид параллельных циклов накладываются достаточно жёсткие ограничения. В частности, предполагается, что корректная программа не
- 31. OpenMP Итеративная переменная распределяемого цикла по смыслу должна быть локальной, поэтому в случае, если она специфицирована
- 32. OpenMP #include #include int main(int argc, char *argv[]) { int A[10], B[10], C[10], i, n; for
- 33. OpenMP В опции schedule параметр type задаёт следующий тип распределения итераций: static – блочно-циклическое распределение итераций
- 34. OpenMP dynamic – динамическое распределение итераций с фиксированным размером блока: сначала каждая нить получает chunk итераций
- 35. OpenMP guided – динамическое распределение итераций, при котором размер порции уменьшается с некоторого начального значения до
- 36. OpenMP auto – способ распределения итераций выбирается компилятором и/или системой выполнения. Параметр chunk при этом не
- 37. OpenMP #include #include int main(int argc, char *argv[]) { int i; #pragma omp parallel private(i) {
- 38. OpenMP Значение по умолчанию переменной OMP_SCHEDULE зависит от реализации. Если переменная задана неправильно, то поведение программы
- 39. OpenMP Изменить значение переменной OMP_SCHEDULE из программы можно с помощью вызова функции omp_set_schedule(). void omp_set_schedule(omp_sched_t type,
- 40. OpenMP При помощи вызова функции omp_get_schedule() пользователь может узнать текущее значение переменной OMP_SCHEDULE. void omp_get_schedule(omp_sched_t* type,
- 41. OpenMP Директива sections определяет набор независимых секций кода, каждая из которых выполняется своей нитью. #pragma omp
- 42. OpenMP Директива section задаёт участок кода внутри секции sections для выполнения одной нитью. #pragma omp section
- 43. OpenMP int n; #pragma omp parallel private(n) { n=omp_get_thread_num(); #pragma omp sections { #pragma omp section
- 44. OpenMP int n=0; #pragma omp parallel { #pragma omp sections lastprivate(n) { #pragma omp section n=1;
- 45. OpenMP Директива task применяется для выделения отдельной независимой задачи. #pragma omp task [опция [[,] опция]...] Текущая
- 46. OpenMP if(условие) — порождение новой задачи только при выполнении некоторого условия; если условие не выполняется, то
- 47. OpenMP default(shared|none); private(список); firstprivate(список); shared(список).
- 48. OpenMP Для гарантированного завершения в точке вызова всех запущенных задач используется директива taskwait. #pragma omp taskwait
- 49. OpenMP Самый распространенный способ синхронизации в OpenMP – барьер. Он оформляется с помощью директивы barrier. #pragma
- 50. OpenMP #include #include int main(int argc, char *argv[]) { #pragma omp parallel { printf("Сообщение 1\n"); printf("Сообщение
- 51. OpenMP Директива ordered определяет блок внутри тела цикла, который должен выполняться в том порядке, в котором
- 52. OpenMP #pragma omp parallel private (i, n) { n=omp_get_thread_num(); #pragma omp for ordered for (i=0; i
- 53. OpenMP С помощью директивы critical оформляется критическая секция программы. #pragma omp critical [( )] В каждый
- 54. OpenMP Все неименованные критические секции условно ассоциируются с одним и тем же именем. Имеющие одно и
- 55. OpenMP #pragma omp atomic Данная директива относится к идущему непосредственно за ней оператору присваивания (на используемые
- 56. OpenMP #include #include int main(int argc, char *argv[]) { int count = 0; #pragma omp parallel
- 57. OpenMP Один из вариантов синхронизации в OpenMP реализуется через механизм замков (locks). В качестве замков используются
- 58. OpenMP Есть два типа замков: простые замки и множественные замки. Множественный замок может многократно захватываться одной
- 59. OpenMP Для инициализации простого или множественного замка используются соответственно функции omp_init_lock() и omp_init_nest_lock(). void omp_init_lock(omp_lock_t *lock);
- 60. OpenMP Функции omp_destroy_lock() и omp_destroy_nest_lock() используются для переведения простого или множественного замка в неинициализированное состояние. void
- 61. OpenMP Для захватывания замка используются функции omp_set_lock() и omp_set_nest_lock(). void omp_set_lock(omp_lock_t *lock); void omp_set_nest_lock (omp_nest_lock_t *lock);
- 62. OpenMP Для освобождения замка используются функции omp_unset_lock() и omp_unset_nest_lock(). void omp_unset_lock(omp_lock_t *lock); void omp_unset_nest_lock(omp_lock_t *lock); Вызов
- 63. OpenMP omp_lock_t lock; int n; omp_init_lock(&lock); #pragma omp parallel private (n) { n=omp_get_thread_num(); omp_set_lock(&lock); printf("Начало закрытой
- 64. OpenMP Для неблокирующей попытки захвата замка используются функции omp_test_lock() и omp_test_nest_lock(). int omp_test_lock(omp_lock_t *lock); int omp_test_nest_lock(omp_lock_t
- 65. OpenMP omp_lock_t lock; int n; omp_init_lock(&lock); #pragma omp parallel private (n) { n=omp_get_thread_num(); while (!omp_test_lock (&lock)){
- 66. OpenMP #pragma omp flush [(список)] Выполнение данной директивы предполагает, что значения всех переменных (или переменных из
- 67. OpenMP Переменная среды OMP_STACKSIZE задаёт размер стека для создаваемых из программы нитей. Значение переменной может задаваться
- 68. OpenMP Переменная среды OMP_WAIT_POLICY задаёт поведение ждущих процессов. Если задано значение ACTIVE, то ждущему процессу будут
- 69. OpenMP Переменная среды OMP_THREAD_LIMIT задаёт максимальное число нитей, допустимых в программе. Если значение переменной не является
- 70. Напишите параллельную программу, реализующую поиск максимального значения вектора. Напишите параллельную программу, реализующую произведение матриц. Исследуйте эффективность
- 72. Скачать презентацию