МОЛОДЕЖНАЯ ШКОЛА « Суперкомпьютерные технологии в науке, промышленности и образовании» ННГУ им. Н.И. Лобачевского, Нижний Новгород, 26-31 октября 2009.

Презентация:



Advertisements
Похожие презентации
Интернет Университет Суперкомпьютерных технологий Система поддержки выполнения OpenMP- программ. Переменные окружения, управляющие выполнением OpenMP-
Advertisements

Интернет Университет Суперкомпьютерных технологий Конструкции для синхронизации нитей Учебный курс Параллельное программирование с OpenMP Бахтин В.А.,
Интернет Университет Суперкомпьютерных технологий Отладка эффективности OpenMP- программ. Учебный курс Параллельное программирование с OpenMP Бахтин В.А.,
Интернет Университет Суперкомпьютерных технологий Основные понятия Учебный курс Параллельное программирование с OpenMP Бахтин В.А., кандидат физ.-мат.
Отладка эффективности OpenMP- программ. Параллельное программирование с OpenMP Бахтин Владимир Александрович Ассистент кафедры системного программированния.
Интернет Университет Суперкомпьютерных технологий Основные понятия Учебный курс Параллельное программирование с OpenMP Бахтин В.А., кандидат физ.-мат.
Интернет Университет Суперкомпьютерных технологий Конструкции для синхронизации нитей. Система поддержки выполнения OpenMP- программ. Учебный курс Параллельное.
Приложение 1 к решению Совета депутатов города Новосибирска от _____________ ______ Масштаб 1 : 5000.
Наиболее часто встречаемые ошибки в OpenMP-программах. Функциональная отладка OpenMP-программ Технология параллельного программирования OpenMP Бахтин Владимир.
Наиболее часто встречаемые ошибки в OpenMP-программах. Функциональная отладка OpenMP-программ Параллельное программирование с OpenMP Бахтин Владимир Александрович.
Интернет Университет Суперкомпьютерных технологий Лекция 2: OpenMP - модель параллелизма по управлению Учебный курс Параллельное программирование с OpenMP.
Приложение 1 к решению Совета депутатов города Новосибирска от Масштаб 1 : 5000.
Интернет Университет Суперкомпьютерных технологий Лекция 2: OpenMP - модель параллелизма по управлению Учебный курс Параллельное программирование с OpenMP.
МГУ им. М.В. Ломоносова, Москва, 21 октября 2011г. КОНСОРЦИУМ УНИВЕРСИТЕТОВ РОССИИ Курс: «Технология параллельного программирования OpenMP» Лабораторная.
Многопоточное программирование в OpenMP Киреев Сергей ИВМиМГ.
Технология параллельного программирования OpenMP Шальнов Евгений Вадимович Автор слайдов: Бахтин Владимир Александрович.
Интернет Университет Суперкомпьютерных технологий Отладка эффективности OpenMP- программ. Параллельное программирование с OpenMP Бахтин Владимир Александрович.
Отладка эффективности OpenMP- программ. Технология параллельного программирования OpenMP Бахтин Владимир Александрович Ассистент кафедры системного программированния.
OpenMP. Различие между тредами и процессами ПроцессыТреды.
Интернет Университет Суперкомпьютерных технологий Конструкции для синхронизации нитей. Система поддержки выполнения OpenMP- программ. Учебный курс Параллельное.
Транксрипт:

