Суперкомпьютеры и параллельная обработка данных Бахтин Владимир Александрович Бахтин Владимир Александрович к.ф.-м.н., ведущий научный сотрудник Института прикладной математики им М.В.Келдыша РАН доцент кафедра системного программирования факультет вычислительной математики и факультет вычислительной математики и кибернетики Московского университета им. М.В. Ломоносова
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Суперкомпьютеры и параллельная обработка данных
Бахтин Владимир АлександровичБахтин Владимир Александровичк.ф.-м.н., ведущий научный сотрудник Института прикладной математики им М.В.Келдыша РАНдоцент кафедра системного программирования факультет вычислительной математики ифакультет вычислительной математики и кибернетики Московского университета им. М.В. Ломоносова
Содержание
Введение в предмет Тенденции развития современных вычислительных систем OpenMP – модель параллелизма по управлению Конструкции распределения работы Конструкции для синхронизации нитей Система поддержки выполнения OpenMP-программ. Новые возможности OpenMP
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 2 из 274
Тематический план учебной дисциплины
Введение в предмет Архитектура параллельных вычислительных системМетоды оценки производительности параллельных вычислительных систем
Технологии параллельного программирования Введение в теорию анализа структуры программ и алгоритмов
В Введение в параллельные методы решения задач
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 3 из 274
Литература
Лацис А.О. Параллельная обработка данных: учеб. пособие ц р р д удля студ. вузов. Издательский центр «Академия». 2010. Издательство: Академия
Якобовский М.В. Введение в параллельные методы решения задач. Учебное пособие. Серия: «Суперкомпьютерное образование» Издательство МГУ 2013образование». Издательство МГУ. 2013.
Вл. В. Воеводин, В. В. Воеводин. Параллельные вычисления — СПб., БХВ-Петербург, 2002, 608 с.С б , е ербур , 00 , 608 с
Антонов А.С. Технологии параллельного программирования MPI и OpenMP: Учеб. пособие. Предисл.: В.А.Садовничий. -Серия «Суперкомпьютерное образование». М.: Издательство Московского университета, 2012.-344 с.
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 4 из 274
Суперкомпьютеры – что это?
Суперкомпьютером называется вычислительная система, б й йвычислительное быстродействие которой многократно выше, чем у
современных ей комьютеров массового выпуска.
5 сентябряМосква, 2019 5 из 274
Суперкомпьютеры – что это?
Суперкомпьютеры – это компьютеры, которые работают значительно быстрее остальной массы современных компьютеровбыстрее остальной массы современных компьютеров
Суперкомпьютеры – это компьютеры, которые занимают большой зал Суперкомпьютеры – это компьютеры, которые весят больше 1 тонныу р р р , р Суперкомпьютеры – это компьютеры, которые стоят больше 1
млн.долл. Суперкомпьютеры – это компьютеры, которые сводят проблему
вычислений к проблеме ввода/вывода Суперкомпьютеры – это компьютеры, мощности которых лишь Суперкомпьютеры это компьютеры, мощности которых лишь
немного не хватает для решения актуальных вычислительно сложных задач
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 6 из 274
Cуперкомпьютерные системы (Top500)
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 7 из 274
Производительность компьютеров. Тест Linpack
Тест Linpack - решение системы линейных алгебраических уравнений с плотной матрицейс плотной матрицей.1. Матрица 100*100, фиксированный текст программы.2. Linpack TPP: матрица 1000*1000, можно менять метод и текст p р ц , дпрограммы. Сложность : 2n3/3+2n2.3. High Performance Linpack: матрица любого размера, множество дополнительных параметровдополнительных параметров.
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 8 из 274
Суперкомпьютерные системы (Top500)
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 9 из 274
Поколения архитектур и парадигмы программированияСередина 70-х годов.
Векторно-конвейерные компьютерыр р р
Особенности архитектуры: векторныефункциональные устройства,функциональные устройства, зацепление функциональных устройств, векторные команды в системе команд векторные регистрысистеме команд, векторные регистры. Программирование: векторизация самых внутренних циклов.
Cray Fortran первый компилятор с Fortran векторизацией
Суперкомпьютер Cray-1Пиковая производительность
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 10 из 274
машины — 133 Мфлопса.
Поколения архитектур и парадигмы программированияНачало 80-х годов.Векторно-параллельные компьютеры
Особенности архитектуры: векторные функциональные устройства, зацепление функциональныхзацепление функциональных устройств, векторные команды в системе команд, векторные регистрырегистры. Небольшое число процессоров объединяются над общей памятьюнад общей памятью. Программирование: векторизация самых внутренних циклов и распараллеливание на внешнем уровне, единое адресное пространство, локальные и
Суперкомпьютеры Cray X-MP, Cray Y-MP
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 11 из 274
глобальные переменные.
Поколения архитектур и парадигмы программированияНачало 90-х годов.Массивно-параллельные компьютеры
Особенности архитектуры: тысячи процессоров объединяются с помощью коммуникационной сети по некоторойкоммуникационной сети по некоторой топологии, распределенная память.
Программирование: обменПрограммирование: обмен сообщениями, отсутствие единого адресного пространства, PVM Message Passing InterfacePVM, Message Passing Interface.Необходимость выделения массового параллелизма, явного распределения данных и согласования параллелизма с распределением.
Суперкомпьютер Cray T3D,307 Гф
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 12 из 274
307 Гфлопс
Поколения архитектур и парадигмы программированияСередина 90-х годов.Параллельные компьютеры с общей памятью
Особенности архитектуры: сотни процессоров объединяются надпроцессоров объединяются над общей памятью.
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 13 из 274
Поколения архитектур и парадигмы программированияНачало 2000-x.Кластеры из узлов с общей памятьюОсобенности архитектуры: большое число
бмногопроцессорных узлов объединяются вместе с помощью коммуникационной сети по некоторой топологии, распределенная память; в рамках каждого узла несколькопамять; в рамках каждого узла несколько (многоядерных) процессоров объединяются над общей памятью.
Программирование: неоднородная схема MPI+OpenMP; необходимость выделения массового параллелизма явноемассового параллелизма, явное распределение данных, обмен сообщениями на внешнем уровне; распараллеливание в едином адресном
СКИФ МГУ «Чебышев»,60 Тфлопсраспараллеливание в едином адресном
пространстве, локальные и глобальные переменные на уровне узла с общей памятью.
60 Тфлопс
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 14 из 274
Поколения архитектур и парадигмы программированияСередина 2000-x.Кластеры из узлов с общей памятью и ускорителямиО б бОсобенности архитектуры: большое число многопроцессорных узлов объединяются вместе с помощью коммуникационной сети по некоторой топологиисети по некоторой топологии, распределенная память; в рамках каждого узла несколько (многоядерных) процессоров объединяютсяпроцессоров объединяются над общей памятью; на каждом узле несколько ускорителей (GPU, PHI).
Программирование: MPI+OpenMP+CUDA/OpenCL МГУ «Ломоносов», 1.7 Пфлопс
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 15 из 274
Поколения архитектур и парадигмы программированияС 1976 года до наших дней:
70-е – Векторизация циклов 80-е – Распараллеливание циклов (внешних) + Векторизация р ( ) р
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 21 из 274
Сверхвысокая производительность ‐ зачем?
Моделирование нефтяных резервуаров: Нефтеносная область 100*100*100 точек Нефтеносная область – 100 100 100 точек в каждой точке вычисляется от 5 до 20 функций
(скорость давление концентрация температура )(скорость, давление, концентрация, температура, …)
200-1000 операций для вычисления каждой функции в каждой точкефункции в каждой точке
100-1000 шагов по времени
Итого: 106 (точек сетки) * 10 (функций) * * 500 (операций) * 500 (шагов) = = 2500 млрд. операций
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 22 из 274
Сверхвысокая производительность ‐ зачем?
Courtesy of P.Ricoux, Total, France
DreamWorks
ШРЕК ТРЕТИЙ СуперкомпьютерныйШРЕК ТРЕТИЙ СуперкомпьютерныйШРЕК ТРЕТИЙ. Суперкомпьютерный…ШРЕК ТРЕТИЙ. Суперкомпьютерный…
• 24 кадра в секунду• более 120 000 кадров в фильме• обработка кадров независимо друг от друга• кадр обрабатывается одним процессором• в среднем 2 часа на один вариант одного кадрав среднем 2 часа на один вариант одного кадра• всего: более 20 млн. процессорочасов• всего: более 30 Тбайт данных• всего: более 30 Тбайт данных• использованный суперкомпьютер: более 8000 процессорных ядерпроцессорных ядер
Рост производительности
7‐8 лет
12‐13 лет ПК60 Gflop/s
Mobile1 Gflop/s18‐20 лет
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 26 из 274
Важные сокращенияМега (Mega) – 106 (миллион)Гига (Giga) – 109 (биллион / миллиард)Тера (Tera) 1012 (триллион)Тера (Tera) – 1012 (триллион)Пета (Peta) – 1015 (квадриллион)Экза (Exa) – 1018 (квинтиллион)Э за ( a) 0 ( ви иллио )
Флоп/с, Flop/s – Floating point operations per second
15 Tflop/s = 15 * 1012 арифметических операций15 Tflop/s = 15 1012 арифметических операций в секунду над вещественными данными, представленными в форме с плавающей точкой.р ф р щ
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 27 из 274
Важные сокращенияМега (Mega) – 106 (миллион)Гига (Giga) – 109 (биллион / миллиард)Тера (Tera) 1012 (триллион)Тера (Tera) – 1012 (триллион)Пета (Peta) – 1015 (квадриллион)Экза (Exa) – 1018 (квинтиллион)Э за ( a) 0 ( ви иллио )
Флоп/с, Flop/s – Floating point operations per second
15 Tflop/s = 15 * 1012 арифметических операций15 Tflop/s = 15 1012 арифметических операций в секунду над вещественными данными, представленными в форме с плавающей точкой.р ф р щ
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 28 из 274
Годы, флопсы и степень параллелизма(когда и как был достигнут очередной 'X'flops)(когда и как был достигнут очередной X flops)
Mflops 1964 г. CDC 6600 10 MHz 1 CPUs106 pGflops 1985 г. Cray 2 125 MHz 8 CPUsTflops 1997 г. ASCI Red 200 MHz 9152 CPUs
109
1012 pPflops 2008 г. Roadrunner 3,2 GHz 122400 CoresEflops 2020 г. 108 – 109
1015
1018 Eflops 2020 г. 10 10
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 29 из 274
Увеличение производительности компьютеров:за счет чего?за счет чего?
EDSAC, 1949 год Cray Titan, 2012EDSAC, 1949 год Cray Titan, 2012 год
изменениеизменениетакт: 2*10 –6 с 4.4*103 4.5*10 –10 с (2.2 GHz)
произв.: 102 оп/с 1.7*1014 1.7*1016 оп/c
Время такта = 1/(тактовая частота)
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 30 из 274
Увеличение производительности компьютеров:за счет чего?за счет чего?
EDSAC, 1949 год Cray Titan, 2012 дгод
изменениетакт: 2*10 –6 с 4.4*103 4.5*10 –10 с (2.2 GHz)
произв.: 102 оп/с 1.7*1014 1.7*1016 оп/cр
Два вывода.Два вывода.1 Б б й б б1 Б б й б б1. Безусловно, без развития элементной базы не было 1. Безусловно, без развития элементной базы не было бы такого прогресса в развитии компьютеров.бы такого прогресса в развитии компьютеров.2 Но основной вклад в увеличении2 Но основной вклад в увеличении2. Но основной вклад в увеличении 2. Но основной вклад в увеличении производительности компьютеров производительности компьютеров –– это развитие это развитие архитектуры, и прежде всего, за счет глубокого архитектуры, и прежде всего, за счет глубокого р ур р ур ур р увнедрения идей параллелизмавнедрения идей параллелизма
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 31 из 274
Тенденции развития современных процессоров
В течение нескольких десятилетий развитие ЭВМ сопровождалось удвоением их быстродействия каждые 1.5-2 года. Это обеспечивалось и
йповышением тактовой частоты и совершенствованием архитектуры (параллельное и конвейерное выполнение команд). Узким местом стала оперативная память. Знаменитый закон Мура, так хорошо работающий для процессоров, совершенно не применим для памяти, где скорости доступа удваиваются в лучшем случае каждые 5-6 лет. Совершенствовались системы кэш-памяти, увеличивался объем, усложнялись алгоритмы ее использования. Для процессора Intel Itanium:Для процессора Intel Itanium:Latency to L1: 1-2 cyclesLatency to L2: 5 - 7 cyclesLatency to L3: 12 - 21 cyclesLatency to memory: 180 – 225 cyclesВажным параметром становится - GUPS (Giga Updates Per Second)
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 32 из 274
Важным параметром становится GUPS (Giga Updates Per Second)
Тенденции развития современных процессоров
Поток или нить (по-английски “thread”) – это легковесный процесс,
В П В ПВ ППоток
увеличили производительность процессора в 2 раза
р ц ,имеющий с другими
потоками общие ресурсы, включая общую
оперативную память.
Время
В П В ПВ ППотокоперативную память.
В П В ПВ П
В П В ПВ П
Поток 3
Поток 4
В П В ПВ П
В П В ПВ П
Поток 2
Поток 3Chip
MultiThreading
Время
В П В ПВ ППоток 1
В П5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 33 из 274
ВремяВ - вычисления П - доступ к памяти
Cуперкомпьютерные системы (Top500)
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 34 из 274
Cуперкомпьютерные системы (Top500)
№ 20 в Top 500Суперкомпьютер K computer, SPARC64 VIIIfx 2.0GHz, Tofu Су ер о ю ер co pute , S C6 0G , o u
interconnect Пиковая производительность - 11280 TFlop/s Число ядер в системе — 705 024 Производительность на Linpack - 10510 TFlop/s (93.17 % от пиковой) Энергопотребление комплекса - 12659 89 кВт Энергопотребление комплекса - 12659.89 кВт
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 35 из 274
CPUMIPS64R6 ( P6600 ) L1 I:64KB+D:64KB ( each core )CPU L1 I:64KB+D:64KB ( each core ) L2 2MB
Process Node 16 nm FinFET
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 52 из 274
Power 130 W
Тенденции развития современных вычислительных систем
Темпы уменьшения латентности памяти гораздо ниже темпов ускорения процессоров + прогресс в технологии изготовления кристаллов => CMT (Chip MultiThreading)
Опережающий рост потребления энергии при росте тактовой частоты Опережающий рост потребления энергии при росте тактовой частоты + прогресс в технологии изготовления кристаллов => CMP (Chip MultiProcessing, многоядерность)
И б б б И то и другое требует более глубокого распараллеливания для эффективного использования аппаратуры
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 53 из 274
Существующие подходы для создания параллельных программ для современных процессоров/системпрограмм для современных процессоров/систем Автоматическое / автоматизированное распараллеливание Библиотеки нитей Библиотеки нитей
Win32 APIPOSIX
Библиотеки передачи сообщенийMPI SHMEM
OpenMP CUDA CUDA OpenACC DVMH
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 54 из 274
Вычисление числа
4.01
4.0(1+x2) dx =
0
4.0
Мы можем аппроксимировать интеграл
N
как сумму прямоугольников:2.0
F(xi)x i = 0
Где каждый прямоугольникГде каждый прямоугольник имеет ширину x и высоту F(xi) в середине интервала
1.0X0.0
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 55 из 274
F(xi) в середине интервалаX
Вычисление числа . Последовательная программа
#include <stdio.h>int main (){
int n =100000, i;double pi, h, sum, x;double pi, h, sum, x;h = 1.0 / (double) n;sum = 0.0;for (i = 1; i <= n; i ++){
x = h * ((double)i - 0.5);x h ((double)i 0.5);sum += (4.0 / (1.0 + x*x));
}i h *pi = h * sum;
printf("pi is approximately %.16f”, pi);return 0;
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 56 из 274
icc -parallel pi.cpi.c(8): (col. 5) remark: LOOP WAS AUTO-PARALLELIZED.pi c(8): (col 5) remark: LOOP WAS VECTORIZEDpi.c(8): (col. 5) remark: LOOP WAS VECTORIZED.pi.c(8): (col. 5) remark: LOOP WAS VECTORIZED.
В общем случае, автоматическое распараллеливание затруднено: косвенная индексация (A[B[i]]); указатели (ассоциация по памяти); указатели (ассоциация по памяти); сложный межпроцедурный анализ.
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 57 из 274
icc -guide -parallel test cppicc guide parallel test.cpp
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 58 из 274
Автоматизированное распараллеливание
test.cpp(49): remark #30521: (PAR) Loop at line 49 cannot be parallelized due to conditional assignment(s) into the following variable(s): b. This loopdue to conditional assignment(s) into the following variable(s): b. This loop will be parallelized if the variable(s) become unconditionally initialized at the top of every iteration. [VERIFY] Make sure that the value(s) of the variable(s) read in any iteration of the loop must have been written earlier ( ) y pin the same iteration.
test.cpp(49): remark #30525: (PAR) If the trip count of the loop at line 49 is greater than 188, then use "#pragma loop count min(188)" to parallelizegreater than 188, then use #pragma loop count min(188) to parallelize this loop. [VERIFY] Make sure that the loop has a minimum of 188 iterations.
#pragma loop count min (188)#pragma loop count min (188)for (i=0; i<n; i++) {
CreateThread(0,0,(LPTHREAD_START_ROUTINE) Pi,&threadArg[i], 0, &threadID);WaitForMultipleObjects(NUM_THREADS, threadHandles, TRUE,INFINITE);printf("pi is approximately %.16f”, pi);
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 60 из 274
pi *= h;x = h ((double)i - 0.5);sum[MYTHREAD] += (4.0 / (1.0 + x*x));
}
pi *= h; printf("pi is approximately %.16f", pi);
}
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 68 из 274
return 0;}
CPU или GPU
5 сентябряМосква, 2019 Суперкомпьютеры и параллельная обработка данных 69 из 274
#include <stdio h>Вычисление числа с использованием CUDA#include <stdio.h>#include <cuda.h>#define N 1000000#define NUM_BLOCK 32 // Number of thread blocks#define NUM_THREAD 32 // Number of threads per blockint tid;int tid;float pi = 0;// Kernel that executes on the CUDA device__global__ void cal_pi(float *sum) {
int i;float x, step=1.0/N; // Step sizefloat x, step 1.0/N; // Step size// Sequential thread index across the blocks int idx = blockIdx.x*blockDim.x+threadIdx.x; f (i id i N i NUM BLOCK*NUM THREAD) {for (i=idx; i< N; i+=NUM_BLOCK*NUM_THREAD) {
x = (i+0.5)*step;sum[idx] += 4.0/(1.0+x*x);[ ] ( );
70 из 274Суперкомпьютеры и параллельная обработка данных5 сентябряМосква, 2019
Вычисление числа с использованием CUDAint main(void) { // Main routine that executes on the host
dim3 dimGrid(NUM_BLOCK,1,1); // Grid dimensionsdim3 dimBlock(NUM_THREAD,1,1); // Block dimensionsfloat *sumHost, *sumDev; // Pointer to host & device arrayssize_t size = NUM_BLOCK*NUM_THREAD*sizeof(float); //Array sizesumHost = (float *)malloc(size); // Allocate array on host( ) ( ); ycudaMalloc((void **) &sumDev, size); // Allocate array on devicecudaMemset(sumDev, 0, size); // Initialize array in device to 0// Do calculation on device// Do calculation on devicecal_pi <<<dimGrid, dimBlock>>> (sumDev); // call CUDA kernel// Retrieve result from device and store it in host array
d M ( H t D i d M D i T H t)cudaMemcpy(sumHost, sumDev, size, cudaMemcpyDeviceToHost);for(tid=0; tid<NUM_THREAD*NUM_BLOCK; tid++) pi += sumHost[tid];pi *= step;printf("PI = %f\n",pi); // Print resultsfree(sumHost); // CleanupcudaFree(sumDev);return 0;
Intel 2.4 GHz Xeon 0.3 4.3I t l 1 4 GH It i 2 1 8 6 4Intel 1.4 GHz Itanium 2 1.8 6.4
Суперкомпьютеры и параллельная обработка данных 76 из 2745 сентябряМосква, 2019
https://computing.llnl.gov/tutorials/pthreads/
Достоинства использования OpenMP вместо MPI для многоядерных процессоров Возможность инкрементального распараллеливания Упрощение программирования и эффективность на нерегулярных
многоядерных процессоров
У роще е ро ра ро а эффе ос а ере у рвычислениях, проводимых над общими данными
Ликвидация дублирования данных в памяти, свойственного MPI-программампрограммам
Объем памяти пропорционален быстродействию процессора. В последние годы увеличение производительности процессора достигается удвоением числа ядер, при этом частота каждого ядра снижается. Наблюдается тенденция к сокращению объема оперативной памяти, приходящейся на одно ядро. Присущая р , р д щ д др р ущOpenMP экономия памяти становится очень важна.
Наличие локальных и/или разделяемых ядрами КЭШей будут учитываться при оптимизации OpenMP программ компиляторамиучитываться при оптимизации OpenMP-программ компиляторами, что не могут делать компиляторы с последовательных языков для MPI-процессов.
Суперкомпьютеры и параллельная обработка данных 77 из 2745 сентябряМосква, 2019
Тесты NAS
BT 3D Навье-Стокс, метод переменных направлений
CG Оценка наибольшего собственного значения симметричной разреженной матрицы
EP Генерация пар случайных чисел ГауссаFT Быстрое преобразование Фурье, 3D спектральный р р р ур р
методIS Параллельная сортировкаLU 3D Навье Стокс метод верхней релаксацииLU 3D Навье-Стокс, метод верхней релаксацииMG 3D уравнение Пуассона, метод MultigridSP 3D Навье-Стокс Beam-Warning approximateSP 3D Навье-Стокс, Beam-Warning approximate
factorization
Суперкомпьютеры и параллельная обработка данных 78 из 2745 сентябряМосква, 2019
Тесты NAS
Analyzing the Effect of Different Programming Models Upon Performance and Memory Usage on Cray XT5 Platformshttps://www nersc gov/assets/NERSC-Staff-Publications/2010/Cug2010Shan pdf
Суперкомпьютеры и параллельная обработка данных 79 из 274
Analyzing the Effect of Different Programming Models Upon Performance and Memory Usage on Cray XT5 Platformshttps://www nersc gov/assets/NERSC-Staff-Publications/2010/Cug2010Shan pdf
Суперкомпьютеры и параллельная обработка данных 80 из 274
Тенденции развития современных вычислительных систем OpenMP – модель параллелизма по управлению Конструкции распределения работы Конструкции для синхронизации нитей Система поддержки выполнения OpenMP-программ Новые возможности OpenMP
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 81 из 274
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 82 из 274
OpenMP Architecture Review Board
AMD ARM
ANL ASC/LLNL ARM
Cray Fujitsu HP
ASC/LLNL cOMPunity EPCC LANL HP
IBM Intel
Mi
LANL LBNL NASA
ORNL Micron NEC NVIDIA
ORNL RWTH Aachen University Texas Advanced Computing
C t Oracle Corporation Red Hat Texas Instrument
Center SNL- Sandia National Lab BSC - Barcelona
S ti C tSupercomputing Center University of Houston
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 83 из 274
Cимметричные мультипроцессорные системы (SMP)
В б й й Все процессоры имеют доступ к любой точке памяти с одинаковой скоростью.
Процессоры подключены к памяти либо с помощью общей шины, р ц р д щ щ ,либо с помощью crossbar-коммутатора.
Аппаратно поддерживается когерентность кэшей.
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 84 из 274
Например, серверы HP 9000 V-Class, Convex SPP-1200,…
Системы с неоднородным доступом к памяти (NUMA)
Система состоит из однородных базовых модулейоднородных базовых модулей (плат), состоящих из небольшого числа процессоров и блока памятии блока памяти.
Модули объединены с помощью высокоскоростного коммутатора.
NetBSD, OpenBSD, DragonFly BSD, HPUX, RTEMS Intel 17.0: Linux, Windows and MacOSOpenMP 4.0: Oracle Developer Studio12.5: Linux and Solaris Oracle Developer Studio12.5: Linux and Solaris Cray Compiling Environment (CCE) 8.5 LLVM: clang Linux and MacOSOpenMP 3.0: PGI 8.0: Linux and Windows IBM 10.1: Linux and AIX http://www.openmp.org/resources/
Absoft Pro FortranMP: 11.1 NAG Fortran Complier 5.3П O MP
p p p gopenmp‐compilers/
Предыдущие версии OpenMP: Lahey/Fujitsu Fortran 95 PathScale
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 91 из 274
Microsoft Visual Studio 2008 C++ HP
Компиляция OpenMP‐программы
Производитель Компилятор Опция компиляции
GNU gcc -fopenmp
LLVM clang -fopenmpLLVM clang fopenmp
IBM XL C/C++ / Fortran -qsmp=omp
Oracle C/C++ / Fortran -xopenmp
Intel C/C++ / Fortran -openmp, -qopenmp/Qopenmp
Portland Group C/C++ / Fortran -mp
Mi ft Vi l St di 2008 C /5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 92 из 274
Microsoft Visual Studio 2008 C++ /openmp
Условная компиляция OpenMP‐программы
#include <stdio.h>#i l d h // О ф й#include <omp.h> // Описаны прототипы всех функций и типовint main(){{#ifdef _OPENMP
printf("Compiled by an OpenMP-compliant implementation.\n");p ( p y p p p );int id = omp_get_max_threads ();
#endifreturn 0;
}В й OPENMP ф ( )В значении переменной _OPENMP зашифрован год и месяц (yyyymm) версии стандарта OpenMP, которую поддерживает компилятор.
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 93 из 274
Выполнение OpenMP‐программы
Fork-Join параллелизм: Г ( t ) (t ) й Главная (master) нить порождает группу (team) нитей по мере
небходимости. Параллелизм добавляется инкрементально.р р
Параллельные области
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 94 из 274
Модель памяти в OpenMP
001Нить
001Нить001Нить
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 95 из 274
Фрагмент программы
int a, b, c, d, x, y; // переменныеint *p, *q; // указателиint f(int *p, int *q); // прототип функции...a = x * (x - 1); // a хранится в регистреb = y * (y + 1); // b хранится в регистреy (y ); р р рc = a * a + a * b + b * b; // будет использовано позднееd = a * b * c; // будет использовано позднееp = &a; // получает адрес aq = &b; // получает адрес bx = f(p q); // вызов функцииx = f(p, q); // вызов функции
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 96 из 274
Когерентность и консистентность памяти
P0: W(x)a R(y)b Время
P1: W(y)b R(y)b R(x)a W(x)b
Процессор
Процессор
Кэш Кэш
Оперативная память
Оперативная память
Сеть передачи данных р
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 97 из 274
Модели консистентности памяти
Модель консистентности представляет собой некоторый договор между бпрограммами и памятью, в котором указывается, что при соблюдении
программами определенных правил работа памяти будет корректной, если же требования к программе будут нарушены, то память не гарантирует правильность выполнения операций чтения/записи.
Далее рассматриваются основные модели консистентности Далее рассматриваются основные модели консистентности.
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 98 из 274
Строгая консистентность
Операция чтения ячейки памяти с адресом X должна возвращать й й й Xзначение, записанное самой последней операцией записи с адресом X,
называется моделью строгой консистентности.a) строгая консистентность) р
P0: W(x)a Время
P1: R(x)a
б) нестрогая консистентность
P0: W(x)a Время
P1 R( )NIL R( )aP1: R(x)NIL R(x)a5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 99 из 274
Последовательная консистентность
Впервые определил Lamport в 1979 г. в контексте совместно йиспользуемой памяти для мультипроцессорных систем.
Результат выполнения должен быть тот-же, как если бы операторы всех процессоров выполнялись бы в некоторой последовательности, причем р ц р р д , роперации каждого отдельного процесса выполнялись бы в порядке, определяемой его программой.
Последовательная консистентность не гарантирует что операция чтения Последовательная консистентность не гарантирует, что операция чтения возвратит значение, записанное другим процессом наносекундой или даже минутой раньше, в этой модели только точно гарантируется, что все
йпроцессы знают последовательность всех записей в память.
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 100 из 274
Последовательная консистентность
а) удовлетворяет последовательной консистентности
P1 W(x)aP1 W(x)a
P2 W(x)b
P3 R(x)b R(x)a
P4 R(x)b R(x)a
б) не удовлетворяет последовательной консистентности
P1 W(x)aP1 W(x)a
P2 W(x)b
P3 R(x)b R(x)a
P4 R(x)a R(x)b( ) ( )
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 101 из 274
Причинная консистентность
Предположим, что процесс P1 модифицировал переменную x, затем процесс P2 прочитал x и модифицировал y В этом случаепроцесс P2 прочитал x и модифицировал y. В этом случае модификация x и модификация y потенциально причинно зависимы, так как новое значение y могло зависеть от прочитанного значения
й С йпеременной x. С другой стороны, если два процесса одновременно изменяют значения различных переменных, то между этими событиями нет причинной связи.
Операции, которые причинно не зависят друг от друга называются параллельными.
Причинная модель консистентности памяти определяется следующим Причинная модель консистентности памяти определяется следующим условием: Последовательность операций записи, которые потенциально причинно зависимы, должна наблюдаться всеми ро есса с с е о а о о ара е е о ера за с опроцессами системы одинаково, параллельные операции записи могут наблюдаться разными процессами в разном порядке.
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 102 из 274
Причинная консистентность
P1 W(x)aНарушение моделиP2 R(x)a W(x)b
P3 R(x)b R(x)a
Нарушение модели причинной консистентности
P4 R(x)a R(x)b
P1 W( ) W( )P1 W(x)a W(x)c
P2 R(x)a W(x)bКорректная последовательность для модели P3 R(x)a R(x)c R(x)b
P4 R(x)a R(x)b R(x)c
для модели причинной консистентности
Определение потенциальной причинной зависимости может осуществляться компилятором посредством анализа зависимости операторов программы по даннымданным.
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 103 из 274
PRAM (Pipelined RAM) и процессорная консистентность
PRAM: Операции записи, выполняемые одним процессором, видны всем остальным процессорам в том порядке, в каком они выполнялись, но операции записи, выполняемые разными процессорами, могут быть видны в произвольном порядке. Записи выполняемые одним процессором могут быть конвейеризованы:Записи выполняемые одним процессором могут быть конвейеризованы: выполнение операций с общей памятью можно начинать не дожидаясь завершения предыдущих операций записи в память.П PRAM Д й йПроцессорная: PRAM + когерентность памяти. Для каждой переменной X есть общее согласие относительно порядка, в котором процессоры модифицируют эту переменную, операции записи в разные переменные -параллельны. Таким образом, к упорядочиванию записей каждого процессора добавляется упорядочивание записей в переменные или группы. ру
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 104 из 274
Слабая консистентность (weak consistency)
Пусть процесс в критической секции циклически читает и записывает значение некоторых переменных. Даже, если остальные процессоры и не пытаются обращаться к этим переменным до выхода первого процесса из критической секции, для удовлетворения требований рассматриваемых ранее моделей консистентности они должны р р р д двидеть все записи первого процессора в порядке их выполнения, что, естественно, совершенно не нужно.
Наилучшее решение в такой ситуации это позволить первому Наилучшее решение в такой ситуации - это позволить первому процессу завершить выполнение критической секции и, только после этого, переслать остальным процессам значения модифицированных
бпеременных, не заботясь о пересылке промежуточных результатов.
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 105 из 274
Слабая консистентность (weak consistency)
Модель слабой консистентности, основана на выделении среди переменных специальных синхронизационных переменных и описывается следующими правилами:
1. Доступ к синхронизационным переменным определяется моделью последовательной консистентности;последовательной консистентности;
2. Доступ к синхронизационным переменным запрещен (задерживается), пока не выполнены все предыдущие операции записи;
3. Доступ к данным (запись, чтение) запрещен, пока не выполнены все предыдущие обращения к синхронизационным переменным. р у р р р
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 106 из 274
Слабая консистентность (weak consistency)
Первое правило определяет, что все процессы видят обращения к синхронизационным переменным в определенном (одном и том же) порядке.
Второе правило гарантирует, что выполнение процессором операции обращения к синхронизационной переменной возможно только послеобращения к синхронизационной переменной возможно только после выталкивания конвейера (полного завершения выполнения на всех процессорах всех предыдущих операций записи переменных, выданных данным процессором)выданных данным процессором).
Третье правило определяет, что при обращении к обычным (не синхронизационным) переменным на чтение или запись, все предыдущие обращения к синхронизационным переменным должны быть выполнены полностью. Выполнив синхронизацию перед обращением к общей переменной, процесс может быть уверен, что р щ щ р , р ц у р ,получит правильное значение этой переменной.
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 107 из 274
Слабая консистентность (weak consistency)
P1 W(x)a W(x)b S
P2 R(x)a R(x)b S
Допустимая последователь-ность событий
P3 R(x)b S
ность событий
P1 W(x)a W(x)b S
P2 S R( )
Недопустимаяпоследовательностьб й P2 S R(x)aсобытий
...
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 108 из 274
Модель памяти в OpenMP
static int i = 0;… = i + 5;#pragma omp flush (i)i = 1
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 109 из 274
Консистентность памяти в OpenMP
Корректная последовательность работы нитей с переменной: Нить0 записывает значение переменной – write (var)р ( ) Нить0 выполняет операцию синхронизации – flush (var) Нить1 выполняет операцию синхронизации – flush (var) Н 1 й d ( ) Нить1 читает значение переменной – read (var)
1: A = 11: A = 1. . .2: flush(A)us ( )
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 110 из 274
Консистентность памяти в OpenMP
#pragma omp flush [(список переменных)]
По умолчанию все переменные приводятся в консистентное состояние(#pragma omp flush):
при барьерной синхронизации; при входе и выходе из конструкций parallel, critical и ordered; при выходе из конструкций распределения работ (for, single, при выходе из конструкций распределения работ (for, single,
sections, workshare), если не указана клауза nowait; при вызове omp_set_lock и omp_unset_lock; t t l k t t l k при вызове omp_test_lock, omp_set_nest_lock,
omp_unset_nest_lock и omp_test_nest_lock, если изменилось состояние семафора.
При входе и выходе из конструкции atomic выполняется #pragma ompflush(x), где x – переменная, изменяемая в конструкции atomic.
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 111 из 274
Консистентность памяти в OpenMP
1. Если пересечение множеств переменных, указанных в операциях flush, выполняемых различными нитями не пустое, то результат выполнения
й fl h б бопераций flush будет таким, как если бы эти операции выполнялись в некоторой последовательности (единой для всех нитей).
2. Если пересечение множеств переменных, указанных в операциях flush, р р , у р ц ,выполняемых одной нитью не пустое, то результат выполнения операций flush, будет таким, как если бы эти операции выполнялись в порядке определяемом программойопределяемом программой.
3. Если пересечение множеств переменных, указанных в операциях flush, пустое, то операции flush могут выполняться независимо (в любом
)порядке).
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 112 из 274
Классы переменных
В модели программирования с разделяемой памятью: • Большинство переменных по умолчанию считаются sharedр у
Глобальные переменные совместно используются всеми нитями(shared) :
Фортран: COMMON блоки SAVE переменные MODULE• Фортран: COMMON блоки, SAVE переменные, MODULE переменные
Но не все переменные являются разделяемыми ...• Стековые переменные в подпрограммах (функциях)• Стековые переменные в подпрограммах (функциях), вызываемых из параллельного региона, являются private.
• Переменные объявленные внутри блока операторов параллельного региона являются приватнымипараллельного региона являются приватными.
• Счетчики циклов витки которых распределяются между нитями при помощи конструкций for и parallel for.
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 113 из 274
Классы переменных
#define N 100double Array1[N];int main() {
extern double Array1[N];void work(int *Array, int i) {int main() {
int Array2[N],i;#pragma omp parallel
{
void work(int Array, int i) {double TempArray[10];static int count;
{int iam = omp_get_thread_num();#pragma omp forfor (i=0;i < N; i++)
...}
for (i 0;i < N; i++)work(Array2, i);
}printf(“%d\n”, Array2[0]);
TempArray, iam, ip ( % , y [ ]);
}TempArray,
iam, iArray1, Array2,
countArray1, Array2,
count
TempArray, iam i
Технология параллельного программирования OpenMP
iam, i
5 сентябряМосква, 2019 114 из 274
Классы переменных
Можно изменить класс переменной при помощи конструкций: shared (список переменных)s a ed (с со ере е ) private (список переменных) firstprivate (список переменных) lastprivate (список переменных) threadprivate (список переменных) default (private | shared | none) default (private | shared | none)
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 115 из 274
Конструкция private
Конструкция «private(var)» создает локальную копию переменной «var» в каждой из нитей.
З й• Значение переменной не инициализировано• Приватная копия не связана с оригинальной переменной• В OpenMP 2 5 значение переменной «var» не определеноВ OpenMP 2.5 значение переменной «var» не определено после завершения параллельной конструкции
sum = -1.0;#pragma omp parallel for private (i j sum)#pragma omp parallel for private (i,j,sum)for (i=0; i< m; i++){
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 116 из 274
Конструкция firstprivate
«firstprivate» является специальным случаем «private»Инициализирует каждую приватную копию соответствующимц ру ду р у у щзначением из главной (master) нити.
BOOL Fi tTi TRUEBOOL FirstTime=TRUE; #pragma omp parallel for firstprivate(FirstTime) for (row=0; row<height; row++) {
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 117 из 274
Конструкция lastprivate
lastprivate передает значение приватной переменной, посчитанной на последней итерации в глобальную переменнуюпоследней итерации в глобальную переменную.
int i;int i;#pragma omp parallel{
#pragma omp for lastprivate(i)#pragma omp for lastprivate(i)for (i=0; i<n-1; i++)
a[i] = b[i] + b[i+1];
}a[i]=b[i]; /*i == n-1*/
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 118 из 274
Директива threadprivate
Отличается от применения конструкции private: private скрывает глобальные переменныеp р р threadprivate – переменные сохраняют глобальную область
видимости внутри каждой нити#pragma omp threadprivate (Var)#pragma omp threadprivate (Var)
Если количество нитей не изменилось, то каждая нить получит
Var = 1 … = Varу
значение, посчитанное в предыдущей параллельной области.
Var = 2 … = Var
5 сентябряМосква, 2019 Технология параллельного программирования OpenMP 119 из 274
Конструкция default
Меняет класс переменной по умолчанию: default (shared) действует по умолчанию default (shared) – действует по умолчанию default (private) – есть только в Fortran default (firstprivate) – есть только в Fortran OpenMP 3.1
itotal = 100 itotal = 100
default (none) – требует определить класс для каждой переменной