лекции (OpenMP), страница 5
Описание файла
Файл "лекции" внутри архива находится в папке "OpenMP". PDF-файл из архива "OpenMP", который расположен в категории "". Всё это находится в предмете "параллельное программирование для высокопроизводительных вычислительных систем" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 5 страницы из PDF
Директива taskЯвные задачи (explicit tasks) задаются при помощи директивы:#pragma omp task [клауза[[,] клауза] ...]структурный блокгде клауза одна из :if (scalar-expression)final (scalar-expression)//OpenMP 3.1Untiedmergeable//OpenMP 3.1shared (list)private (list)firstprivate (list)default ( shared | none)depend(dependence-type: list) // OpenMP 4.0В результате выполнения директивы task создается новая задача, котораясостоит из операторов структурного блока; все используемые в операторахпеременные могут быть локализованы внутри задачи при помощисоответствующих клауз. Созданная задача будет выполнена одной нитью изгруппы.Параллельное программирование с OpenMP: Основные понятияМосква, 2015 г.© Бахтин В.А.31 из 42Использование директивы task.for (i=0; i<n; i++) {func(i);}#pragma omp parallel{…#pragma omp single // Блок операторов, выполняемый 1-ой нитью{for (i=0; i<n; i++) {#pragma omp task firstprivate(i)func(i);}}}Москва, 2015 г.Параллельное программирование с OpenMP: Основные понятия© Бахтин В.А.32 из 42Использование директивы task.typedef struct node node;struct node {int data;node * next;};void increment_list_items(node * head){#pragma omp parallel{#pragma omp single{node * p = head;while (p) {#pragma omp taskprocess(p);p = p->next;}}}Параллельное программирование с OpenMP: Основные понятия}Москва, 2015 г.© Бахтин В.А.33 из 42Использование директивы task.
Клауза ifdouble *item;int main() {#pragma omp parallel shared (item){#pragma omp single{int size;scanf("%d",&size);item = (double*)malloc(sizeof(double)*size);for (int i=0; i<size; i++)#pragma omp task if (size > 10)process(item[i]);}}}Если накладные расходы на организацию задач превосходят время,необходимое для выполнения блока операторов этой задачи, то блокоператоров будет немедленно выполнен нитью, выполнившей директиву task.Москва, 2015 г.Параллельное программирование с OpenMP: Основные понятия© Бахтин В.А.34 из 42Использование директивы task.#define LARGE_NUMBER 10000000Как правило, в компиляторахdouble item[LARGE_NUMBER];существуют ограничения на количествоextern void process(double);создаваемых задач. Выполнение цикла,int main() {в котором создаются задачи, будет#pragma omp parallel shared (item)приостановлено. Нить, выполнявшая{этот цикл, будет использована для#pragma omp singleвыполнения одной из задач.{for (int i=0; i<LARGE_NUMBER; i++)#pragma omp taskprocess(item[i]);}}}Москва, 2015 г.Параллельное программирование с OpenMP: Основные понятия© Бахтин В.А.35 из 42Использование директивы task.
Клауза untied#define LARGE_NUMBER 10000000double item[LARGE_NUMBER];extern void process(double);Клауза untied - выполнение задачи послеint main() {приостановки может быть продолжено#pragma omp parallelлюбой нитью группы{#pragma omp single{#pragma omp task untied{for (int i=0; i<LARGE_NUMBER; i++)#pragma omp taskprocess(item[i]);}}}}Москва, 2015 г.Параллельное программирование с OpenMP: Основные понятия© Бахтин В.А.36 из 42Использование директивы task.int main () {int res;#pragma omp parallel{#pragma omp single{int n;scanf("%d",&n);#pragma omp task shared(res)res = fibonacci(n);}}printf (“Finonacci number = %d\n”, res);}0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765,10946, …int fibonacci(int n) {int i, j;if (n<2)return n;else {#pragma omp task shared(i)i=fibonacci (n-1);#pragma omp task shared(j)j=fibonacci (n-2);#pragma omp taskwaitreturn i+j;}}Москва, 2015 г.Параллельное программирование с OpenMP: Основные понятия© Бахтин В.А.37 из 42Использование директивы task.
Клауза finalvoid fib (int n, int d) {int x, y;if (n < 2) return 1;#pragma omp task final (d > LIMIT) mergeablex = fib (n - 1, d + 1);#pragma omp task final (d > LIMIT) mergeabley = fib (n - 2, d + 1);#pragma omp taskwaitreturn x + y;}int omp_in_final (void);Москва, 2015 г.Параллельное программирование с OpenMP: Основные понятия© Бахтин В.А.38 из 42Использование директивы task.
Клауза dependdepend(dependence-type: list)где dependence-type:inoutinoutСекция массива:[lower-bound : length][lower-bound:][:length][:]void sort ( int n, int *a ) {#pragma omp task depend (inout: a [ 0 : n/2 ] )sort ( n/2, a );#pragma omp task depend (inout: a [ n/2+1 : n/2 )sort ( n/2, a[n/2+1] );#pragma omp task depend (inout : a [ 0 : n / 2 ], a [ n/2+1 : n/2 ] )merge ( n/2 , a, a[n/2+1], a );}Москва, 2015 г.Параллельное программирование с OpenMP: Основные понятия© Бахтин В.А.39 из 42Вопросы?Вопросы?Москва, 2015 г.Параллельное программирование с OpenMP: Основные понятия© Бахтин В.А.40 из 42Следующая темаКонструкции распределения работыМосква, 2015 г.Параллельное программирование с OpenMP: Основные понятия© Бахтин В.А.41 из 42КонтактыБахтин В.А., кандидат физ.-мат.
наук, заведующийсектором, Институт прикладной математики им.М.В.Келдыша РАНbakhtin@keldysh.ruМосква, 2015 г.Параллельное программирование с OpenMP: Основные понятия© Бахтин В.А.42 из 42Интернет УниверситетСуперкомпьютерных технологийКонструкции распределения работыУчебный курсПараллельное программирование сOpenMPБахтин В.А., кандидат физ.-мат.
наук,заведующий сектором,Институт прикладной математики им.М.В.Келдыша РАНСодержаниеРаспределение витков циклов.Циклы с зависимостью по данным. Организация конвейерноговыполнения для циклов с зависимостью по данным.Распределение нескольких структурных блоков между нитями(директива SECTION).Выполнение структурного блока одной нитью (директиваSINGLE).Распределение операторов одного структурного блока междунитями (директива WORKSHARE).Москва, 2015 г.Параллельное программирование с OpenMP: Конструкциираспределения работы © Бахтин В.А.2 из 42Вычисление числа 14.04.0(1+x2)dx = 0Мы можемаппроксимировать интегралкак сумму прямоугольников:2.0N F(x )x ii=00.0Москва, 2015 г.1.0XГде каждый прямоугольникимеет ширину x и высотуF(xi) в середине интервалаПараллельное программирование с OpenMP: Конструкциираспределения работы © Бахтин В.А.3 из 42Вычисление числа .
Последовательнаяпрограмма.#include <stdio.h>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;}Москва, 2015 г.Параллельное программирование с OpenMP: Конструкциираспределения работы © Бахтин В.А.4 из 42Вычисление числа на OpenMP#include <stdio.h>#include <omp.h>int 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) reduction(+:sum){int id = omp_get_thread_num();int numt = omp_get_num_threads();for (i = id + 1; i <= n; i=i+numt){x = h * ((double)i - 0.5);sum += (4.0 / (1.0 + x*x));}}pi = h * sum;printf("pi is approximately %.16f”, pi);return 0;}Москва, 2015 г.Параллельное программирование с OpenMP: Конструкциираспределения работы © Бахтин В.А.5 из 42Вычисление числа на OpenMP#include <stdio.h>#include <omp.h>int 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) reduction(+:sum){#pragma omp for schedule (static, 1)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;}Москва, 2015 г.Параллельное программирование с OpenMP: Конструкциираспределения работы © Бахтин В.А.6 из 42Вычисление числа на OpenMP#include <omp.h>int 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) reduction(+:sum){int iam = omp_get_thread_num();int numt = omp_get_num_threads();int start = iam * n / numt + 1;int end = (iam + 1) * n / numt;if (iam == numt -1) end = n;for (i = start; i <= end; 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;}Москва, 2015 г.Параллельное программирование с OpenMP: Конструкциираспределения работы © Бахтин В.А.7 из 42Вычисление числа на OpenMP#include <stdio.h>#include <omp.h>int 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) reduction(+:sum){#pragma omp for schedule (static)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;}Москва, 2015 г.Параллельное программирование с OpenMP: Конструкциираспределения работы © Бахтин В.А.8 из 42Распределение витков цикла#pragma omp for [клауза[[,]клауза] ...
]for (init-expr; test-expr; incr-expr) структурный блокгде клауза одна из : private(list) firstprivate(list) lastprivate(list) reduction(operator: list) schedule(kind[, chunk_size]) collapse(n) ordered nowaitМосква, 2015 г.Параллельное программирование с OpenMP: Конструкциираспределения работы © Бахтин В.А.9 из 42Распределение витков циклаinit-expr : var = loop-invariant-expr1| integer-type var = loop-invariant-expr 1| random-access-iterator-type var = loop-invariant-expr 1| pointer-type var = loop-invariant-expr 1test-expr:var relational-op loop-invariant-expr2| loop-invariant-expr2 relational-op varrelational-op: <| <=|>| >=incr-expr: ++varvar: signed or unsigned integer type| var++| random access iterator type| --var| pointer type| var -| var += loop-invariant-integer- expr| var -= loop-invariant-integer- expr| var = var + loop-invariant-integer- expr| var = loop-invariant-integer- expr + var| var = var - loop-invariant-integer- exprМосква, 2015 г.Параллельное программирование с OpenMP: Конструкциираспределения работы © Бахтин В.А.10 из 42Parallel Random Access Iterator Loop (OpenMP 3.0)#include <vector>void iterator_example(){std::vector<int> vec(23);std::vector<int>::iterator it;#pragma omp parallel for default(none) shared(vec)for (it = vec.begin(); it < vec.end(); it++){// do work with *it //}}Москва, 2015 г.Параллельное программирование с OpenMP: Конструкциираспределения работы © Бахтин В.А.11 из 42Использование указателей в цикле (OpenMP 3.0)void pointer_example (){char a[N];#pragma omp for default (none) shared (a,N)for (char *p = a; p < (a+N); p++ ){use_char (p);}}for (char *p = a; p != (a+N); p++ ) - ошибкаМосква, 2015 г.Параллельное программирование с OpenMP: Конструкциираспределения работы © Бахтин В.А.12 из 42Вложенность конструкций распределения работыvoid work(int i, int j) {}void wrong1(int n){#pragma omp parallel default(shared){int i, j;#pragma omp forfor (i=0; i < n; i++) {/* incorrect nesting of loop regions */#pragma omp forfor (j=0; j < n; j++)work(i, j);}}}Москва, 2015 г.Параллельное программирование с OpenMP: Конструкциираспределения работы © Бахтин В.А.13 из 42Вложенность конструкций распределения работыvoid work(int i, int j) {}void good_nesting(int n){int i, j;#pragma omp parallel default(shared){#pragma omp forfor (i=0; i < n; i++) {#pragma omp parallel shared(i, n){#pragma omp forfor (j=0; j < n; j++)work(i, j);}}}}Москва, 2015 г.Параллельное программирование с OpenMP: Конструкциираспределения работы © Бахтин В.А.14 из 42Распределение витков многомерных циклов.