МОЛОДЕЖНАЯ ШКОЛА « Суперкомпьютерные технологии в науке, промышленности и образовании» ННГУ им. Н.И. Лобачевского, Нижний Новгород, октября 2009 г. КОНСОРЦИУМ УНИВЕРСИТЕТОВ РОССИИ Секция: «Параллельное программирование в системах с общей памятью» Курс: «Технологии параллельного программирования: OpenMP» Крюков Виктор Алексеевич Д.ф.-м.н., зав. отделом Института прикладной математики им. М.В. Келдыша РАН, профессор Московского государственного университета им. М.В. Ломоносова. Бахтин Владимир Александрович К.ф.-м.н., зав. сектором Института прикладной математики им М.В.Келдыша РАН

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 2 из 209 Содержание Современные направления развития параллельных вычислительных систем OpenMP – модель параллелизма по управлению Конструкции распределения работы Конструкции для синхронизации нитей Система поддержки выполнения OpenMP-программ. Переменные окружения, управляющие выполнением OpenMP-программы Наиболее часто встречаемые ошибки в OpenMP- программах. Функциональная отладка OpenMP-программ Отладка эффективности OpenMP-программ Использование OpenMP на кластере

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 3 из 209 Современные направления развития параллельных вычислительных систем Тенденции развития современных процессоров Существующие подходы для создания параллельных программ Что такое OpenMP?

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 4 из 209 Тенденции развития современных процессоров В течение нескольких десятилетий развитие ЭВМ сопровождалось удвоением их быстродействия каждые года. Это обеспечивалось и повышением тактовой частоты и совершенствованием архитектуры (параллельное и конвейерное выполнение команд). Узким местом стала оперативная память. Знаменитый закон Мура, так хорошо работающий для процессоров, совершенно не применим для памяти, где скорости доступа удваиваются в лучшем случае каждые 6 лет. Совершенствовались системы кэш-памяти, увеличивался объем, усложнялись алгоритмы ее использования. Для процессора Intel Itanium: Latency to L1: 1-2 cycles Latency to L2: cycles Latency to L3: cycles Latency to memory: 180 – 225 cycles Важным параметром становится - GUPS (Giga Updates Per Second)

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 5 из 209 Время Тенденции развития современных процессоров В П В П В П В П В П В П Поток Время В П В П В П Поток 1 В П В П В П В П В П В П В П В П В П Поток 2 Поток 3 Поток 4 В - вычисления П - доступ к памяти Chip MultiThreading увеличили производительность процессора в 2 раза Поток или нить (по- английски thread) – это легковесный процесс, имеющий с другими потоками общие ресурсы, включая общую оперативную память.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 6 из 209 енденции развития современных процессоров Суперкомпьютер СКИФ МГУ «Чебышев» Пиковая производительность - 60 TFlop/s Число процессоров/ядер в системе / 5000 Производительность на Linpack TFlop/s (78.4% от пиковой) Номинальное энергопотребление компьютера кВт Энергопотребление комплекса кВт Важным параметром становится – Power Efficency (Megaflops/watt) Как добиться максимальной производительности на Ватт => Chip MultiProcessing, многоядерность. Тенденции развития современных процессоров

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 7 из 209 Six-Core AMD Opteron 6 ядер встроенный контроллер памяти (2 канала памяти DDR2 800 МГц ) 3 канала «точка-точка» с использованием HyperTransort Тенденции развития современных процессоров

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 8 из 209 Intel Core i7 (архитектура Nehalem ) 4 ядра 8 потоков с технологией Intel Hyper-Threading 8 МБ кэш-памяти Intel Smart Cache встроенный контроллер памяти (3 канала памяти DDR МГц ) технология Intel QuickPath Interconnect Тенденции развития современных процессоров

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 9 из 209 SUN UltraSPARC T2 Processor (Niagara 2) 8 ядер 64 потоков 4 контроллера памяти потребляемая мощность – Ватт встроенный котроллер 2x10 Gigabit Ethernet Тенденции развития современных процессоров

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 10 из 209 Темпы уменьшения латентности памяти гораздо ниже темпов ускорения процессоров + прогресс в технологии изготовления кристаллов => CMT (Chip MultiThreading) Опережающий рост потребления энергии при росте тактовой частоты + прогресс в технологии изготовления кристаллов => CMP (Chip MultiProcessing, многоядерность) И то и другое требует более глубокого распараллеливания для эффективного использования аппаратуры Тенденции развития современных процессоров

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 11 из 209 Существующие подходы для создания параллельных программ Автоматическое распараллеливание Библиотеки нитей Win32 API POSIX Библиотеки передачи сообщений MPI OpenMP

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 12 из 209 Вычисление числа 4.0 (1+x 2 ) dx = 0 1 F(x i ) x i = 0 N Мы можем аппроксимировать интеграл как сумму прямоугольников: Где каждый прямоугольник имеет ширину x и высоту F(x i ) в середине интервала F(x) = 4.0/(1+x 2 ) X 0.0

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 13 из 209 #include int main () { int n =100000, i; double pi, h, sum, x; h = 1.0 / (double) n; sum = 0.0; for (i = 1; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 14 из 209 Автоматическое распараллеливание Polaris, CAPO, WPP, SUIF, VAST/Parallel, OSCAR, Intel/OpenMP, ParaWise, ОРС, САПФОР icc -parallel pi.c pi.c(8): (col. 5) remark: LOOP WAS AUTO-PARALLELIZED. pi.c(8): (col. 5) remark: LOOP WAS VECTORIZED. В общем случае, автоматическое распараллеливание затруднено: косвенная индексация (A[B[i]]); указатели (ассоциация по памяти); сложный межпроцедурный анализ; циклы с зависимостью по данным, как правило не распараллеливаются.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 15 из 209 #include "mpi.h" #include int main (int argc, char *argv[]) { int n =100000, myid, numprocs, i; double mypi, pi, h, sum, x; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); h = 1.0 / (double) n; sum = 0.0; Вычисление числа с использованием MPI Н. Новгород, 2009

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 16 из 209 for (i = myid + 1; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 17 из 209 #include #define NUM_THREADS 2 CRITICAL_SECTION hCriticalSection; double pi = 0.0; int n =100000; void main () { int i, threadArg[NUM_THREADS]; DWORD threadID; HANDLE threadHandles[NUM_THREADS]; for(i=0; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 18 из 209 void Pi (void *arg) { int i, start; double h, sum, x; h = 1.0 / (double) n; sum = 0.0; start = *(int *) arg; for (i=start; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 19 из 209 #include int main () { int n =100000, i; double pi, h, sum, x; h = 1.0 / (double) n; sum = 0.0; #pragma omp parallel for reduction(+:sum) private(x) for (i = 1; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 20 из 209 Достоинства использования OpenMP вместо MPI для многоядерных процессоров Возможность инкрементального распараллеливания Упрощение программирования и эффективность на нерегулярных вычислениях, проводимых над общими данными Ликвидация дублирования данных в памяти, свойственного MPI- программам Объем памяти пропорционален быстродействию процессора. В последние годы увеличение производительности процессора достигается удвоением числа ядер, при этом частота каждого ядра снижается. Наблюдается тенденция к сокращению объема оперативной памяти, приходящейся на одно ядро. Присущая OpenMP экономия памяти становится очень важна. Наличие локальных и/или разделяемых ядрами КЭШей будут учитываться при оптимизации OpenMP-программ компиляторами, что не могут делать компиляторы с последовательных языков для MPI-процессов.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 21 из 209 Достоинства использования OpenMP вместо MPI для многоядерных процессоров Процессоры Intel® Xeon® серии 5000 X cores X cores 3500 MHz3400 MHz Процессоры Intel® Xeon® серии N 2 cores X cores X cores 3500 MHz2930 MHz2660 MHz Процессоры AMD Opteron AMD Opteron 8393 SE 4 cores 8439 SE 6 cores Clock Speed3100 MHz2800 MHz Caсhe L36144KB

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 22 из 209 Достоинства использования OpenMP вместо MPI для многоядерных процессоров #define Max(a,b) ((a)>(b)?(a):(b)) #define L 8 #define ITMAX 20 int i,j,it,k; double eps, MAXEPS = 0.5; double A[L][L], B[L][L]; int main(int an, char **as) { for (it=1; it < ITMAX; it++) { eps= 0.; for(i=1; j

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 23 из 209 Достоинства использования OpenMP вместо MPI для многоядерных процессоров Для получения программы, способной работать на кластере, необходимо распределить данные и вычисления между процессорами. После распределения данных требуется организовать межпроцессорные взаимодействия. В данном случае - для доступа к удаленным данным используются теневые грани, которые являются источником дублирования данных.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 24 из 209 История OpenMP OpenMP Fortran 1.1 OpenMP C/C OpenMP Fortran 2.0 OpenMP Fortran 2.0 OpenMP C/C OpenMP C/C OpenMP Fortran OpenMP F/C/C OpenMP F/C/C OpenMP F/C/C OpenMP F/C/C

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 25 из 209 OpenMP Architecture Review Board AMD Cray Fujitsu HP IBM Intel NEC The Portland Group, Inc. SGI Sun Microsoft ASC/LLNL cOMPunity EPCC NASA RWTH Aachen University

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 26 из 209 Компиляторы, поддеживающие OpenMP OpenMP 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++

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 27 из 209 Содержание Современные направления развития параллельных вычислительных систем OpenMP – модель параллелизма по управлению Конструкции распределения работы Конструкции для синхронизации нитей Система поддержки выполнения OpenMP-программ. Переменные окружения, управляющие выполнением OpenMP-программы Наиболее часто встречаемые ошибки в OpenMP- программах. Функциональная отладка OpenMP-программ Отладка эффективности OpenMP-программ Использование OpenMP на кластере

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 28 из 209 OpenMP– модель параллелизма по управлению Основные понятия Выполнение OpenMP-программы Модели консистентности памяти Модель памяти в OpenMP Классы переменных Параллельная область

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 29 из 209 Обзор основных возможностей OpenMP omp_set_lock(lck) #pragma omp parallel for private(a, b) #pragma omp critical C$OMP PARALLEL DO SHARED(A,B,C) C$OMP PARALLEL REDUCTION (+: A, B) CALL OMP_INIT_LOCK (LCK) CALL OMP_TEST_LOCK(LCK) SETENV OMP_SCHEDULE STATIC,4 CALL CALL OMP_SET_NUM_THREADS(10) C$OMP DO LASTPRIVATE(XX) C$OMP ORDERED C$OMP SINGLE PRIVATE(X) C$OMP SECTIONS C$OMP MASTER C$OMP ATOMIC C$OMP FLUSH C$OMP PARALLEL DO ORDERED PRIVATE (A, B, C) C$OMP THREADPRIVATE(/ABC/) C$OMP PARALLEL COPYIN(/blk/) nthrds = OMP_GET_NUM_PROCS() C$OMP BARRIER OpenMP: API для написания многонитевых приложений Множество директив компилятора, набор функции библиотеки системы поддержки, переменные окружения Облегчает создание многонитиевых программ на Фортране, C и C++ Обобщение опыта создания параллельных программ для SMP и DSM систем за последние 20 лет OpenMP: API для написания многонитевых приложений Множество директив компилятора, набор функции библиотеки системы поддержки, переменные окружения Облегчает создание многонитиевых программ на Фортране, C и C++ Обобщение опыта создания параллельных программ для SMP и DSM систем за последние 20 лет

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 30 из 209 Директивы и клаузы Спецификации параллелизма в OpenMP представляют собой директивы вида: #pragma omp название-директивы[ клауза[ [,]клауза]...] Например: #pragma omp parallel default (none) shared (i,j) Исполняемые директивы: barrier taskwait flush Описательная директива: threadprivate

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 31 из 209 Структурный блок Действие остальных директив распространяется на структурный блок: #pragma omp название-директивы[ клауза[ [,]клауза]...] { структурный блок } Структурный блок: блок кода с одной точкой входа и одной точкой выхода. #pragma omp parallel { … mainloop: res[id] = f (id); if (res[id] != 0) goto mainloop; … exit (0); } Структурный блок #pragma omp parallel { … mainloop: res[id] = f (id); … } if (res[id] != 0) goto mainloop; Не структурный блок

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 32 из 209 Компиляция OpenMP-программы ПроизводительКомпиляторОпция компиляции GNUgcc-fopenmp IBM XL C/C++ / Fortran -qsmp=omp Sun MicrosystemsC/C++ / Fortran-xopenmp IntelC/C++ / Fortran -openmp /Qopenmp Portland GroupC/C++ / Fortran-mp MicrosoftVisual Studio 2008 C++/openmp

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 33 из 209 Условная компиляция OpenMP-программы #include int main() { #ifdef _OPENMP printf("Compiled by an OpenMP-compliant implementation.\n"); #endif return 0; } В значении переменной _OPENMP зашифрован год и месяц (yyyymm) версии стандарта OpenMP, которую поддерживает компилятор.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 34 из 209 Использование функций поддержи выполнения OpenMP-программ (OpenMP API runtime library) #include #include // Описаны прототипы всех функций и типов 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; }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 35 из 209 #include int omp_get_num_threads(void) { return 1; } int omp_get_thread_num(void) { return 0; } 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; } Использование функций поддержи выполнения OpenMP-программ (OpenMP API runtime library) В стандарте OpenMP описаны «заглушки» для всех функций библиотеки поддержки – требуются при компиляции данной программы компилятором без поддержки OpenMP.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 36 из 209 Выполнение OpenMP-программы Fork-Join параллелизм: Главная (master) нить порождает группу (team) нитей по мере небходимости. Параллелизм добавляется инкрементально. Параллельные области

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 37 из 209 Параллельная область (директива 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)

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 38 из 209 Когерентность и консистентность памяти P0:P0:W(x)aR(y)b Время P1: W(y)bR(y)bR(x)aW(x)b

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 39 из 209 Сеть передачи данных Производитель MPI latency, в микросекундах Bandwidth per link (unidirectional, MB/s) NUMAlink 4 (Altix)SGI13400 RapidArray (XD1)Cray QsNet IIQuadrics2900 InfinibandVoltaire High Performance Switch IBM51000 Myrinet XP2Myricom SP Switch 2IBM18500 EthernetVarious

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 40 из 209 Модели консистентности памяти Модель консистентности представляет собой некоторый договор между программами и памятью, в котором указывается, что при соблюдении программами определенных правил работа памяти будет корректной, если же требования к программе будут нарушены, то память не гарантирует правильность выполнения операций чтения/записи. Далее рассматриваются основные модели консистентности.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 41 из 209 Строгая консистентность Операция чтения ячейки памяти с адресом X должна возвращать значение, записанное самой последней операцией записи с адресом X, называется моделью строгой консистентности. a) строгая консистентность б) нестрогая консистентность P0:P0:W(x)a Время P1:R(x)a P0:P0:W(x)a Время P1:R(x)NIL R(x)a

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 42 из 209 Последовательная консистентность Впервые определил Lamport в 1979 г. в контексте совместно используемой памяти для мультипроцессорных систем. Результат выполнения должен быть тот-же, как если бы операторы всех процессоров выполнялись бы в некоторой последовательности, причем операции каждого отдельного процесса выполнялись бы в порядке, определяемой его программой. Последовательная консистентность не гарантирует, что операция чтения возвратит значение, записанное другим процессом наносекундой или даже минутой раньше, в этой модели только точно гарантируется, что все процессы знают последовательность всех записей в память.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 43 из 209 P1W(x)a P2W(x)b P3R(x)bR(x)a P4R(x)bR(x)a а) удовлетворяет последовательной консистентности б) не удовлетворяет последовательной консистентности P1W(x)a P2W(x)b P3R(x)bR(x)a P4R(x)aR(x)b Последовательная консистентность

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 44 из 209 P1P2P3 x=1; Print (y,z); y=1; Print(x,z); z=1; Print (x,y); Результат повторного выполнения параллельной программы в системе с последовательной консистентностью может не совпадать с результатом предыдущего выполнения этой же программы, если в программе нет регулирования операций доступа к памяти с помощью механизмов синхронизации. x=1; y=1; Print (y,z);y=1;z=1;x=1; y=1;Print(x,z);Print (x,y);z=1; Print(x,z);Print (y,z);Print(x,z); z=1; x=1;Print (y,z); Print (x,y); Print (y,z);Print (x,y); Последовательная консистентность

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 45 из 209 Причинная консистентность Предположим, что процесс P1 модифицировал переменную x, затем процесс P2 прочитал x и модифицировал y. В этом случае модификация x и модификация y потенциально причинно зависимы, так как новое значение y могло зависеть от прочитанного значения переменной x. С другой стороны, если два процесса одновременно изменяют значения различных переменных, то между этими событиями нет причинной связи. Операции, которые причинно не зависят друг от друга называются параллельными. Причинная модель консистентности памяти определяется следующим условием: Последовательность операций записи, которые потенциально причинно зависимы, должна наблюдаться всеми процессами системы одинаково, параллельные операции записи могут наблюдаться разными процессами в разном порядке.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 46 из 209 P1W(x)a P2R(x)aW(x)b P3R(x)bR(x)a P4R(x)aR(x)b Нарушение модели причинной консистентности P1W(x)aW(x)c P2R(x)aW(x)b P3R(x)aR(x)cR(x)b P4R(x)aR(x)bR(x)c Корректная последовательность для модели причинной консистентности Определение потенциальной причинной зависимости может осуществляться компилятором посредством анализа зависимости операторов программы по данным. Причинная консистентность

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 47 из 209 PRAM (Pipelined RAM) и процессорная консистентность PRAM: Операции записи, выполняемые одним процессором, видны всем остальным процессорам в том порядке, в каком они выполнялись, но операции записи, выполняемые разными процессорами, могут быть видны в произвольном порядке. Записи выполняемые одним процессором могут быть конвейеризованы: выполнение операций с общей памятью можно начинать не дожидаясь завершения предыдущих операций записи в память. Процессорная: PRAM + когерентность памяти. Для каждой переменной X есть общее согласие относительно порядка, в котором процессоры модифицируют эту переменную, операции записи в разные переменные - параллельны. Таким образом, к упорядочиванию записей каждого процессора добавляется упорядочивание записей в переменные или группы.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 48 из 209 Слабая консистентность (weak consistency) Пусть процесс в критической секции циклически читает и записывает значение некоторых переменных. Даже, если остальные процессоры и не пытаются обращаться к этим переменным до выхода первого процесса из критической секции, для удовлетворения требований рассматриваемых ранее моделей консистентности они должны видеть все записи первого процессора в порядке их выполнения, что, естественно, совершенно не нужно. Наилучшее решение в такой ситуации - это позволить первому процессу завершить выполнение критической секции и, только после этого, переслать остальным процессам значения модифицированных переменных, не заботясь о пересылке промежуточных результатов. Модель слабой консистентности, основана на выделении среди переменных специальных синхронизационных переменных и описывается следующими правилами: 1.Доступ к синхронизационным переменным определяется моделью последовательной консистентности; 2.Доступ к синхронизационным переменным запрещен (задерживается), пока не выполнены все предыдущие операции записи; 3.Доступ к данным (запись, чтение) запрещен, пока не выполнены все предыдущие обращения к синхронизационным переменным.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 49 из 209 Первое правило определяет, что все процессы видят обращения к синхронизационным переменным в определенном (одном и том же) порядке. Второе правило гарантирует, что выполнение процессором операции обращения к синхронизационной переменной возможно только после выталкивания конвейера (полного завершения выполнения на всех процессорах всех предыдущих операций записи переменных, выданных данным процессором). Третье правило определяет, что при обращении к обычным (не синхронизационным) переменным на чтение или запись, все предыдущие обращения к синхронизационным переменным должны быть выполнены полностью. Выполнив синхронизацию перед обращением к общей переменной, процесс может быть уверен, что получит правильное значение этой переменной. Слабая консистентность (weak consistency)

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 50 из 209 P1W(x)aW(x)bS P2R(x)aR(x)bS P3R(x)bR(x)aS Допустимая последователь- ность событий P1W(x)aW(x)bS P2SR(x)b Недопустимая последовательность событий Слабая консистентность (weak consistency)

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 51 из 209 Консистентность по выходу В системе со слабой консистентностью возникает проблема при обращении к синхронизационной переменной: система не имеет информации о цели этого обращения - или процесс завершил модификацию общей переменной, или готовится прочитать значение общей переменной. Для более эффективной реализации модели консистентности система должна различать две ситуации: вход в критическую секцию и выход из нее. В модели консистентности по выходу введены специальные функции обращения к синхронизационным переменным: ACQUIRE - захват синхронизационной переменной, информирует систему о входе в критическую секцию; RELEASE - освобождение синхронизационной переменной, определяет завершение критической секции.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 52 из 209 Следующие правила определяют требования к модели консистентности по выходу: До выполнения обращения к общей переменной, должны быть полностью выполнены все предыдущие захваты синхронизационных переменных данным процессором. Перед освобождением синхронизационной переменной должны быть закончены все операции чтения/записи, выполнявшиеся процессором прежде. Реализация операций захвата и освобождения синхронизационной переменной должны удовлетворять требованиям процессорной консистентности (последовательная консистентность не требуется). P1Acq(L)W(x)aW(x)bRel(L) P2Acq(L)R(x)bRel(L) P3R(x)a Консистентность по выходу

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 53 из Модель памяти в OpenMP Нить 001 Нить 001 Нить

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 54 из Нить Нить 1 static int i = 0; … = i + 1; i = i + 1; i = 0 i = 1 … = i + 2; // ? #pragma omp flush (i) i = 1 Модель памяти в OpenMP

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 55 из 209 Консистентность памяти в OpenMP Корректная последовательность работы нитей с переменной: Нить0 записывает значение переменной - write(var) Нить0 выполняет операцию синхронизации – flush (var) Нить1 выполняет операцию синхронизации – flush (var) Нить1 читает значение переменной – read (var) Директива flush: #pragma omp flush [(list)] - для Си !$omp flush [(list)] - для Фортран

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 56 из 209 Консистентность памяти в OpenMP 1.Если пересечение множеств переменных, указанных в операциях flush, выполняемых различными нитями не пустое, то результат выполнения операций flush будет таким, как если бы эти операции выполнялись в некоторой последовательности (единой для всех нитей). 2.Если пересечение множеств переменных, указанных в операциях flush, выполняемых одной нитью не пустое, то результат выполнения операций flush, будет таким, как если бы эти операции выполнялись в порядке, определяемом программой. 3.Если пересечение множеств переменных, указанных в операциях flush, пустое, то операции flush могут выполняться независимо (в любом порядке).

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 57 из 209 Классы переменных В модели программирования с разделяемой памятью: Большинство переменных по умолчанию считаются SHARED Глобальные переменные совместно используются всеми нитями (shared) : Фортран: COMMON блоки, SAVE переменные, MODULE переменные Си: file scope, static Динамически выделяемая память (ALLOCATE, malloc, new) Но не все переменные являются разделяемыми... Стековые переменные в подпрограммах (функциях), вызываемых из параллельного региона, являются PRIVATE. Переменные объявленные внутри блока операторов параллельного региона являются приватными. Счетчики циклов витки которых распределяются между нитями при помощи конструкций FOR и PARALLEL FOR.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 58 из 209 double Array1[100]; int main() { int Array2[100]; #pragma omp parallel work(Array2); printf(%d\n, Array2[0]); } extern double Array1[10]; void work(int *Array) { double TempArray[10]; static int count;... } TempArray Array1, Array2, count Модель памяти в OpenMP

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 59 из 209 Можно изменить класс переменной при помощи конструкций: SHARED (список переменных) PRIVATE (список переменных) FIRSTPRIVATE (список переменных) LASTPRIVATE (список переменных) THREADPRIVATE (список переменных) DEFAULT (PRIVATE | SHARED | NONE) Классы переменных

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 60 из 209 Конструкция 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.5

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 61 из 209 Конструкция 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 инициализирована 0 tmp: 0 в 3.0, не определено в 2.5

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 62 из 209 Конструкция LASTPRIVATE Lastprivate передает значение приватной переменной, посчитанной на последней итерации в глобальную переменную. void almost_right () { int tmp = 0; #pragma omp for firstprivate(tmp) lastprivate (tmp) for (int j = 0; j < 1000; ++j) tmp += j; printf(%d\n, tmp); } tmp инициализирована 0 переменная tmp получит значение, посчитанное на последней итерации (j=999)

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 63 из 209 Директива THREADPRIVATE Отличается от применения конструкции PRIVATE: PRIVATE скрывает глобальные переменные THREADPRIVATE – переменные сохраняют глобальную область видимости внутри каждой нити #pragma omp threadprivate (Var) Var = 1 Var = 2 … = Var Если количество нитей не изменилось, то каждая нить получит значение, посчитанное в предыдущей параллельной области.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 64 из 209 Конструкция DEFAULT Меняет класс переменной по умолчанию: DEFAULT (SHARED) – действует по умолчанию DEFAULT (PRIVATE) – есть только в Fortran DEFAULT (NONE) – требует определить класс для каждой переменной itotal = 100 #pragma omp parallel private(np,each) { np = omp_get_num_threads() each = itotal/np ……… } itotal = 100 #pragma omp parallel default(none) private(np,each) shared (itotal) { np = omp_get_num_threads() each = itotal/np ……… }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 65 из 209 Параллельная область (директива 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)

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 66 из 209 Вычисление числа 4.0 (1+x 2 ) dx = 0 1 F(x i ) x i = 0 N Мы можем аппроксимировать интеграл как сумму прямоугольников: Где каждый прямоугольник имеет ширину x и высоту F(x i ) в середине интервала F(x) = 4.0/(1+x 2 ) X 0.0

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 67 из 209 #include int main () { int n =100000, i; double pi, h, sum, x; h = 1.0 / (double) n; sum = 0.0; for (i = 1; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 68 из 209 #include #define NUM_THREADS 32 int 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

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 69 из 209 #include 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

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 70 из 209 Клауза reduction reduction(operator:list) Внутри паралельной области для каждой переменной из списка list создается копия этой переменной. Эта переменная инициализируется в соответствии с оператором operator (например, 0 для «+»). Для каждой нити компилятор заменяет в параллельной области обращения к редукционной переменной на обращения к созданной копии. По завершении выполнения параллельной области осуществляется объединение полученных результатов. ОператорНачальное значение +0 *1 -0 &~0 |0 ^0 &&1 ||0

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 71 из 209 Клауза if if(scalar-expression) В зависимости от значения scalar-expression для выполнения структурного блока будет создана группа нитей или он будет выполняться одной нитью. #include 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; }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 72 из 209 Клауза num_threads num_threads(integer-expression) integer-expression задает максимально возможное число нитей, которые будут созданы для выполнения структурного блока #include 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; }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 73 из 209 Определение числа нитей в параллельной области Число создаваемых нитей зависит от: клаузы if клаузы num_threads значений переменных, управляющих выполнением OpenMP- программы: – dyn-var (включение/отключение режима, в котором количество создаваемых нитей может изменяться динамически: OMP_DYNAMIC, omp_set_dynamic()) – nthreads-var (максимально возможное число нитей, создаваемых при входе в параллельную область: OMP_NUM_THREADS, omp_set_num_threads()) – thread-limit-var (максимально возможное число нитей, создаваемых для выполнения всей OpenMP-программы: OMP_THREAD_LIMIT) – nest-var (включение/отключение режима поддержки вложенного параллелизма:OMP_NESTED, omp_set_nested()) – max-active-level-var (максимально возможное количество вложенных параллельных областей: OMP_MAX_ACTIVE_LEVELS, omp_set_max_active_levels())

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 74 из 209 Определение числа нитей в параллельной области Пусть ThreadsBusy - количество OpenMP нитей, выполняемых в данный момент; Пусть ActiveParRegions - количество активных параллельных областей; if в директиве parallel существует клауза if then присвоить переменной IfClauseValue значение выражения в клаузе if; else IfClauseValue = true; if в директиве parallel существует клауза num_threads then присвоить переменной ThreadsRequested значение выражения в клаузе num_threads; else ThreadsRequested = nthreads-var; ThreadsAvailable = (thread-limit-var - ThreadsBusy + 1);

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 75 из 209 Определение числа нитей в параллельной области if (IfClauseValue == false) then number of threads = 1; else if (ActiveParRegions >= 1) and (nest-var = false) then number of threads = 1; else if (ActiveParRegions == max-active-levels-var) then number of threads = 1; else if (dyn-var == true) and (ThreadsRequested ThreadsAvailable) then number of threads = [ 1 : ThreadsAvailable ]; else if (dyn-var == false) and (ThreadsRequested ThreadsAvailable) then number of threads зависит от реализации компилятора;

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 76 из 209 Определение числа нитей в параллельной области #include int main (void) { omp_set_nested(1); omp_set_max_active_levels(8); omp_set_dynamic(0); omp_set_num_threads(2); #pragma omp parallel { omp_set_num_threads(3); #pragma omp parallel { … }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 77 из 209 Клауза copyin copyin(list) Значение каждой threadprivate-переменной из списка list, устанавливается равным значению этой переменной в master-нити #include 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(); }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 78 из 209 Содержание Современные направления развития параллельных вычислительных систем OpenMP – модель параллелизма по управлению Конструкции распределения работы Конструкции для синхронизации нитей Система поддержки выполнения OpenMP-программ. Переменные окружения, управляющие выполнением OpenMP-программы Наиболее часто встречаемые ошибки в OpenMP- программах. Функциональная отладка OpenMP-программ Отладка эффективности OpenMP-программ Использование OpenMP на кластере

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 79 из 209 Конструкции распределения работы Распределение витков циклов (директива for) Распределение нескольких структурных блоков между нитями (директива section) Выполнение структурного блока одной нитью (директива single) Распределение операторов одного структурного блока между нитями (директива workshare) Задачи (директива task)

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 80 из 209 Вычисление числа 4.0 (1+x 2 ) dx = 0 1 F(x i ) x i = 0 N Мы можем аппроксимировать интеграл как сумму прямоугольников: Где каждый прямоугольник имеет ширину x и высоту F(x i ) в середине интервала F(x) = 4.0/(1+x 2 ) X 0.0

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 81 из 209 #include int main () { int n =100000, i; double pi, h, sum, x; h = 1.0 / (double) n; sum = 0.0; for (i = 1; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 82 из 209 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) { 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

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 83 из 209 #include 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

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 84 из 209 Распределение витков цикла #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

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 85 из 209 Распределение витков цикла 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-expr1 test-expr: var relational-op loop-invariant-expr2 | loop-invariant-expr2 relational-op var incr-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- expr relational-op: < | | >= var: signed or unsigned integer type | random access iterator type | pointer type

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 86 из 209 Parallel Random Access Iterator Loop (OpenMP 3.0) #include void iterator_example() { std::vector vec(23); std::vector ::iterator it; #pragma omp parallel for default(none) shared(vec) for (it = vec.begin(); it < vec.end(); it++) { // do work with *it // }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 87 из 209 Использование указателей в цикле (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++ ) - ошибка

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 88 из 209 Вложенность конструкций распределения работы void work(int i, int j) {} void wrong1(int n) { #pragma omp parallel default(shared) { int i, j; #pragma omp for for (i=0; i < n; i++) { /* incorrect nesting of loop regions */ #pragma omp for for (j=0; j < n; j++) work(i, j); }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 89 из 209 Вложенность конструкций распределения работы void work(int i, int j) {} void good_nesting(int n) { int i, j; #pragma omp parallel default(shared) { #pragma omp for for (i=0; i < n; i++) { #pragma omp parallel shared(i, n) { #pragma omp for for (j=0; j < n; j++) work(i, j); }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 90 из 209 Распределение витков многомерных циклов. Клауза 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

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 91 из 209 Распределение витков многомерных циклов. Клауза 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

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 92 из 209 Распределение витков многомерных циклов. Клауза 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

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 93 из 209 Распределение витков цикла. Клауза schedule Клауза schedule: schedule(алгоритм планирования[, число_итераций]) Где алгоритм планирования один из: schedule(static[, число_итераций]) - статическое планирование; schedule(dynamic[, число_итераций]) - динамическое планирование; schedule(guided[, число_итераций]) - управляемое планирование; schedule(runtime) - планирование в период выполнения; schedule(auto) - автоматическое планирование (OpenMP 3.0).

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 94 из 209 Распределение витков цикла. Клауза schedule #pragma omp parallel for schedule(dynamic, 15) for(int i = 1; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 95 из 209 Распределение витков цикла. Клауза schedule число_выполняемых_потоком_итераций = max(число_нераспределенных_итераций/omp_get_num_threads(), число_итераций) #pragma omp parallel for schedule(guided, 10) for(int i = 1; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 96 из 209 Распределение витков цикла. Клауза schedule #pragma omp parallel for schedule(runtime) for(int i = 1; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 97 из 209 Распределение витков цикла. Клауза schedule #pragma omp parallel for schedule(auto) for(int i = 1; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 98 из 209 Распределение витков цикла. Клауза nowait void example(int n, float *a, float *b, float *z) { int i; #pragma omp parallel { #pragma omp for schedule(static) nowait for (i=0; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 99 из 209 Распределение витков цикла. Клауза nowait void example(int n, float *a, float *b, float *z) { int i; float sum = 0.0; #pragma omp parallel { #pragma omp for schedule(static) nowait reduction (+: sum) for (i=0; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 100 из 209 Распределение витков цикла. Клауза и директива ordered void print_iteration(int iter) { #pragma omp ordered printf("iteration %d\n", iter); } int main( ) { int i; #pragma omp parallel { #pragma omp for ordered for (i = 0 ; i < 5 ; i++) { print_iteration(i); another_work (i); } Результат выполнения программы: iteration 0 iteration 1 iteration 2 iteration 3 iteration 4

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 101 из 209 Распределение нескольких структурных блоков между нитями (директива sections). #pragma omp sections [клауза[[,] клауза]...] { [#pragma omp section] структурный блок [#pragma omp section структурный блок ]... } где клауза одна из : private(list) firstprivate(list) lastprivate(list) reduction(operator: list) nowait void XAXIS(); void YAXIS(); void ZAXIS(); void example() { #pragma omp parallel { #pragma omp sections { #pragma omp section XAXIS(); #pragma omp section YAXIS(); #pragma omp section ZAXIS(); }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 102 из 209 Выполнение структурного блока одной нитью (директива single). #pragma omp single [клауза[[,] клауза]...] структурный блок где клауза одна из : private(list) firstprivate(list) copyprivate(list) nowait Структурный блок будет выполнен одной из нитей. Все остальные нити будут дожидаться результатов выполнения блока, если не указана клауза NOWAIT. #include float x, y; #pragma omp threadprivate(x, y) void init(float a, float b ) { #pragma omp single copyprivate(a,b,x,y) scanf("%f %f %f %f", &a, &b, &x, &y); } int main () { #pragma omp parallel { float x1,y1; init (x1,y1); parallel_work (); }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 103 из 209 Распределение операторов одного структурного блока между нитями (директива WORKSHARE). SUBROUTINE EXAMPLE (AA, BB, CC, DD, EE, FF, GG, HH, N) INTEGER N REAL AA(N,N), BB(N,N), CC(N,N) REAL DD(N,N), EE(N,N), FF(N,N) REAL GG(N,N), HH(N,N) REAL SHR !$OMP PARALLEL SHARED(SHR) !$OMP WORKSHARE AA = BB CC = DD WHERE (EE.ne. 0) FF = 1 / EE SHR = 1.0 GG (1:50,1) = HH(11:60,1) HH(1:10,1) = SHR !$OMP END WORKSHARE !$OMP END PARALLEL END SUBROUTINE EXAMPLE

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 104 из 209 Понятие задачи. Директива task (OpenMP 3.0) Каждая задача: Представляет собой последовательность операторов, которые необходимо выполнить. Включает в себя данные, которые используются при выполнении этих операторов. Выполняется некоторой нитью. Задаются при помощи директивы: #pragma omp task [клауза[[,] клауза]...] структурный блок где клауза одна из : if (expression) untied shared (list) private (list) firstprivate (list) default( shared | none )

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 105 из 209 Использование директивы 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 task process(p); p = p->next; }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 106 из 209 Использование директивы task. Клауза if double *item; int main() { #pragma omp parallel shared (item) { #pragma omp single { int i, size; scanf("%d",&size); item = (double*)malloc(sizeof(double)*size); for (i=0; i 10) process(item[i]); } Если накладные расходы на организацию задач превосходят время, необходимое для выполнения блока операторов этой задачи, то блок операторов будет немедленно выполнен нитью, выполнившей директиву task.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 107 из 209 Использование директивы task. #define LARGE_NUMBER double *item; extern void process(double); int main() { #pragma omp parallel shared (item) { #pragma omp single { int i; item = (double*)malloc(sizeof(double)*size); for (i=0; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 108 из 209 Использование директивы task. Клауза untied #define LARGE_NUMBER double item[LARGE_NUMBER]; extern void process(double); int main() { #pragma omp parallel { #pragma omp single { int i; #pragma omp task untied { for (i=0; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 109 из 209 Содержание Современные направления развития параллельных вычислительных систем OpenMP – модель параллелизма по управлению Конструкции распределения работы Конструкции для синхронизации нитей Система поддержки выполнения OpenMP-программ. Переменные окружения, управляющие выполнением OpenMP-программы Наиболее часто встречаемые ошибки в OpenMP- программах. Функциональная отладка OpenMP-программ Отладка эффективности OpenMP-программ Использование OpenMP на кластере

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 110 из 209 Конструкции для синхронизации нитей Директива master Директива critical Директива atomic Семафоры Директива barrier Директива taskwait Директива flush Директива ordered

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 111 из 209 #pragma omp master структурный блок /*Структурный блок будет выполнен MASTER-нитью группы. По завершении выполнения структурного блока барьерная синхронизация нитей не выполняется*/ #include void init(float *a, float *b ) { #pragma omp master scanf("%f %f", a, b); #pragma omp barrier } int main () { float x,y; #pragma omp parallel { init (&x,&y); parallel_work (x,y); } Директива master

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 112 из 209 При взаимодействии через общую память нити должны синхронизовать свое выполнение. int i=0; #pragma omp parallel { i++; } Взаимное исключение критических интервалов Результат зависит от порядка выполнения команд. Требуется взаимное исключение критических интервалов. ВремяThread0Thread1 1load i (i = 0) 2incr i (i = 1) 3->->load i (i = 0) 4incr i (i = 1) 5store i (i = 1) 6

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 113 из 209 Решение проблемы взаимного исключения должно удовлетворять требованиям: в любой момент времени только одна нить может находиться внутри критического интервала; если ни одна нить не находится в критическом интервале, то любая нить, желающая войти в критический интервал, должна получить разрешение без какой либо задержки; ни одна нить не должна бесконечно долго ждать разрешения на вход в критический интервал (если ни одна нить не будет находиться внутри критического интервала бесконечно); не должно существовать никаких предположений о скоростях процессоров. Взаимное исключение критических интервалов

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 114 из 209 Вычисление числа 4.0 (1+x 2 ) dx = 0 1 F(x i ) x i = 0 N Мы можем аппроксимировать интеграл как сумму прямоугольников: Где каждый прямоугольник имеет ширину x и высоту F(x i ) в середине интервала F(x) = 4.0/(1+x 2 ) X 0.0

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 115 из 209 int main () { int n =100000, i; double pi, h, sum, x; h = 1.0 / (double) n; sum = 0.0; for (i = 1; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 116 из 209 #include 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) { double local_sum = 0.0; #pragma omp for for (i = 1; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 117 из 209 int from_ list(float *a, int type); void work(int i, float *a); void example () { #pragma omp parallel { float *x; int ix_next; #pragma omp critical (list0) ix_next = from_ list(x,0); work(ix_next, x); #pragma omp critical (list1) ix_next = from_ list(x,1); work(ix_next, x); } Директива critical

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 118 из 209 #pragma omp atomic expression-stmt где expression-stmt: x binop= expr x++ ++x x-- --x Здесь х – скалярная переменная, expr – выражение со скалярными типами, в котором не присутствует переменная х. где binop - не перегруженный оператор: + * - / & ^ | > Директива atomic

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 119 из 209 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) { double local_sum = 0.0; #pragma omp for for (i = 1; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 120 из 209 Концепцию семафоров описал Дейкстра (Dijkstra) в 1965 Семафор - неотрицательная целая переменная, которая может изменяться и проверяться только посредством двух функций: P - функция запроса семафора P(s): [if (s == 0) ; else s = s-1;] V - функция освобождения семафора V(s): [if (s == 0) ; s = s+1;] Семафоры

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 121 из 209 Состояния семафора: uninitialized unlocked locked void omp_init_lock(omp_lock_t *lock); /* uninitialized to unlocked*/ void omp_destroy_lock(omp_lock_t *lock); /* unlocked to uninitialized */ void omp_set_lock(omp_lock_t *lock); /*P(lock)*/ void omp_unset_lock(omp_lock_t *lock); /*V(lock)*/ int omp_test_lock(omp_lock_t *lock); void omp_init_nest_lock(omp_nest_lock_t *lock); void omp_destroy_nest_lock(omp_nest_lock_t *lock); void omp_set_nest_lock(omp_nest_lock_t *lock); void omp_unset_nest_lock(omp_nest_lock_t *lock); int omp_test_nest_lock(omp_nest_lock_t *lock); Семафоры в OpenMP

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 122 из 209 int main () { int n =100000, i; double pi, h, sum, x; omp_lock_t lck; h = 1.0 / (double) n; sum = 0.0; omp_init_lock(&lck); #pragma omp parallel default (none) private (i,x) shared (n,h,sum,lck) { double local_sum = 0.0; #pragma omp for for (i = 1; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 123 из 209 int main() { omp_lock_t lck; int id; omp_init_lock(&lck); #pragma omp parallel shared(lck) private(id) { id = omp_get_thread_num(); omp_set_lock(&lck); printf("My thread id is %d.\n", id); /* only one thread at a time can execute this printf */ omp_unset_lock(&lck); while (! omp_test_lock(&lck)) { skip(id); /* we do not yet have the lock, so we must do something else*/ } work(id); /* we now have the lock and can do the work */ omp_unset_lock(&lck); } omp_destroy_lock(&lck); return 0; } Использование семафоров void skip(int i) {} void work(int i) {}

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 124 из 209 typedef struct { int a,b; omp_lock_t lck; } pair; void incr_a(pair *p, int a) { p->a += a; } void incr_b(pair *p, int b) { omp_set_lock(&p->lck); p->b += b; omp_unset_lock(&p->lck); } void incr_pair(pair *p, int a, int b) { omp_set_lock(&p->lck); incr_a(p, a); incr_b(p, b); omp_unset_lock(&p->lck); } Использование семафоров void incorrect_example(pair *p) { #pragma omp parallel sections { #pragma omp section incr_pair(p,1,2); #pragma omp section incr_b(p,3); } Deadlock!

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 125 из 209 typedef struct { int a,b; omp_nest_lock_t lck; } pair; void incr_a(pair *p, int a) { /* Called only from incr_pair, no need to lock. */ p->a += a; } void incr_b(pair *p, int b) { omp_set_nest_lock(&p->lck); /* Called both from incr_pair and elsewhere, so need a nestable lock. */ p->b += b; omp_unset_nest_lock(&p->lck); } void incr_pair(pair *p, int a, int b) { omp_set_nest_lock(&p->lck); incr_a(p, a); incr_b(p, b); omp_unset_nest_lock(&p->lck); } Использование семафоров void correct_example(pair *p) { #pragma omp parallel sections { #pragma omp section incr_pair(p,1,2); #pragma omp section incr_b(p,3); }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 126 из 209 Точка в программе, достижимая всеми нитями группы, в которой выполнение программы приостанавливается до тех пор пока все нити группы не достигнут данной точки и все задачи, выполняемые группой нитей будут завершены. #pragma omp barrier По умолчанию барьерная синхронизация нитей выполняется: по завершению конструкции parallel; при выходе из конструкций распределения работ (for, single, sections, workshare), если не указана клауза nowait. #pragma omp parallel { #pragma omp master { int i, size; scanf("%d",&size); for (i=0; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 127 из 209 void work(int i, int j) {} void wrong(int n) { #pragma omp parallel default(shared) { int i; #pragma omp for for (i=0; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 128 из 209 void work(int i, int j) {} void wrong(int n) { #pragma omp parallel default(shared) { int i; #pragma omp critical { work(i, 0); /* incorrect nesting of barrier region in a critical region */ #pragma omp barrier work(i, 1); } Директива barrier

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 129 из 209 void work(int i, int j) {} void wrong(int n) { #pragma omp parallel default(shared) { int i; #pragma omp single { work(i, 0); /* incorrect nesting of barrier region in a single region */ #pragma omp barrier work(i, 1); } Директива barrier

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 130 из 209 #pragma omp taskwait int fibonacci(int n) { int i, j; if (n

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 131 из 209 #pragma omp flush [(список переменных)] По умолчанию все переменные приводятся в консистентное состояние (#pragma omp 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. Директива flush

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 132 из 209 Содержание Современные направления развития параллельных вычислительных систем OpenMP – модель параллелизма по управлению Конструкции распределения работы Конструкции для синхронизации нитей Система поддержки выполнения OpenMP-программ. Переменные окружения, управляющие выполнением OpenMP-программы Наиболее часто встречаемые ошибки в OpenMP- программах. Функциональная отладка OpenMP-программ Отладка эффективности OpenMP-программ Использование OpenMP на кластере

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 133 из 209 Система поддержки выполнения OpenMP- программ. Внутренние переменные, управляющие выполнением OpenMP-программы (ICV-Internal Control Variables). Задание/опрос значений ICV-переменных. Функции работы со временем.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 134 из 209 Для параллельных областей: nthreads-var thread-limit-var dyn-var nest-var max-active-levels-var Для циклов: run-sched-var def-sched-var Для всей программы: stacksize-var wait-policy-var Internal Control Variables.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 135 из 209 void work(); int main () { omp_set_num_threads(3); #pragma omp parallel { omp_set_num_threads(omp_get_thread_num ()+2); #pragma omp parallel work(); } Internal Control Variables. nthreads-var Не корректно в OpenMP 2.5 Корректно в OpenMP 3.0

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 136 из 209 Internal Control Variables. nthreads-var Определяет максимально возможное количество нитей в создаваемой параллельной области. Начальное значение: зависит от реализации. Существует одна копия этой переменной для каждой задачи. Значение переменной можно изменить: C shell: setenv OMP_NUM_THREADS 16 Korn shell: export OMP_NUM_THREADS=16 Windows: set OMP_NUM_THREADS=16 void omp_set_num_threads(int num_threads); Узнать значение переменной можно: int omp_get_max_threads(void);

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 137 из 209 Internal Control Variables. thread-limit-var Определяет максимальное количество нитей, которые могут быть использованы для выполнения всей программы. Начальное значение: зависит от реализации. Существует одна копия этой переменной для всей программы. Значение переменной можно изменить: C shell: setenv OMP_THREAD_LIMIT 16 Korn shell: export OMP_THREAD_LIMIT=16 Windows: set OMP_THREAD_LIMIT=16 Узнать значение переменной можно: int omp_get_thread_limit(void)

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 138 из 209 Internal Control Variables. dyn-var Включает/отключает режим, в котором количество создаваемых нитей при входе в параллельную область может меняться динамически. Начальное значение: Если компилятор не поддерживает данный режим, то false. Существует одна копия этой переменной для каждой задачи. Значение переменной можно изменить: C shell: setenv OMP_DYNAMIC true Korn shell: export OMP_DYNAMIC=true Windows: set OMP_DYNAMIC=true void omp_set_dynamic(int dynamic_threads); Узнать значение переменной можно: int omp_get_dynamic(void);

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 139 из 209 Internal Control Variables. nest-var Включает/отключает режим поддержки вложенного параллелизма. Начальное значение: false. Существует одна копия этой переменной для каждой задачи. Значение переменной можно изменить: C shell: setenv OMP_NESTED true Korn shell: export OMP_NESTED=false Windows: set OMP_NESTED=true void omp_set_nested(int nested); Узнать значение переменной можно: int omp_get_nested(void);

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 140 из 209 Internal Control Variables. max-active-levels-var Задает максимально возможное количество активных вложенных параллельных областей. Начальное значение: зависит от реализации. Существует одна копия этой переменной для всей программы. Значение переменной можно изменить: C shell: setenv OMP_MAX_ACTIVE_LEVELS 2 Korn shell: export OMP_MAX_ACTIVE_LEVELS=3 Windows: set OMP_MAX_ACTIVE_LEVELS=4 void omp_set_max_active_levels (int max_levels); Узнать значение переменной можно: int omp_get_max_active_levels(void);

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 141 из 209 Internal Control Variables. run-sched-var Задает способ распределения витков цикла между нитями, если указана клауза schedule(runtime). Начальное значение: зависит от реализации. Существует одна копия этой переменной для каждой задачи. Значение переменной можно изменить: C shell: setenv OMP_SCHEDULE "guided,4" Korn shell: export OMP_SCHEDULE "dynamic,5" Windows: set OMP_SCHEDULE=static void omp_set_schedule(omp_sched_t kind, int modifier); Узнать значение переменной можно: void omp_get_schedule(omp_sched_t * kind, int * modifier ); typedef enum omp_sched_t { omp_sched_static = 1, omp_sched_dynamic = 2, omp_sched_guided = 3, omp_sched_auto = 4 } omp_sched_t;

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 142 из 209 Internal Control Variables. run-sched-var void work(int i); int main () { omp_sched_t schedules [] = {omp_sched_static, omp_sched_dynamic, omp_sched_guided, omp_sched_auto}; omp_set_num_threads (4); #pragma omp parallel { omp_set_schedule (schedules[omp_get_thread_num()],0); #pragma omp parallel for schedule(runtime) for (int i=0;i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 143 из 209 Internal Control Variables. def-sched-var Задает способ распределения витков цикла между нитями по умолчанию. Начальное значение: зависит от реализации. Существует одна копия этой переменной для всей программы. void work(int i); int main () { #pragma omp parallel { #pragma omp for for (int i=0;i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 144 из 209 Internal Control Variables. stack-size-var Каждая нить представляет собой независимо выполняющийся поток управления со своим счетчиком команд, регистровым контекстом и стеком. Переменная stack-size-var задает размер стека. Начальное значение: зависит от реализации. Существует одна копия этой переменной для всей программы. Значение переменной можно изменить: setenv OMP_STACKSIZE B setenv OMP_STACKSIZE "3000 k" setenv OMP_STACKSIZE 10M setenv OMP_STACKSIZE "10 M" setenv OMP_STACKSIZE "20 m" setenv OMP_STACKSIZE "1G" setenv OMP_STACKSIZE 20000

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 145 из 209 Internal Control Variables. stack-size-var int main () { int a[1024][1024]; #pragma omp parallel private (a) { for (int i=0;i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 146 из 209 Internal Control Variables. wait-policy-var Подсказка OpenMP-компилятору о желаемом поведении нитей во время ожидания. Начальное значение: зависит от реализации. Существует одна копия этой переменной для всей программы. Значение переменной можно изменить: setenv OMP_WAIT_POLICY ACTIVE setenv OMP_WAIT_POLICY active setenv OMP_WAIT_POLICY PASSIVE setenv OMP_WAIT_POLICY passive IBM AIX SPINLOOPTIME= YIELDLOOPTIME=40000

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 147 из 209 Internal Control Variables. Приоритеты клаузавызов функциипеременная окруженияICV omp_set_dynamic()OMP_DYNAMICdyn-var omp_set_nested()OMP_NESTEDnest-var num_threadsomp_set_num_threads()OMP_NUM_THREADSnthreads-var scheduleomp_set_schedule()OMP_SCHEDULErun-sched-var scheduledef-sched-var OMP_STACKSIZEstacksize-var OMP_WAIT_POLICYwait-policy-var OMP_THREAD_LIMITthread-limit-var omp_set_max_active_ levels() OMP_MAX_ACTIVE_ LEVELS max-active-levels-var

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 148 из 209 int omp_get_num_threads(void); -возвращает количество нитей в текущей параллельной области #include void work(int i); void test() { int np; np = omp_get_num_threads(); /* np == 1*/ #pragma omp parallel private (np) { np = omp_get_num_threads(); #pragma omp for schedule(static) for (int i=0; i < np; i++) work(i); } Система поддержки выполнения OpenMP- программ.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 149 из 209 int omp_get_thread_num(void); -возвращает номер нити в группе [0: omp_get_num_threads()-1] #include void work(int i); void test() { int iam; iam = omp_get_thread_num(); /* iam == 0*/ #pragma omp parallel private (iam) { iam = omp_get_thread_num(); work(iam); } Система поддержки выполнения OpenMP- программ.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 150 из 209 int omp_get_num_procs(void); -возвращает количество процессоров, на которых программа выполняется #include void work(int i); void test() { int nproc; nproc = omp_get_num_ procs(); #pragma omp parallel num_threads(nproc) { int iam = omp_get_thread_num(); work(iam); } Система поддержки выполнения OpenMP- программ.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 151 из 209 int omp_get_level(void) - возвращает уровень вложенности для текущей параллельной области. #include void work(int i) { #pragma omp parallel { int ilevel = omp_get_level (); } void test() { int ilevel = omp_get_level (); /*ilevel==0*/ #pragma omp parallel private (ilevel) { ilevel = omp_get_level (); int iam = omp_get_thread_num(); work(iam); } Система поддержки выполнения OpenMP- программ.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 152 из 209 int omp_get_active_level(void) - возвращает количество активных параллельных областей (выполняемых 2-мя или более нитями). #include void work(int iam, int size) { #pragma omp parallel { int ilevel = omp_get_active_level (); } void test() { int size = 0; int ilevel = omp_get_active_level (); /*ilevel==0*/ scanf("%d",&size); #pragma omp parallel if (size>10) { int iam = omp_get_thread_num(); work(iam, size); } Система поддержки выполнения OpenMP- программ.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 153 из 209 int omp_get_ancestor_thread_num (int level) - для нити, вызвавшей данную функцию, возвращается номер нити- родителя, которая создала указанную параллельную область. omp_get_ancestor_thread_num (0) = 0 If (level==omp_get_level()) { omp_get_ancestor_thread_num (level) == omp_get_thread_num (); } If ((level omp_get_level())) { omp_get_ancestor_thread_num (level) == -1; } Система поддержки выполнения OpenMP- программ.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 154 из 209 int omp_get_team_size(int level); - количество нитей в указанной параллельной области. omp_get_team_size (0) = 1 If (level==omp_get_level()) { omp_get_team_size (level) == omp_get_num _threads (); } If ((level omp_get_level())) { omp_get_team_size (level) == -1; } Система поддержки выполнения OpenMP- программ.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 155 из 209 double omp_get_wtime(void); возвращает для нити астрономическое время в секундах, прошедшее с некоторого момента в прошлом. Если некоторый участок окружить вызовами данной функции, то разность возвращаемых значений покажет время работы данного участка. Гарантируется, что момент времени, используемый в качестве точки отсчета, не будет изменен за время выполнения программы. double start; double end; start = omp_get_wtime(); /*... work to be timed...*/ end = omp_get_wtime(); printf("Work took %f seconds\n", end - start); double omp_get_wtick(void); - возвращает разрешение таймера в секундах (количество секунд между последовательными импульсами таймера). Система поддержки выполнения OpenMP-программ. Функции работы со временем

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 156 из 209 Содержание Современные направления развития параллельных вычислительных систем OpenMP – модель параллелизма по управлению Конструкции распределения работы Конструкции для синхронизации нитей Система поддержки выполнения OpenMP-программ. Переменные окружения, управляющие выполнением OpenMP-программы Наиболее часто встречаемые ошибки в OpenMP- программах. Функциональная отладка OpenMP-программ Отладка эффективности OpenMP-программ Использование OpenMP на кластере

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 157 из 209 Наиболее часто встречаемые ошибки в OpenMP-программах. Трудно обнаруживаемые ошибки типа race condition (конфликт доступа к данным). Ошибки типа deadlock (взаимная блокировка нитей). Использование неинициализированных переменных. Автоматизированный поиск ошибок в OpenMP- программах при помощи Intel Thread Checker и Sun Studio Thread Analyzer.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 158 из 209 Ошибка возникает при одновременном выполнении следующих условий: 1.Две или более нитей обращаются к одной и той же ячейке памяти. 2.По крайней мере, один из этих доступов к памяти является записью. 3.Нити не синхронизируют свой доступ к данной ячейки памяти. При одновременном выполнении всех трех условий порядок доступа становится неопределенным. Конфликт доступа к данным

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 159 из 209 Использование различных компиляторов (различных опций оптимизации, включение/отключение режима отладки при компиляции программы), применение различных стратегий планирования выполнения нитей в различных ОС, может приводить к тому, что в каких-то условиях (например, на одной вычислительной машине) ошибка не будет проявляться, а в других (на другой машине) – приводить к некорректной работе программы. От запуска к запуску программа может выдавать различные результаты в зависимости от порядка доступа. Отловить такую ошибку очень тяжело. Причиной таких ошибок как правило являются: неверное определение класса переменной, отсутствие синхронизации. Конфликт доступа к данным

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 160 из 209 Конфликт доступа к данным #define N float a[N], tmp #pragma omp parallel { #pragma omp for for(int i=0; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 161 из 209 Конфликт доступа к данным file1.c int counter = 0; #pragma omp threadprivate(counter) int increment_counter() { counter++; return(counter); } file2.c extern int counter; // нет директивы threadprivate int decrement_counter() { counter--; return(counter); }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 162 из 209 Конфликт доступа к данным #define N float a[N], sum #pragma omp parallel { #pragma omp master sum = 0.0; #pragma omp for for(int i=0; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 163 из 209 Взаимная блокировка нитей #pragma omp parallel { int iam=omp_get_thread_num(); if (iam ==0) { omp_set_lock (&lcka); omp_set_lock (&lckb); x = x + 1; omp_unset_lock (&lckb); omp_unset_lock (&lcka); } else { omp_set_lock (&lckb); omp_set_lock (&lcka); x = x + 2; omp_unset_lock (&lcka); omp_unset_lock (&lckb); }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 164 из 209 Взаимная блокировка нитей #pragma omp parallel { int iam=omp_get_thread_num(); if (iam ==0) { omp_set_lock (&lcka); while (x

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 165 из 209 Взаимная блокировка нитей #define N 10 int A[N],B[N], sum; #pragma omp parallel default(shared) num_threads(10) { int iam=omp_get_thread_num(); if (iam ==0) { #pragma omp critical (update_a) #pragma omp critical (update_b) sum +=A[iam]; } else { #pragma omp critical (update_b) #pragma omp critical (update_a) sum +=B[iam]; }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 166 из 209 Автоматизированный поиск ошибок. Intel Thread Checker KAI Assure Threads (Kuck and Associates) Анализ программы основан на процедуре инструментации. Инструментация – вставка обращений для записи действий, потенциально способных привести к ошибкам: работа с памятью, вызовы операций синхронизации и работа с потоками. Может выполняться автоматически (бинарная инструментация) на уровне исполняемого модуля (а также dll-библиотеки) и/или по указанию программиста на уровне исходного кода (компиляторная инструментация - Windows: /Qtcheck Linux:-tcheck).

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 169 из 209 Пакет тестов SPLASH-2 (Stanford Parallel Applications for Shared Memory) на 4-х ядерной машине

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 170 из 209 Автоматизированный поиск ошибок. Sun Thread Analyzer Инструментация программы: cc -xinstrument=datarace -g -xopenmp=noopt test.c Накопление информации о программе: еxport OMP_NUM_THREADS=2 collect -r race./a.out collect -r deadlock./a.out collect -r all./a.out Получение результатов анализа программы tha test.1.er => GUI er_print test.1.er => интерфейс командной строки

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 171 из 209 Автоматизированный поиск ошибок. Sun Thread Analyzer if (iam==0) { data = … user_lock (); } else { user_lock (); … = data; } if (iam==0) { ptr1 = mymalloc(sizeof(data_t)); ptr1->data = myfree(ptr1); } else { ptr2 = mymalloc(sizeof(data_t)); ptr2->data = myfree(ptr2); } Может выдавать сообщения об ошибках там где их нет

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 172 из 209 Intel Thread Checker и Sun Thread Analyzer ПрограммаJacobian Solver Sparse Matrix- Vector multiplication Adaptive Integration Solver Mem MFLOP/ s Mem MFLOP/ s MemTime Intel on 2 Threads s Intel Thread Checker on 2 Threads s Intel Thread Checker –tcheck Sun on 2 Threads s Sun Thread Analyzer on 2 Threads s

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 173 из 209 Содержание Современные направления развития параллельных вычислительных систем OpenMP – модель параллелизма по управлению Конструкции распределения работы Конструкции для синхронизации нитей Система поддержки выполнения OpenMP-программ. Переменные окружения, управляющие выполнением OpenMP-программы Наиболее часто встречаемые ошибки в OpenMP- программах. Функциональная отладка OpenMP-программ Отладка эффективности OpenMP-программ Использование OpenMP на кластере

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 174 из 209 Отладка эффективности OpenMP-программ Основные характеристики производительности Стратегии распределения витков цикла между нитями (клауза schedule) Отмена барьерной синхронизации по окончании выполнения цикла (клауза nowait) Локализация данных Задание поведения нитей во время ожидания (переменная OMP_WAIT_POLICY) Оптимизация OpenMP-программы при помощи Intel Thread Profiler

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 175 из 209 Основные характеристики производительности Полезное время - время, которое потребуется для выполнения программы на однопроцессорной ЭВМ. Общее время использования процессоров равно произведению времени выполнения программы на многопроцессорной ЭВМ (максимальное значение среди времен выполнения программы на всех используемых ею процессорах) на число используемых процессоров. Главная характеристика эффективности параллельного выполнения - коэффициент эффективности равен отношению полезного времени к общему времени использования процессоров. Разница между общим временем использования процессоров и полезным временем представляет собой потерянное время. Существуют следующие составляющие потерянного времени: накладные расходы на создание группы нитей; потери из-за простоев тех нитей, на которых выполнение программы завершилось раньше, чем на остальных (несбалансированная нагрузка нитей); потери из-за синхронизации нитей (например, из-за чрезмерного использования общих данных); потери из-за недостатка параллелизма, приводящего к дублированию вычислений на нескольких процессорах (недостаточный параллелизм).

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 176 из 209 Накладные расходы на создание группы нитей void work(int i, int j) {} for (int i=0; i < n; i++) { for (int j=0; j < n; j++) { work(i, j); } #pragma omp parallel for for (int i=0; i < n; i++) { for (int j=0; j < n; j++) { work(i, j); } for (int i=0; i < n; i++) { #pragma omp parallel for for (int j=0; j < n; j++) { work(i, j); }

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 177 из 209 Алгоритм Якоби for (int it=0;it

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 178 из 209 Балансировка нагрузки нитей. Клауза schedule Клауза schedule: schedule(алгоритм планирования[, число_итераций]) Где алгоритм планирования один из: schedule(static[, число_итераций]) - статическое планирование; schedule(dynamic[, число_итераций]) - динамическое планирование; schedule(guided[, число_итераций]) - управляемое планирование; schedule(runtime) - планирование в период выполнения; schedule(auto) - автоматическое планирование (OpenMP 3.0). #pragma omp parallel for schedule(static) for(int i = 1; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 179 из 209 Балансировка нагрузки нитей. Клауза schedule #pragma omp parallel for private(tmp) shared (a) schedule (runtime) for (int i=0; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 180 из 209 Отмена барьерной синхронизации по окончании выполнения цикла. Клауза nowait void example(int n, float *a, float *b, float *z, int n) { int i; #pragma omp parallel { #pragma omp for schedule(static) nowait for (i=0; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 181 из 209 Локализация данных #pragma omp parallel shared (var) { { var = … } Модификация общей переменной в параллельной области должна осуществляться в критической секции (critical/atomic/omp_set_lock). Если локализовать данную переменную (например, private(var)), то можно сократить потери на синхронизацию нитей.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 182 из 209 Переменная OMP_WAIT_POLICY. Подсказка OpenMP-компилятору о желаемом поведении нитей во время ожидания. Значение переменной можно изменить: setenv OMP_WAIT_POLICY ACTIVE setenv OMP_WAIT_POLICY active setenv OMP_WAIT_POLICY PASSIVE setenv OMP_WAIT_POLICY passive IBM AIX SPINLOOPTIME= YIELDLOOPTIME=40000 Sun Studio setenv SUNW_MP_THR_IDLE SPIN setenv SUNW_MP_THR_IDLE SLEEP setenv SUNW_MP_THR_IDLE SLEEP(2s) setenv SUNW_MP_THR_IDLE SLEEP(20ms) setenv SUNW_MP_THR_IDLE SLEEP(150mc)

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 183 из 209 Оптимизация для DSM-систем #pragma omp parallel for for (int i=1; i

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 184 из 209 Intel Thread Profiler Предназначен для анализа производительности OpenMP-приложений или многопоточных приложений с использованием потоков Win32 API и POSIX. Визуализация выполнения потоков во времени помогает понять их функции и взаимодействие. Инструмент указывает на узкие места, снижающие производительность. Инструментация программы: Linux: -g [-openmp_profile] Windows: /Zi [/-Qopenmp_profile], link with /fixed:no

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 190 из 209 Содержание Современные направления развития параллельных вычислительных систем OpenMP – модель параллелизма по управлению Конструкции распределения работы Конструкции для синхронизации нитей Система поддержки выполнения OpenMP-программ. Переменные окружения, управляющие выполнением OpenMP-программы Наиболее часто встречаемые ошибки в OpenMP- программах. Функциональная отладка OpenMP-программ Отладка эффективности OpenMP-программ Использование OpenMP на кластере

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 191 из 209 Использование OpenMP на кластере Технология Intel Cluster OpenMP Гибридная модель параллельного программирования MPI/OpenMP Гибридная модель параллельного программирования DVM/OpenMP

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 192 из 209 Технология Intel Cluster OpenMP В 2006 году в Intel® компиляторах версии 9.1 появилась поддержка Cluster OpenMP. Технология Cluster OpenMP поддерживает выполнение OpenMP программ на нескольких вычислительных узлах, объединенных сетью. Базируется на программной реализации DSM (Thread Marks software by Rice University). Для компилятора Intel® C++: icc -cluster-openmp options source-file icc -cluster-openmp-profile options source-file Для компилятора Intel® Fortran: ifort -cluster-openmp options source-file ifort -cluster-openmp-profile options source-file kmp_cluster.ini --hostlist=home,remote --process_threads=2

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 193 из 209 Преимущества Intel Cluster OpenMP Упрощает распределение последовательного или OpenMP кода по узлам. Позволяет использовать одну и ту же программу для последовательных, многоядерных и кластерных систем. Требует совсем незначительного изменения кода программы, что упрощает отладку. Позволяет слегка измененной OpenMP-программе выполняться на большем числе процессоров без вложений в аппаратную составляющую SMP. Представляет собой альтернативу MPI, которая может быть быстрее освоена и применена.

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 194 из 209 Преимущества Intel Cluster OpenMP Переносимость и гибкость упрощает и снижает стоимость разработки приложений. Тип вычислительной системы Аппаратная составляющая расходов Программная составляющая расходов Большие SMP системы с общей памятью и OpenMP Кластерные системы с распределенной памятью и MPI Кластерные системы с распределенной памятью и Cluster OpenMP

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 195 из 209 Директива SHARABLE #pragma intel omp sharable ( variable [, variable …] ) – для Си и Си++ !dir$ omp sharable ( variable [, variable …] ) - для Фортрана определяют переменные, которые должны быть помещены в Distributed Virtual Shared Memory В компиляторе существуют опции, которые позволяют изменить класс переменных, не изменяя текст программы: [-no]-clomp-sharable-argexprs [-no]-clomp-sharable-commons [-no]-clomp-sharable-localsaves [-no]-clomp-sharable-modvars

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 196 из 209 Использование Intel Cluster OpenMP malloc (…) -> kmp_sharable_malloc (…) #include foo * fp = new foo (10); foo * fp = new kmp_sharable foo (10); std::vector * vp = new std::vector ; std::vector > * vp = new kmp_sharable std::vector >;

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 197 из 209 Работа с SHARABLE- переменными

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 198 из 209 Использование Intel Cluster OpenMP Целесообразно: если программа дает хорошее ускорение при использовании технологии OpenMP: Speedup = Time(1thread)/Time (n threads) = ~n еcли программа требует малой синхронизации данные в программе хорошо локализованы Наиболее целесообразно для задач (RMS - recognition, mining, and synthesis): Обработка больших массивов данных Рендеринг в графике Поиск Распознавание образов Выделение последовательностей в генетике

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 199 из 209 Использование Intel Cluster OpenMP 1. a particle-simulation code 2. a magneto-hydro-dynamics code 3. a computational fluid dynamics code 4. a structure-simulation code 5. a graph-processing code 6. a linear solver code 7. an x-ray crystallography code

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 200 из 209 Гибридная модель параллельного программирования MPI/OpenMP Данные Core Данные Вычисления Core … Узел 0 OpenMP Core Данные Вычисления Core … Узел N OpenMP Вычисления MPI

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 201 из 209 Алгоритм Якоби на языке Fortran 77 PROGRAM JAC_F77 PARAMETER (L=8, ITMAX=20) REAL A(L,L), B(L,L) PRINT *, '********** TEST_JACOBI **********' DO IT = 1, ITMAX DO J = 2, L-1 DO I = 2, L-1 A(I, J) = B(I, J) ENDDO DO J = 2, L-1 DO I = 2, L-1 B(I, J) = (A(I-1, J) + A(I, J-1) + * A(I+1, J) + A(I, J+1)) / 4 ENDDO END

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 202 из 209 Алгоритм Якоби на языке Fortran OpenMP PROGRAM JAC_F77 PARAMETER (L=8, ITMAX=20) REAL A(L,L), B(L,L) PRINT *, '********** TEST_JACOBI **********' !$OMP PARALLEL SHARED (A,B) PRIVATE(I,J,IT) DO IT = 1, ITMAX !$OMP DO DO J = 2, L-1 DO I = 2, L-1 A(I, J) = B(I, J) ENDDO !$OMP DO DO J = 2, L-1 DO I = 2, L-1 B(I, J) = (A(I-1, J) + A(I, J-1) + * A(I+1, J) + A(I, J+1)) / 4 ENDDO !$OMP END PARALLEL END

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 203 из 209 Distribution of array A [8][8]

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 204 из 209 Алгоритм Якоби в модели MPI/OpenMP PROGRAM JAC_MPI_OpenMP include 'mpif.h' integer me, nprocs PARAMETER (L=8, ITMAX=20, LC=2, LR=2) REAL A(0:L/LR+1,0:L/LC+1), B(L/LR,L/LC) integer dim(2), coords(2) logical isper(2) integer status(MPI_STATUS_SIZE,4), req(8), newcomm integer srow,lrow,nrow,scol,lcol,ncol,up,pdown,pleft,pright dim(1) = LR dim(2) = LC isper(1) =.false. isper(2) =.false. reor =.true. call MPI_Init( ierr ) call MPI_Comm_rank( mpi_comm_world, me, ierr ) call MPI_Comm_size( mpi_comm_world, nprocs, ierr) call MPI_Cart_create(mpi_comm_world,2,dim,isper,.true., newcomm, ierr)

call MPI_Cart_shift(newcomm,0,1,pup,pdown, ierr) call MPI_Cart_shift(newcomm,1,1,pleft,pright, ierr) call MPI_Comm_rank (newcomm, me, ierr) call MPI_Cart_coords(newcomm,me,2,coords, ierr) C rows of matrix I have to process srow = (coords(1) * L) / dim(1) lrow = (((coords(1) + 1) * L) / dim(1))-1 nrow = lrow - srow + 1 C colomns of matrix I have to process scol = (coords(2) * L) / dim(2) lcol = (((coords(2) + 1) * L) / dim(2))-1 ncol = lcol - scol + 1 call MPI_Type_vector(ncol,1,nrow+2,MPI_DOUBLE_PRECISION, * vectype, ierr) call MPI_Type_commit(vectype, ierr) IF (me.eq. 0) PRINT *, '***** TEST_JACOBI *******' C$OMP PARALLEL SHARED (A,B)PRIVATE(I,J,IT) DO IT = 1, ITMAX C$OMP DO DO J = 1, ncol DO I = 1, nrow A(I, J) = B(I, J) ENDDO

CCopying shadow elements of array A from Cneighbouring nodes before loop execution C$OMP MASTER call MPI_Irecv(A(1,0),nrow,MPI_DOUBLE_PRECISION, * pleft, 1235, MPI_COMM_WORLD, req(1), ierr) call MPI_Isend(A(1,ncol),nrow,MPI_DOUBLE_PRECISION, * pright, 1235, MPI_COMM_WORLD,req(2), ierr) call MPI_Irecv(A(1,ncol+1),nrow,MPI_DOUBLE_PRECISION, * pright, 1236, MPI_COMM_WORLD, req(3), ierr) call MPI_Isend(A(1,1),nrow,MPI_DOUBLE_PRECISION, * pleft, 1236, MPI_COMM_WORLD,req(4), ierr) call MPI_Irecv(A(0,1),1,vectype, * pup, 1237, MPI_COMM_WORLD, req(5), ierr) call MPI_Isend(A(nrow,1),1,vectype, * pdown, 1237, MPI_COMM_WORLD,req(6), ierr) call MPI_Irecv(A(nrow+1,1),1,vectype, * pdown, 1238, MPI_COMM_WORLD, req(7), ierr) call MPI_Isend(A(1,1),1,vectype, * pup, 1238, MPI_COMM_WORLD,req(8), ierr) call MPI_Waitall(8,req,status, ierr) C$OMP END MASTER C$OMP BARRIER

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 207 из 209 C$OMP DO DO J = 2, ncol-1 DO I = 2, nrow-1 B(I, J) = (A( I-1, J ) + A( I, J-1 ) + * A( I+1, J) + A( I, J+1 )) / 4 ENDDO C$OMP END PARALLEL call MPI_Finalize(ierr) END программисту надо знать и уметь использовать две разные модели параллелизма и разные инструментальные средства Алгоритм Якоби в модели MPI/OpenMP

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 208 из 209 Литература OpenMP Application Program Interface Version 3.0, May Антонов А.С. Параллельное программирование с использованием технологии OpenMP: Учебное пособие.-М.: Изд-во МГУ, Э. Таненбаум, М. ван Стеен. Распределенные системы. Принципы и парадигмы. – СПб. Питер, 2003 Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. – СПб.: БХВ-Петербург, Jay P. Hoeflinger. Extending OpenMP to Clusters Rolf Rabenseifner, Bettina Krammer. OpenMP on MPPs and clusters of SMP nodes using Intel ® Compilers with Cluster OpenMP

Всероссийская школа «Суперкомпьютерные технологии в образовании, науке и промышленности» 27 октября Н. Новгород, 2009 Технологии параллельного программирования: OpenMP 209 из 209 Авторы Крюков Виктор Алексеевич, доктор физико-математических наук, заведующий отделом Института прикладной математики им. М.В. Келдыша РАН, профессор кафедры системного программирования факультета вычислительной математики и кибернетики Московского университета им. М.В. Ломоносова, Бахтин Владимир Александрович, кандидат физико-математических наук, заведующий сектором Института прикладной математики им. М.В. Келдыша РАН,