OpenMP (по Бахтину) (Лекции), страница 2
Описание файла
Файл "OpenMP (по Бахтину)" внутри архива находится в папке "Лекции". PDF-файл из архива "Лекции", который расположен в категории "". Всё это находится в предмете "суперкомпьютерное моделирование и технологии" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 2 страницы из PDF
Последовательная программа#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;}28 октябряМосква, 2011Технология параллельного программирования OpenMP27 из 142Вычисление числа на 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, 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;}28 октябряМосква, 2011Технология параллельного программирования OpenMP28 из 142Конфликт доступа к даннымПри взаимодействии через общую память нити должны синхронизоватьсвое выполнение.Thread0: sum = sum + val; && Thread1: sum = sum + val;ВремяThread 01LOAD R1,sum2LOAD R2,val3ADD R1,R2Thread 1LOAD R1,sum4LOAD R2,val5ADD R1,R26STORE R1,sum7STORE R1,sumРезультат зависит от порядка выполнения команд.
Требуется взаимноеисключение критических интервалов.28 октябряМосква, 2011Технология параллельного программирования OpenMP29 из 142Вычисление числа на OpenMP#include <stdio.h>#include <omp.h>#define NUM_THREADS 32int main (){int n =100000, i;double pi, h, sum[NUM_THREADS], x;h = 1.0 / (double) n;#pragma omp parallel default (none) private (i,x) shared (n,h,sum){int id = omp_get_thread_num();int numt = omp_get_num_threads();for (i = id + 1, sum[id] = 0.0; i <= n; i=i+numt){x = h * ((double)i - 0.5);sum[id] += (4.0 / (1.0 + x*x));}}for(i=0, pi=0.0; i<NUM_THREADS; i++) pi += sum[i] * h;printf("pi is approximately %.16f”, pi);return 0;}28 октябряМосква, 2011Технология параллельного программирования OpenMP30 из 142Вычисление числа на OpenMP.
Клауза reduction#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;}28 октябряМосква, 2011Технология параллельного программирования OpenMP31 из 142Клауза reductionreduction(operator:list) Внутри паралельной областидля каждой переменной изсписка list создается копия этойпеременной. Эта переменнаяинициализируется всоответствии с операторомoperator (например, 0 для «+»). Для каждой нити компиляторзаменяет в параллельнойобласти обращения кредукционной переменной наобращения к созданной копии. По завершении выполненияпараллельной областиосуществляется объединениеполученных результатов.28 октябряМосква, 2011ОператорНачальное значение+0*1-0&~0|0^0&&1||0Least number inreduction list item typeLargest number inreduction list item typemaxminТехнология параллельного программирования OpenMP32 из 142Клауза ifif(scalar-expression)В зависимости от значения scalar-expression для выполнения структурногоблока будет создана группа нитей или он будет выполняться однойнитью.#include <stdio.h>#include <omp.h>int main(){int n = 0;printf("Enter the number of intervals: (0 quits) ");scanf("%d",&n);#pragma omp parallel if (n>10){int id = omp_get_thread_num ();func (n, id);}return 0;}28 октябряМосква, 2011Технология параллельного программирования OpenMP33 из 142Клауза num_threadsnum_threads(integer-expression)integer-expression задает максимально возможное число нитей, которыебудут созданы для выполнения структурного блока#include <omp.h>int main(){int n = 0;printf("Enter the number of intervals: (0 quits) ");scanf("%d",&n);omp_set_dynamic(1);#pragma omp parallel num_threads(10){int id = omp_get_thread_num ();func (n, id);}return 0;}28 октябряМосква, 2011Технология параллельного программирования OpenMP34 из 142Клауза copyincopyin(list)Значение каждой threadprivate-переменной из списка list, устанавливаетсяравным значению этой переменной в master-нити#include <stdlib.h>float* work;int size;float tol;#pragma omp threadprivate(work,size,tol)void build(){int i;work = (float*)malloc( sizeof(float)*size );for( i = 0; i < size; ++i ) work[i] = tol;}int main(){read_from_file (&tol, &size);#pragma omp parallel copyin(tol,size)build();}28 октябряМосква, 2011Технология параллельного программирования OpenMP35 из 142Содержание Современные направления развития параллельныхвычислительных систем OpenMP – модель параллелизма по управлению Конструкции распределения работы Конструкции для синхронизации нитей Система поддержки выполнения OpenMP-программ.Переменные окружения, управляющие выполнениемOpenMP-программы Наиболее часто встречаемые ошибки в OpenMPпрограммах.
Функциональная отладка OpenMP-программ Отладка эффективности OpenMP-программ28 октябряМосква, 2011Технология параллельного программирования OpenMP36 из 142Конструкции распределения работы Распределение витков циклов (директива for) Распределение нескольких структурных блоков междунитями (директива section) Выполнение структурного блока одной нитью (директиваsingle) Задачи (директива task)28 октябряМосква, 2011Технология параллельного программирования OpenMP37 из 142Вычисление числа 1 (1+x )4.04.0dx = 20Мы можемаппроксимировать интегралкак сумму прямоугольников:2.0N F(x )x ii=00.028 октябряМосква, 20111.0XГде каждый прямоугольникимеет ширину x и высотуF(xi) в середине интервалаТехнология параллельного программирования OpenMP38 из 142Вычисление числа .
Последовательная программа#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;}28 октябряМосква, 2011Технология параллельного программирования OpenMP39 из 142Вычисление числа на OpenMPint main (){int n =100, 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;} октября28Москва, 2011Технология параллельного программирования OpenMP40 из 142Вычисление числа на OpenMP#include <stdio.h>#include <omp.h>int main (){int n =100, 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;}28 октябряМосква, 2011Технология параллельного программирования OpenMP41 из 142Распределение витков цикла#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• nowait28 октябряМосква, 2011Технология параллельного программирования OpenMP42 из 142Распределение витков циклаinit-expr : var = loop-invariant-expr1| integer-type var = loop-invariant-expr1| random-access-iterator-type var = loop-invariant-expr1| pointer-type var = loop-invariant-expr1test-expr:var relational-op loop-invariant-expr2| loop-invariant-expr2 relational-op varincr-expr: ++var| var++| --var| 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- expr28 октябряМосква, 2011relational-op: <| <=|>| >=var: signed or unsigned integer type| random access iterator type| pointer typeТехнология параллельного программирования OpenMP43 из 142Parallel 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 //}}28 октябряМосква, 2011Технология параллельного программирования OpenMP44 из 142Использование указателей в цикле (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++ ) - ошибка28 октябряМосква, 2011Технология параллельного программирования OpenMP45 из 142Вложенность конструкций распределения работы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);}}}28 октябряМосква, 2011Технология параллельного программирования OpenMP46 из 142Вложенность конструкций распределения работы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);}}}}28 октябряМосква, 2011Технология параллельного программирования OpenMP47 из 142Распределение витков многомерных циклов.
Клаузаcollapse (OpenMP 3.0)void work(int i, int j) {}void good_collapsing(int n){int i, j;#pragma omp parallel default(shared){#pragma omp for collapse (2)for (i=0; i<n; i++) {for (j=0; j < n; j++)work(i, j);}}}Клауза collapse:collapse (положительная целая константа)28 октябряМосква, 2011Технология параллельного программирования OpenMP48 из 142Распределение витков многомерных циклов. Клаузаcollapse (OpenMP 3.0)void work(int i, int j) {}void error_collapsing(int n){int i, j;#pragma omp parallel default(shared){#pragma omp for collapse (2)for (i=0; i<n; i++) {work_with_i (i);// Ошибкаfor (j=0; j < n; j++)work(i, j);}}}Клауза collapse может быть использована только для распределениявитков тесно-вложенных циклов.28 октябряМосква, 2011Технология параллельного программирования OpenMP49 из 142Распределение витков многомерных циклов.