MSU2011_MPI_OpenMP (811099), страница 4
Текст из файла (страница 4)
]for (init-expr; test-expr; incr-expr) структурный блокгде клауза одна из :• private(list)• firstprivate(list)• lastprivate(list)• reduction(operator: list)• schedule(kind[, chunk_size])• collapse(n)• ordered• nowait21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP90 из 125Распределение витков цикла. Клауза schedule#pragma omp parallel for schedule(static, 10)for(int i = 1; i <= 100; i++)Результат выполнения программы на 4-х ядерном процессоре можетбыть следующим:Поток 0 получает право на выполнение итераций 1-10, 41-50, 81-90.Поток 1 получает право на выполнение итераций 11-20, 51-60, 91-100.Поток 2 получает право на выполнение итераций 21-30, 61-70.Поток 3 получает право на выполнение итераций 31-40, 71-8021 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP91 из 125Распределение витков цикла.
Клауза schedule#pragma omp parallel for schedule(dynamic, 15)for(int i = 1; i <= 100; i++)Результат выполнения программы на 4-х ядерном процессоре можетбыть следующим:Поток 0 получает право на выполнение итераций 1-15.Поток 1 получает право на выполнение итераций 16-30.Поток 2 получает право на выполнение итераций 31-45.Поток 3 получает право на выполнение итераций 46-60.Поток 3 завершает выполнение итераций.Поток 3 получает право на выполнение итераций 61-75.Поток 2 завершает выполнение итераций.Поток 2 получает право на выполнение итераций 76-90.Поток 0 завершает выполнение итераций.Поток 0 получает право на выполнение итераций 91-100.21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP92 из 125Распределение витков цикла.
Клауза scheduleчисло_выполняемых_потоком_итераций =max(число_нераспределенных_итераций/omp_get_num_threads(),число_итераций)#pragma omp parallel for schedule(guided, 10)for(int i = 1; i <= 100; i++)Пусть программа запущена на 4-х ядерном процессоре. Поток 0 получает право на выполнение итераций 1-25. Поток 1 получает право на выполнение итераций 26-44. Поток 2 получает право на выполнение итераций 45-59. Поток 3 получает право на выполнение итераций 60-69. Поток 3 завершает выполнение итераций. Поток 3 получает право на выполнение итераций 70-79. Поток 2 завершает выполнение итераций. Поток 2 получает право на выполнение итераций 80-89. Поток 3 завершает выполнение итераций. Поток 3 получает право на выполнение итераций 90-99. Поток 1 завершает выполнение итераций. Поток 1 получает право на выполнение 100 итерации.21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP93 из 125Распределение витков цикла.
Клауза schedule#pragma omp parallel for schedule(runtime)for(int i = 1; i <= 100; i++) /* способ распределения витков цикла междунитями будет задан во время выполнения программы*/При помощи переменных среды:csh:setenv OMP_SCHEDULE "dynamic,4“ksh:export OMP_SCHEDULE="static,10“Windows:set OMP_SCHEDULE=autoили при помощи функции системы поддержки:void omp_set_schedule(omp_sched_t kind, int modifier);21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP94 из 125Распределение витков цикла.
Клауза schedule#pragma omp parallel for schedule(auto)for(int i = 1; i <= 100; i++)Способ распределения витков цикла между нитями определяетсяреализацией компилятора.На этапе компиляции программы или во время ее выполненияопределяется оптимальный способ распределения.21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP95 из 125Распределение витков цикла. Клауза nowaitvoid example(int n, float *a, float *b, float *с, float *z){int i;float sum = 0.0;#pragma omp parallel{#pragma omp for schedule(static) nowait reduction (+: sum)for (i=0; i<n; i++) {c[i] = (a[i] + b[i]) / 2.0;sum += c[i];}#pragma omp for schedule(static) nowaitfor (i=0; i<n; i++)z[i] = sqrt(b[i]);#pragma omp barrier… = sum}}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP96 из 125Выполнение структурного блока одной нитью(директива single).#pragma omp single [клауза[[,] клауза] ...] #include <stdio.h>float x, y;структурный блок#pragma omp threadprivate(x, y)где клауза одна из :void init(float a, float b ) {private(list)#pragma omp single copyprivate(a,b,x,y)firstprivate(list)scanf("%f %f %f %f", &a, &b, &x, &y);copyprivate(list)}nowaitint main () {Структурный блок будет выполнен#pragma omp parallelодной из нитей.
Все остальные{нити будут дожидатьсярезультатов выполнения блока,float x1,y1;если не указана клауза NOWAIT.init (x1,y1);parallel_work ();}}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP97 из 125Конструкции для синхронизации нитей Директива master Директива critical Директива barrier Директива flush21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP98 из 125Директива master#pragma omp masterструктурный блок/*Структурный блок будет выполнен MASTER-нитью группы. Позавершении выполнения структурного блока барьернаясинхронизация нитей не выполняется*/#include <stdio.h>void init(float *a, float *b ) {#pragma omp masterscanf("%f %f", a, b);#pragma omp barrier}int main () {float x,y;#pragma omp parallel{init (&x,&y);parallel_work (x,y);}21 февраляГибридная модель программирования MPI/OpenMPМосква,2011}99 из 125Взаимное исключение критических интерваловПри взаимодействии через общую память нити должны синхронизоватьсвое выполнение.int i=0;#pragma omp parallel {i++;}ВремяThread01load i (i = 0)2incr i (i = 1)3->Thread1load i (i = 0)4incr i (i = 1)5store i (i = 1)Результат зависитот порядкавыполнениякоманд.
Требуетсявзаимное6storei (i = 1)<исключение критических интервалов.21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP100 из 125Взаимное исключение критических интерваловРешение проблемы взаимного исключения должно удовлетворятьтребованиям:в любой момент времени только одна нить может находиться внутрикритического интервала;если ни одна нить не находится в критическом интервале, то любаянить, желающая войти в критический интервал, должна получитьразрешение без какой либо задержки;ни одна нить не должна бесконечно долго ждать разрешения на входв критический интервал (если ни одна нить не будет находиться внутрикритического интервала бесконечно).21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP101 из 125Вычисление числа .
Последовательнаяпрограмма.int main (){int n =100000, i;double pi, h, sum, x;h = 1.0 / (double) n;sum = 0.0;for (i = 1; i <= n; i ++){x = h * ((double)i - 0.5);sum += (4.0 / (1.0 + x*x));}pi = h * sum;printf("pi is approximately %.16f”, pi);return 0;}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP102 из 125Вычисление числа на OpenMP сиспользованием критической секции#include <stdio.h>#include <omp.h>#pragma omp criticalint main ()структурный блок{int n =100000, i;double pi, h, sum, x;h = 1.0 / (double) n;sum = 0.0;#pragma omp parallel default (none) private (i,x) shared (n,h,sum){double local_sum = 0.0;#pragma omp forfor (i = 1; i <= n; i++) {x = h * ((double)i - 0.5);local_sum += (4.0 / (1.0 + x*x));}#pragma omp criticalsum += local_sum;}pi = h * sum;printf("pi is approximately %.16f”, pi);return 0;21 февраляГибридная модель программирования MPI/OpenMP}Москва,2011[(name)]103 из 125Директива barrierТочка в программе, достижимая всеми нитями группы, в которой выполнение программыприостанавливается до тех пор пока все нити группы не достигнут данной точки.#pragma omp barrierПо умолчанию барьерная синхронизация нитей выполняется:по завершению конструкции parallel;при выходе из конструкций распределения работ (for, single, sections) , если не указанаклауза nowait.int size;#pragma omp parallel{#pragma omp master{scanf("%d",&size);}#pragma omp barrierprocess(size);}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP104 из 125Директива flush#pragma omp flush [(список переменных)]По умолчанию все переменные приводятся в консистентное состояние (#pragmaomp flush):При барьерной синхронизацииПри входе и выходе из конструкций parallel, critical и ordered.При выходе из конструкций распределения работ (for, single, sections,workshare), если не указана клауза nowait.При вызове omp_set_lock и omp_unset_lock.При вызове omp_test_lock, omp_set_nest_lock, omp_unset_nest_lockи omp_test_nest_lock, если изменилось состояние семафора.При входе и выходе из конструкции atomic выполняется #pragma omp flush(x), гдеx – переменная, изменяемая в конструкции atomic.21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP105 из 125Система поддержки выполнения OpenMPпрограмм.Внутренние переменные, управляющие выполнениемOpenMP-программы (ICV-Internal Control Variables).Задание/опрос значений ICV-переменных.Функции работы со временем.21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP106 из 125Internal Control Variables.Для параллельных областей: nthreads-var thread-limit-var dyn-var nest-var max-active-levels-varДля циклов: run-sched-var def-sched-varДля всей программы: stacksize-var wait-policy-var21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP107 из 125Internal Control Variables.