OpenMP (по Бахтину) (Лекции)
Описание файла
Файл "OpenMP (по Бахтину)" внутри архива находится в папке "Лекции". PDF-файл из архива "Лекции", который расположен в категории "". Всё это находится в предмете "суперкомпьютерное моделирование и технологии" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Технология параллельного программированияOpenMPБахтин Владимир Александровичк.ф.-м.н., зав. сектором Института прикладнойматематики им М.В.Келдыша РАНассистент кафедры системного программированияфакультета вычислительной математики икибернетики Московского университета им. М.В.ЛомоносоваСодержание OpenMP – модель параллелизма по управлению Конструкции распределения работы Конструкции для синхронизации нитей Система поддержки выполнения OpenMP-программ.Переменные окружения, управляющие выполнениемOpenMP-программы Наиболее часто встречаемые ошибки в OpenMPпрограммах.
Функциональная отладка OpenMP-программ Отладка эффективности OpenMP-программ28 октябряМосква, 2011Технология параллельного программирования OpenMP2 из 142OpenMP- модель параллелизма по управлению Основные понятия Выполнение OpenMP-программы Модель памяти в OpenMP Классы переменных Параллельная область28 октябряМосква, 2011Технология параллельного программирования OpenMP3 из 142Обзор основных возможностей OpenMPC$OMP FLUSHC$OMP THREADPRIVATE(/ABC/)OpenMP:для написания#pragmaomp APIcriticalмногонитевых приложенийCALL CALL OMP_SET_NUM_THREADS(10) Множество директив компилятора,CALLOMP_TEST_LOCK(LCK)наборфункциибиблиотеки системыподдержки, переменныеокруженияC$OMPMASTERCALL OMP_INIT_LOCK (LCK)C$OMP ATOMIC Облегчает создание многонитиевыхC$OMP SINGLE PRIVATE(X)на Фортране,C и C++SETENVпрограммOMP_SCHEDULE“STATIC,4” Обобщение опыта созданияC$OMP PARALLEL DO ORDERED PRIVATE (A, B, C)C$OMP дляORDEREDпараллельных программSMP иDSM систем за последние 20 летC$OMP PARALLEL DO SHARED(A,B,C)C$OMP PARALLELREDUCTION (+: A, B)#pragma omp parallel for private(a, b)C$OMP PARALLEL COPYIN(/blk/)C$OMP BARRIERC$OMP DO LASTPRIVATE(XX)nthrds = OMP_GET_NUM_PROCS()28 октябряМосква, 2011C$OMP SECTIONSomp_set_lock(lck)Технология параллельного программирования OpenMP4 из 142Директивы и клаузыСпецификации параллелизма в OpenMP представляют собой директивывида:#pragma omp название-директивы[ клауза[ [,]клауза]...]Например:#pragma omp parallel default (none) shared (i,j)Исполняемые директивы: barrier taskwait flushОписательная директива: threadprivate28 октябряМосква, 2011Технология параллельного программирования OpenMP5 из 142Структурный блокДействие остальных директив распространяется на структурный блок:#pragma omp название-директивы[ клауза[ [,]клауза]...]{структурный блок}Структурный блок: блок кода с одной точкой входа и одной точкойвыхода.#pragma omp parallel#pragma omp parallel{{……mainloop: res[id] = f (id);mainloop: res[id] = f (id);if (res[id] != 0) goto mainloop;……}exit (0);if (res[id] != 0) goto mainloop;} Структурный блок28 октябряМосква, 2011Не структурный блокТехнология параллельного программирования OpenMP6 из 142Компиляция OpenMP-программыПроизводительКомпиляторОпция компиляцииGNUgcc-fopenmpXL C/C++ / FortranIBM-qsmp=ompSun MicrosystemsC/C++ / Fortran-xopenmpIntelC/C++ / Fortran-openmp/QopenmpPortland GroupC/C++ / Fortran-mpMicrosoftVisual Studio 2008 C++/openmp28 октябряМосква, 2011Технология параллельного программирования OpenMP7 из 142Условная компиляция OpenMP-программы#include <stdio.h>int main(){#ifdef _OPENMPprintf("Compiled by an OpenMP-compliant implementation.\n");#endifreturn 0;}В значении переменной _OPENMP зашифрован год и месяц (yyyymm)версии стандарта OpenMP, которую поддерживает компилятор.28 октябряМосква, 2011Технология параллельного программирования OpenMP8 из 142Использование функций поддержи выполнения OpenMPпрограмм (OpenMP API runtime library)#include <stdio.h>#include <omp.h> // Описаны прототипы всех функций и типовint main(){#pragma omp parallel{int id = omp_get_thread_num ();int numt = omp_get_num_threads ();printf(“Thread (%d) of (%d) threads alive\n”, id, numt);}return 0;}28 октябряМосква, 2011Технология параллельного программирования OpenMP9 из 142Выполнение OpenMP-программыFork-Join параллелизм: Главная (master) нить порождает группу (team) нитей по меренебходимости. Параллелизм добавляется инкрементально.Параллельные области28 октябряМосква, 2011Технология параллельного программирования OpenMP10 из 142Фрагмент программыint a, b, c, d, x, y;int *p, *q;int f(int *p, int *q);a = x * (x - 1);b = y * (y + 1);c = a * a + a * b + b * b;d = a * b * c;p = &a;q = &b;x = f(p, q);28 октябряМосква, 2011// переменные// указатели// прототип функции// a хранится в регистре// b хранится в регистре// будет использовано позднее// будет использовано позднее// получает адрес a// получает адрес b// вызов функции\Технология параллельного программирования OpenMP11 из 142Модель памяти в OpenMP001Нить001Нить001Нить28 октябряМосква, 2011Технология параллельного программирования OpenMP12 из 142Модель памяти в OpenMP… = i + 1;statici =int1 i = 0;#pragma omp flush (i)i=1#pragma omp flush (i)i =ii =i=+011;Нить001 1Нить001 0… = i + 2; // ?28 октябряМосква, 2011Технология параллельного программирования OpenMP13 из 142Консистентность памяти в OpenMPКорректная последовательность работы нитей с переменной:Нить0 записывает значение переменной - write(var)Нить0 выполняет операцию синхронизации – flush (var)Нить1 выполняет операцию синхронизации – flush (var)Нить1 читает значение переменной – read (var)Директива flush:#pragma omp flush [(list)] - для Си!$omp flush [(list)] - для Фортран28 октябряМосква, 2011Технология параллельного программирования OpenMP14 из 142Консистентность памяти в OpenMP1.
Если пересечение множеств переменных, указанных в операциях flush,выполняемых различными нитями не пустое, то результат выполненияопераций flush будет таким, как если бы эти операции выполнялись внекоторой последовательности (единой для всех нитей).2. Если пересечение множеств переменных, указанных в операциях flush,выполняемых одной нитью не пустое, то результат выполнения операцийflush, будет таким, как если бы эти операции выполнялись в порядке,определяемом программой.3. Если пересечение множеств переменных, указанных в операциях flush,пустое, то операции flush могут выполняться независимо (в любомпорядке).28 октябряМосква, 2011Технология параллельного программирования OpenMP15 из 142Директива 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.28 октябряМосква, 2011Технология параллельного программирования OpenMP16 из 142Классы переменных В модели программирования с разделяемой памятью:Большинство переменных по умолчанию считаются shared Глобальные переменные совместно используются всеми нитями(shared) :• Фортран: COMMON блоки, SAVE переменные, MODULEпеременные• Си: file scope, static• Динамически выделяемая память (ALLOCATE, malloc, new) Но не все переменные являются разделяемыми ...• Стековые переменные в подпрограммах (функциях),вызываемых из параллельного региона, являются private.• Переменные объявленные внутри блока операторовпараллельного региона являются приватными.• Счетчики циклов витки которых распределяются междунитями при помощи конструкций for и parallel for.•28 октябряМосква, 2011Технология параллельного программирования OpenMP17 из 142Классы переменныхdouble Array1[100];int main() {int Array2[100];#pragma omp parallel{int iam = omp_get_thread_num ();work(Array2);}printf(“%d\n”, Array2[0]);}TempArray, iamArray1, Array2,countTempArray, iamextern double Array1[10];void work(int *Array) {double TempArray[10];static int count;...}Array1, Array2,countTempArray, iam28 октябряМосква, 2011Технология параллельного программирования OpenMP18 из 142Классы переменныхМожно изменить класс переменной при помощи конструкций: shared (список переменных) private (список переменных) firstprivate (список переменных) lastprivate (список переменных) threadprivate (список переменных) default (private | shared | none)28 октябряМосква, 2011Технология параллельного программирования OpenMP19 из 142Конструкция privateКонструкция «private(var)» создает локальную копию переменной«var» в каждой из нитей.• Значение переменной не инициализировано• Приватная копия не связана с оригинальной переменной• В OpenMP 2.5 значение переменной «var» не определенопосле завершения параллельной конструкцииsum = -1.0;#pragma omp parallel for private (i,j,sum)for (i=0; i< m; i++){sum = 0.0;for (j=0; j< n; j++)sum +=b[i][j]*c[j];a[i] = sum;}printf (“sum=%f\n", sum);28 октябряМосква, 2011Технология параллельного программирования OpenMP20 из 142Конструкция firstprivate«firstprivate» является специальным случаем «private»• Инициализирует каждую приватную копию соответствующимзначением из главной (master) нити.BOOL FirstTime=TRUE;#pragma omp parallel for firstprivate(FirstTime)for (row=0; row<height; row++){if (FirstTime == TRUE) { FirstTime = FALSE; FirstWork (row); }AnotherWork (row);}28 октябряМосква, 2011Технология параллельного программирования OpenMP21 из 142Конструкция lastprivatelastprivate передает значение приватной переменной, посчитанной напоследней итерации в глобальную переменную.int i;#pragma omp parallel{#pragma omp for lastprivate(i)for (i=0; i<n-1; i++)a[i] = b[i] + b[i+1];}a[i]=b[i]; /*i == n-1*/28 октябряМосква, 2011Технология параллельного программирования OpenMP22 из 142Директива threadprivateОтличается от применения конструкции private: private скрывает глобальные переменные threadprivate – переменные сохраняют глобальную областьвидимости внутри каждой нити#pragma omp threadprivate (Var)Var = 1Var = 228 октябряМосква, 2011… = VarЕсли количество нитейне изменилось, токаждая нить получитзначение, посчитанноев предыдущейпараллельной области.… = VarТехнология параллельного программирования OpenMP23 из 142Конструкция defaultМеняет класс переменной по умолчанию: default (shared) – действует по умолчанию default (private) – есть только в Fortran default (firstprivate) – есть только в Fortran OpenMP 3.1 default (none) – требует определить класс для каждой переменнойitotal = 100itotal = 100#pragma omp parallelprivate(np,each)#pragma omp parallel default(none)private(np,each) shared (itotal){{np = omp_get_num_threads()np = omp_get_num_threads()each = itotal/npeach = itotal/np………………}}28 октябряМосква, 2011Технология параллельного программирования OpenMP24 из 142Параллельная область (директива parallel)#pragma omp parallel [ клауза[ [, ] клауза] ...]структурный блокгде клауза одна из : default(shared | none) private(list) firstprivate(list) shared(list) reduction(operator: list) if(scalar-expression) num_threads(integer-expression) copyin(list)28 октябряМосква, 2011Технология параллельного программирования OpenMP25 из 142Вычисление числа 1 (1+x )4.04.0dx = 20Мы можемаппроксимировать интегралкак сумму прямоугольников:2.0N F(x )x ii=00.028 октябряМосква, 20111.0XГде каждый прямоугольникимеет ширину x и высотуF(xi) в середине интервалаТехнология параллельного программирования OpenMP26 из 142Вычисление числа .