MSU2011_MPI_OpenMP (811099), страница 3
Текст из файла (страница 3)
Новгород,20112x44x28x11x162x84x4Гибридная модель программирования MPI/OpenMP8x216x155 из 125Тест BT-MZ (класс A) на IBM eServer pSeries 690 Regattaзоны от 13 x 13 x 16 и до 58 x 58 x 162 процессора4 процессора100,0090,0045,0089,5788,5384,2438,1340,0078,7880,0041,75 41,5540,3939,8336,5435,0070,0030,0060,0025,0050,0020,0040,0030,0015,0020,0010,0010,005,000,001x20,002x11x48 процессоровMPI40,0016 процессоровDVM32,6035,7335,0030,4630,0030,0025,0023,25 22,9320,7321,7521,1920,0019,0920,0015,8915,3215,0013,7315,0013,2011,1616,8212,4710,5710,0010,005,005,000,000,001x821 февраляМосква, 20114x135,0034,6825,002x22x44x28x11x162x84x4Гибридная модель программирования MPI/OpenMP8x216x156 из 125Расчет дозвукового обтекания летательного аппарата21 февраляМосква, 2011Задача810 областейсредняязагрузкаMaxзагрузка75 процессоров1925819296128 процессоров1128411648256 процессоров564211648384 процессоров376111648512 процессоров282111648Гибридная модель программирования MPI/OpenMP57 из 125Преимущества гибридной модели MPI/OpenMPЛиквидация или сокращение дублирования данных в памятиузла.Дополнительный уровень параллелизма на OpenMPреализовать проще, чем на MPI (например, когда впрограмме есть два уровня параллелизма – параллелизммежду подзадачами и параллелизм внутри подзадачи).Улучшение балансировки на многоблочных задачах применьшей трудоемкости реализации еще одного уровняпараллелизма.21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP58 из 125Содержание Современные направления развития параллельныхвычислительных систем Гибридная модель MPI/OpenMP OpenMP – модель параллелизма по управлению21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP59 из 125История OpenMP199820022005OpenMPC/C++ 1.0OpenMPC/C++ 2.0OpenMPF/C/C++ 2.5OpenMPFortran 1.0OpenMPFortran 1.1199719992008OpenMPF/C/C++ 3.0OpenMPFortran 2.0200021 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP60 из 125OpenMP Architecture Review BoardAMDCrayFujitsuHPIBMIntelNECThe Portland Group, Inc.SGISunMicrosoftASC/LLNLcOMPunityEPCCNASARWTH Aachen University21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP61 из 125Компиляторы, поддеживающие OpenMPOpenMP 3.0: Intel 11.0: Linux, Windows and MacOS Sun Studio Express 11/08: Linux and Solaris PGI 8.0: Linux and Windows IBM 10.1: Linux and AIX GNU gcc (4.4.0)Предыдущие версии OpenMP: Absoft Pro FortranMP Lahey/Fujitsu Fortran 95 PathScale HP Microsoft Visual Studio 2008 C++21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP62 из 125Обзор основных возможностей OpenMPC$OMP FLUSHC$OMP THREADPRIVATE(/ABC/)#pragma omp criticalCALL CALL OMP_SET_NUM_THREADS(10)C$OMP PARALLEL DO SHARED(A,B,C)CALL OMP_INIT_LOCK (LCK)C$OMP SINGLE PRIVATE(X)CALL OMP_TEST_LOCK(LCK)C$OMP ATOMICSETENV OMP_SCHEDULE “STATIC,4”C$OMP PARALLEL DO ORDERED PRIVATE (A, B, C)C$OMP PARALLELREDUCTION (+: A, B)#pragma omp parallel for private(a, b)C$OMP PARALLEL COPYIN(/blk/)C$OMP ORDEREDC$OMP SECTIONSC$OMP BARRIERC$OMP DO LASTPRIVATE(XX)nthrds = OMP_GET_NUM_PROCS()21 февраляМосква, 2011C$OMP MASTERomp_set_lock(lck)Гибридная модель программирования MPI/OpenMP63 из 125Директивы и клаузыСпецификации параллелизма в OpenMP представляют собой директивывида:#pragma omp название-директивы[ клауза[ [,]клауза]...]Например:#pragma omp parallel default (none) shared (i,j)Исполняемые директивы:barriertaskwaitflushОписательная директива:threadprivate21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP64 из 125Структурный блокДействие остальных директив распространяется на структурный блок:#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;} Структурный блок21 февраляМосква, 2011Не структурный блокГибридная модель программирования MPI/OpenMP65 из 125Параллельная область(директива 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)21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP66 из 125Модель памяти в OpenMP001Нить001Нить001Нить21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP67 из 125Модель памяти в 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; // ?21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP68 из 125Консистентность памяти в OpenMPКорректная последовательность работы нитей с переменной:Нить0 записывает значение переменной - write(var)Нить0 выполняет операцию синхронизации – flush (var)Нить1 выполняет операцию синхронизации – flush (var)Нить1 читает значение переменной – read (var)Директива flush:#pragma omp flush [(list)] - для Си!$omp flush [(list)] - для Фортран21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP69 из 125Консистентность памяти в OpenMP1.
Если пересечение множеств переменных, указанных в операциях flush,выполняемых различными нитями не пустое, то результат выполненияопераций flush будет таким, как если бы эти операции выполнялись внекоторой последовательности (единой для всех нитей).2. Если пересечение множеств переменных, указанных в операциях flush,выполняемых одной нитью не пустое, то результат выполнения операцийflush, будет таким, как если бы эти операции выполнялись в порядке,определяемом программой.3.
Если пересечение множеств переменных, указанных в операциях flush,пустое, то операции flush могут выполняться независимо (в любомпорядке).21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP70 из 125Классы переменных В модели программирования с разделяемой памятью:• Большинство переменных по умолчанию считаются SHARED Глобальные переменные совместно используются всеми нитями(shared) :• Фортран: COMMON блоки, SAVE переменные, MODULEпеременные• Си: file scope, static• Динамически выделяемая память (ALLOCATE, malloc, new) Но не все переменные являются разделяемыми ...• Стековые переменные в подпрограммах (функциях),вызываемых из параллельного региона, являются PRIVATE.• Переменные, объявленные внутри блока операторовпараллельного региона, являются приватными.• Счетчики циклов, витки которых распределяются междунитями при помощи конструкций for и parallel for.21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP71 из 125Модель памяти в OpenMPdouble Array1[100];int main() {int Array2[100];#pragma omp parallelwork(Array2);printf(“%d\n”, Array2[0]);}extern double Array1[10];void work(int *Array) {double TempArray[10];static int count;...}TempArrayArray1, Array2,countTempArrayArray1, Array2,countTempArray21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP72 из 125Классы переменныхМожно изменить класс переменной при помощи конструкций: SHARED (список переменных) PRIVATE (список переменных) FIRSTPRIVATE (список переменных) LASTPRIVATE (список переменных) THREADPRIVATE (список переменных) DEFAULT (PRIVATE | SHARED | NONE)21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP73 из 125Конструкция PRIVATEКонструкция «private(var)» создает локальную копию переменной «var» вкаждой из нитей.Значение переменной не инициализированоПриватная копия не связана с оригинальной переменнойВ OpenMP 2.5 значение переменной «var» не определено после завершенияпараллельной конструкцииvoid wrong() {int tmp = 0;#pragma omp for private(tmp)for (int j = 0; j < 1000; ++j)tmp += j;printf(“%d\n”, tmp);}tmp не инициализированаtmp: 0 в 3.0,не определено в 2.521 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP74 из 125Конструкция FIRSTPRIVATE«Firstprivate» является специальным случаем «private».Инициализирует каждую приватную копию соответствующим значениемиз главной (master) нити.void wrong() {int tmp = 0;#pragma omp for firstprivate(tmp)for (int j = 0; j < 1000; ++j)tmp += j;printf(“%d\n”, tmp);}tmp инициализирована 0tmp: 0 в 3.0,не определено в 2.521 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP75 из 125Конструкция LASTPRIVATELastprivate передает значение приватной переменной, посчитанной напоследней итерации в глобальную переменную.void almost_right () {int tmp = 0;#pragma omp for firstprivate(tmp) lastprivate (tmp)for (int j = 0; j < 1000; ++j)tmp инициализирована 0tmp += j;printf(“%d\n”, tmp);}переменная tmp получит значение,посчитанное на последней итерации(j=999)21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP76 из 125Директива THREADPRIVATEОтличается от применения конструкции PRIVATE: PRIVATE скрывает глобальные переменные THREADPRIVATE – переменные сохраняют глобальную областьвидимости внутри каждой нити#pragma omp threadprivate (Var)Если количество нитейне изменилось, токаждая нить получитVar = 1… = Varзначение, посчитанноев предыдущейпараллельной области.Var = 221 февраляМосква, 2011… = VarГибридная модель программирования MPI/OpenMP77 из 125Конструкция DEFAULTМеняет класс переменной по умолчанию: DEFAULT (SHARED) – действует по умолчанию DEFAULT (PRIVATE) – есть только в Fortran 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………………}}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP78 из 125Параллельная область(директива 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)21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP79 из 125Вычисление числа .Последовательная программа.#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;}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP80 из 125Вычисление числа .#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;} февраля21Гибридная модель программирования MPI/OpenMPМосква, 201181 из 125Вычисление числа .
Клауза 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;}21 февраляГибридная модель программирования MPI/OpenMPМосква, 201182 из 125Клауза reductionreduction(operator:list) Внутри паралельной области для каждой переменной из списка list создаетсякопия этой переменной. Эта переменная инициализируется в соответствии соператором operator (например, 0 для «+»). Для каждой нити компилятор заменяет в параллельной области обращения кредукционной переменной на обращения к созданной копии. По завершении выполнения параллельной области осуществляетсяобъединение полученных результатов.21 февраляМосква, 2011ОператорНачальное значение+0*1-0&~0|0^0&&1||0Гибридная модель программирования MPI/OpenMP83 из 125Клауза 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;}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP84 из 125Клауза 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();21}февраляМосква, 2011Гибридная модель программирования MPI/OpenMP85 из 125Конструкции распределения работы Распределение витков циклов (директива for) Выполнение структурного блока одной нитью (директиваsingle)21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP86 из 125Вычисление числа .Последовательная программа.#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;}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP87 из 125Вычисление числа на 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;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;} февраля21Гибридная модель программирования MPI/OpenMPМосква, 201188 из 125Вычисление числа на 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;}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP89 из 125Распределение витков цикла#pragma omp for [клауза[[,]клауза] ...