МГУ им. М.В. Ломоносова, Москва, 2011 г. Гибридная модель параллельного программирования MPI/OpenMP Бахтин Владимир Александрович Ассистент кафедры системного.

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



Advertisements
Похожие презентации
Гибридная модель параллельного программирования DVM/OpenMP Бахтин В.А. ИПМ им.М.В.Келдыша РАН г. Москва, 5 февраля 2008 г.
Advertisements

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

Fortan OpenMP/DVM - язык параллельного программирования для кластеров В.А. Бахтин, Н.А. Коновалов, В.А. Крюков, Н.В. Поддерюгина Институт прикладной математики.
Гибридная модель параллельного программирования DVM/OpenMP Бахтин В.А. ИПМ им.М.В.Келдыша РАН г. Москва, 20 марта 2008 г.
Фрагмент карты градостроительного зонирования территории города Новосибирска Масштаб 1 : 6000 Приложение 7 к решению Совета депутатов города Новосибирска.
Интернет Университет Суперкомпьютерных технологий Введение Учебный курс Параллельное программирование с OpenMP Бахтин В.А., кандидат физ.-мат. наук, заведующий.
1 Знаток математики Тренажер Таблица умножения 2 класс Школа 21 века ®м®м.
1. Определить последовательность проезда перекрестка
Транксрипт:

МГУ им. М.В. Ломоносова, Москва, 2011 г. Гибридная модель параллельного программирования MPI/OpenMP Бахтин Владимир Александрович Ассистент кафедры системного программированния факультета ВМК, МГУ им. М. В. Ломоносова К.ф.-м.н., зав. сектором Института прикладной математики им М.В.Келдыша РАН

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 2 из 81 Содержание Современные направления развития параллельных вычислительных систем OpenMP – модель параллелизма по управлению Гибридная модель MPI/OpenMP

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 3 из 81 Тенденции развития современных процессоров В течение нескольких десятилетий развитие ЭВМ сопровождалось удвоением их быстродействия каждые года. Это обеспечивалось и повышением тактовой частоты и совершенствованием архитектуры (параллельное и конвейерное выполнение команд). Узким местом стала оперативная память. Знаменитый закон Мура, так хорошо работающий для процессоров, совершенно не применим для памяти, где скорости доступа удваиваются в лучшем случае каждые 5-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)

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 4 из 81 Время Тенденции развития современных процессоров В П В П В П В П В П В П Поток Время В П В П В П Поток 1 В П В П В П В П В П В П ВП В П В П Поток 2 Поток 3 Поток 4 В - вычисления П - доступ к памяти Chip MultiThreading увеличили производительность процессора в 2 раза Поток или нить (по- английски thread) – это легковесный процесс, имеющий с другими потоками общие ресурсы, включая общую оперативную память.

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 5 из 81 Суперкомпьютер Jaguar Cray XT5-HE Opteron Six Core 2.6 GHz Пиковая производительность TFlop/s Число ядер в системе Производительность на Linpack TFlop/s (75.4% от пиковой) Энергопотребление комплекса кВт Важным параметром становится – Power Efficency (Megaflops/watt) Как добиться максимальной производительности на Ватт => Chip MultiProcessing, многоядерность. Тенденции развития современных процессоров

AMD Opteron серии 6100 (Magny- Cours) 6176 SE 12 2,3 ГГц, 12 МБ L3 Cache ,4 ГГц, 12 МБ L3 Cache встроенный контроллер памяти (4 канала памяти DDR3) до 42.7 GB/s 4 канала «точка-точка» с использованием HyperTransort 3.0 до 25.6 GB/s Тенденции развития современных процессоров 28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 6 из 81

Intel Xeon серии 5600 (Nehalem) X ,33 ГГц, 12 нитей, 12 МБ L3 Cache X ,46 ГГц, 8 нитей, 12 МБ L3 Cache Intel® Turbo Boost Intel® Hyper-Threading Intel® QuickPath Intel® Intelligent Power Тенденции развития современных процессоров 28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 7 из 81

Intel Core i7 980X (Gulftown) 3,33 ГГц 6 ядeр 12 потоков с технологией Intel Hyper-Threading 12 МБ кэш-памяти Intel Smart Cache встроенный контроллер памяти (3 канала памяти DDR МГц ) технология Intel QuickPath Interconnect Тенденции развития современных процессоров 28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 8 из 81

Intel Itanium 9350 (Tukwila) 1,73 ГГц 4 ядeр 8 потоков с технологией Intel Hyper-Threading 24 МБ L3 кэш-памяти технология Intel QuickPath Interconnect технология Intel Turbo Boost Тенденции развития современных процессоров 28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 9 из 81

IBM Power7 3,5 - 4,0 ГГц 8 ядер x 4 нити Simultaneuos MultiThreading L1 64КБ L2 256 КБ L3 32 МБ встроенный контроллер памяти Тенденции развития современных процессоров 28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 10 из 81

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 11 из 81 Темпы уменьшения латентности памяти гораздо ниже темпов ускорения процессоров + прогресс в технологии изготовления кристаллов => CMT (Chip MultiThreading) Опережающий рост потребления энергии при росте тактовой частоты + прогресс в технологии изготовления кристаллов => CMP (Chip MultiProcessing, многоядерность) И то и другое требует более глубокого распараллеливания для эффективного использования аппаратуры Тенденции развития современных процессоров

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 12 из 81 Содержание Современные направления развития параллельных вычислительных систем OpenMP – модель параллелизма по управлению Гибридная модель MPI/OpenMP

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 13 из 81 История 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 OpenMP Draft 3.1 OpenMP Draft

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 14 из 81 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

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 15 из 81 Компиляторы, поддеживающие 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++

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 16 из 81 Обзор основных возможностей 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

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 17 из 81 Содержание Современные направления развития параллельных вычислительных систем OpenMP – модель параллелизма по управлению Гибридная модель MPI/OpenMP

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 18 из 81 Данные Core Данные Вычисления Core … Узел 0 OpenMP Core Данные Вычисления Core … Узел N OpenMP Вычисления MPI Гибридная модель MPI/OpenMP

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 19 из 81 Достоинства использования в узлах OpenMP вместо MPI Возможность инкрементального распараллеливания. Упрощение программирования и эффективность на нерегулярных вычислениях, проводимых над общими данными. Ликвидация или сокращение дублирования данных в памяти, свойственного MPI-программам. Дополнительный уровень параллелизма на OpenMP реализовать проще, чем на MPI.

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 20 из 81 Преимущества OpenMP для многоядерных процессоров Объемы оперативной памяти и кэш памяти, приходящиеся в среднем на одно ядро, будут сокращаться – присущая OpenMP экономия памяти становится очень важна. Ядра используют общую Кэш-память, что требуется учитывать при оптимизации программы.

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 21 из 81 National Institute for Computational Sciences. University of Tennessee Суперкомпьютер Kraken Cray XT5-HE Opteron Six Core 2.6 GHz 8 место в TOP Пиковая производительность TFlop/s Число процессоров/ядер в системе / Производительность на Linpack TFlop/s (81% от пиковой) Updrage: замена 4-х ядерных процессоров AMD Opteron на 6-ти ядерные процессоры AMD Opteron Результат: 6-ое место в TOP500 в июне ье место в TOP500 в ноябре 2009

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 22 из 81 National Institute for Computational Sciences. University of Tennessee

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 23 из 81 Межведомственный Суперкомпьютерный Центр Российской Академии Наук Суперкомпьютер MVS-100K 62 место в TOP Пиковая производительность TFlop/s Число процессоров/ядер в системе 2 920/ Производительность на Linpack TFlop/s (76.7% от пиковой) Updrage: замена 2-х ядерных процессоров Intel Xeon 53xx на 4-х ядерные процессоры Intel Xeon 54xx Результат: 57-ое место в TOP500 в июне ое место в TOP500 в ноябре 2008

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 24 из 81 Oak Ridge National Laboratory Суперкомпьютер Jaguar Cray XT5-HE Opteron Six Core 2.6 GHz 2 место в TOP Пиковая производительность TFlop/s Число ядер в системе Производительность на Linpack TFlop/s (75.4% от пиковой) Updrage: замена 4-х ядерных процессоров AMD Opteron на 6-ти ядерные процессоры AMD Opteron Результат: 2-ое место в TOP500 в июне ое место в TOP500 в ноябре 2009

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 25 из 81 Oak Ridge National Laboratory Jaguar Scheduling Policy MIN Cores MAX Cores MAXIMUM WALL-TIME (HOURS)

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 26 из 81 MPI Environment Variable Name1,000 PEs10,000 PEs50,000 PEs100,000 Pes MPI Environment Variable Name128,000 Bytes 20, MPICH_UNEX_BUFFER_SIZE (The buffer allocated to hold the unexpected Eager data) 60 MB 150 MB260 MB MPICH_PTL_UNEX_EVENTS (Portals generates two events for each unexpected message received) 20,480 events 22,000110,000220,000 MPICH_PTL_OTHER_EVENTS (Portals send-side and expected events) 2048 events ,50025,000 Cray MPI: параметры по умолчанию

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 27 из 81 Тесты NAS BT3D Навье-Стокс, метод переменных направлений CGОценка наибольшего собственного значения симметричной разреженной матрицы EPГенерация пар случайных чисел Гаусса FTБыстрое преобразование Фурье, 3D спектральный метод ISПараллельная сортировка LU3D Навье-Стокс, метод верхней релаксации MG3D уравнение Пуассона, метод Multigrid SP3D Навье-Стокс, Beam-Warning approximate factorization

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 28 из 81 Тесты NAS Analyzing the Effect of Different Programming Models Upon Performance and Memory Usage on Cray XT5 Platforms

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 29 из 81 Тесты NAS Analyzing the Effect of Different Programming Models Upon Performance and Memory Usage on Cray XT5 Platforms

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 30 из 81 Тесты NAS Analyzing the Effect of Different Programming Models Upon Performance and Memory Usage on Cray XT5 Platforms

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 31 из 81 Тесты NAS (класс B) Суперкомпьютер MVS-100K mvapich 1.2 Intel compiler, v. 10.1, -O3

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 32 из 81 Тесты NAS (класс B) Суперкомпьютер СКИФ-МГУ «Чебышев» mvapich 1.2 Intel compiler, v. 11.1, -O3

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 33 из 81 Алгоритм Якоби. Последовательная версия /* Jacobi program */ #include #define L 1000 #define ITMAX 100 int i,j,it; double A[L][L]; double B[L][L]; int main(int an, char **as) { printf("JAC STARTED\n"); for(i=0;i

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 34 из 81 Алгоритм Якоби. Последовательная версия /****** iteration loop *************************/ for(it=1; it

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 35 из 81 Алгоритм Якоби. MPI-версия

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 36 из 81 Алгоритм Якоби. MPI-версия /* Jacobi-1d program */ #include #include "mpi.h" #define m_printf if (myrank==0)printf #define L 1000 #define ITMAX 100 int i,j,it,k; int ll,shift; double (* A)[L]; double (* B)[L];

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 37 из 81 Алгоритм Якоби. MPI-версия int main(int argc, char **argv) { MPI_Request req[4]; int myrank, ranksize; int startrow,lastrow,nrow; MPI_Status status[4]; double t1, t2, time; MPI_Init (&argc, &argv); /* initialize MPI system */ MPI_Comm_rank(MPI_COMM_WORLD, &myrank);/*my place in MPI system*/ MPI_Comm_size (MPI_COMM_WORLD, &ranksize); /* size of MPI system */ MPI_Barrier(MPI_COMM_WORLD); /* rows of matrix I have to process */ startrow = (myrank *L) / ranksize; lastrow = (((myrank + 1) * L) / ranksize)-1; nrow = lastrow - startrow + 1; m_printf("JAC1 STARTED\n");

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 38 из 81 Алгоритм Якоби. MPI-версия /* dynamically allocate data structures */ A = malloc ((nrow+2) * L * sizeof(double)); B = malloc ((nrow) * L * sizeof(double)); for(i=1; i

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 39 из 81 Алгоритм Якоби. MPI-версия /****** iteration loop *************************/ t1=MPI_Wtime(); for(it=1; it

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 40 из 81 Алгоритм Якоби. MPI-версия if(myrank!=0) MPI_Irecv(&A[0][0],L,MPI_DOUBLE, myrank-1, 1215, MPI_COMM_WORLD, &req[0]); if(myrank!=ranksize-1) MPI_Isend(&A[nrow][0],L,MPI_DOUBLE, myrank+1, 1215, MPI_COMM_WORLD,&req[2]); if(myrank!=ranksize-1) MPI_Irecv(&A[nrow+1][0],L,MPI_DOUBLE, myrank+1, 1216, MPI_COMM_WORLD, &req[3]); if(myrank!=0) MPI_Isend(&A[1][0],L,MPI_DOUBLE, myrank-1, 1216, MPI_COMM_WORLD,&req[1]); ll=4; shift=0; if (myrank==0) {ll=2;shift=2;} if (myrank==ranksize-1) {ll=2;} MPI_Waitall(ll,&req[shift],&status[0]);

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 41 из 81 Алгоритм Якоби. MPI-версия for(i=1; i

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 42 из 81 Алгоритм Якоби. MPI-версия

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 43 из 81 Алгоритм Якоби. MPI-версия /*Jacobi-2d program */ #include #include "mpi.h" #define m_printf if (myrank==0)printf #define L 1000 #define LC 2 #define ITMAX 100 int i,j,it,k; double (* A)[L/LC+2]; double (* B)[L/LC];

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 44 из 81 Алгоритм Якоби. MPI-версия int main(int argc, char **argv) { MPI_Request req[8]; int myrank, ranksize; int srow,lrow,nrow,scol,lcol,ncol; MPI_Status status[8]; double t1; int isper[] = {0,0}; int dim[2]; int coords[2]; MPI_Comm newcomm; MPI_Datatype vectype; int pleft,pright, pdown,pup; MPI_Init (&argc, &argv); /* initialize MPI system */ MPI_Comm_size (MPI_COMM_WORLD, &ranksize); /* size of MPI system */ MPI_Comm_rank (MPI_COMM_WORLD, &myrank); /* my place in MPI system */

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 45 из 81 Алгоритм Якоби. MPI-версия dim[0]=ranksize/LC; dim[1]=LC; if ((L%dim[0])||(L%dim[1])) { m_printf("ERROR: array[%d*%d] is not distributed on %d*%d processors\n",L,L,dim[0],dim[1]); MPI_Finalize(); exit(1); } MPI_Cart_create(MPI_COMM_WORLD,2,dim,isper,1,&newcomm); MPI_Cart_shift(newcomm,0,1,&pup,&pdown); MPI_Cart_shift(newcomm,1,1,&pleft,&pright); MPI_Comm_rank (newcomm, &myrank); /* my place in MPI system */ MPI_Cart_coords(newcomm,myrank,2,coords);

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 46 из 81 Алгоритм Якоби. MPI-версия /* rows of matrix I have to process */ srow = (coords[0] * L) / dim[0]; lrow = (((coords[0] + 1) * L) / dim[0])-1; nrow = lrow - srow + 1; /* columns of matrix I have to process */ scol = (coords[1] * L) / dim[1]; lcol = (((coords[1] + 1) * L) / dim[1])-1; ncol = lcol - scol + 1; MPI_Type_vector(nrow,1,ncol+2,MPI_DOUBLE,&vectype); MPI_Type_commit(&vectype); m_printf("JAC2 STARTED on %d*%d processors with %d*%d array, it=%d\n",dim[0],dim[1],L,L,ITMAX); /* dynamically allocate data structures */ A = malloc ((nrow+2) * (ncol+2) * sizeof(double)); B = malloc (nrow * ncol * sizeof(double));

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 47 из 81 Алгоритм Якоби. MPI-версия for(i=0; i

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 48 из 81 Алгоритм Якоби. MPI-версия MPI_Irecv(&A[0][1],ncol,MPI_DOUBLE, pup, 1215, MPI_COMM_WORLD, &req[0]); MPI_Isend(&A[nrow][1],ncol,MPI_DOUBLE, pdown, 1215, MPI_COMM_WORLD,&req[1]); MPI_Irecv(&A[nrow+1][1],ncol,MPI_DOUBLE, pdown, 1216, MPI_COMM_WORLD, &req[2]); MPI_Isend(&A[1][1],ncol,MPI_DOUBLE, pup, 1216, MPI_COMM_WORLD,&req[3]); MPI_Irecv(&A[1][0],1,vectype, pleft, 1217, MPI_COMM_WORLD, &req[4]); MPI_Isend(&A[1][ncol],1,vectype, pright, 1217, MPI_COMM_WORLD,&req[5]); MPI_Irecv(&A[1][ncol+1],1,vectype, pright, 1218, MPI_COMM_WORLD, &req[6]); MPI_Isend(&A[1][1],1,vectype, pleft, 1218, MPI_COMM_WORLD,&req[7]); MPI_Waitall(8,req,status);

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 49 из 81 Алгоритм Якоби. MPI-версия for(i=1; i

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 50 из 81 Алгоритм Якоби. MPI/OpenMP-версия /* Jacobi-1d program */ #include #include "mpi.h" #define m_printf if (myrank==0)printf #define L 1000 #define ITMAX 100 int i,j,it,k; int ll,shift; double (* A)[L]; double (* B)[L];

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 51 из 81 Алгоритм Якоби. MPI/OpenMP-версия int main(int argc, char **argv) { MPI_Request req[4]; int myrank, ranksize; int startrow,lastrow,nrow; MPI_Status status[4]; double t1, t2, time; MPI_Init (&argc, &argv); /* initialize MPI system */ MPI_Comm_rank(MPI_COMM_WORLD,&myrank); /*my place in MPI system */ MPI_Comm_size (MPI_COMM_WORLD, &ranksize); /* size of MPI system */ MPI_Barrier(MPI_COMM_WORLD); /* rows of matrix I have to process */ startrow = (myrank * N) / ranksize; lastrow = (((myrank + 1) * N) / ranksize)-1; nrow = lastrow - startrow + 1; m_printf("JAC1 STARTED\n");

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 52 из 81 Алгоритм Якоби. MPI/OpenMP-версия /* dynamically allocate data structures */ A = malloc ((nrow+2) * N * sizeof(double)); B = malloc ((nrow) * N * sizeof(double)); for(i=1; i

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 53 из 81 Алгоритм Якоби. MPI/OpenMP-версия /****** iteration loop *************************/ t1=MPI_Wtime(); for(it=1; it

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 54 из 81 Алгоритм Якоби. MPI/OpenMP-версия if(myrank!=0) MPI_Irecv(&A[0][0],L,MPI_DOUBLE, myrank-1, 1215, MPI_COMM_WORLD, &req[0]); if(myrank!=ranksize-1) MPI_Isend(&A[nrow][0],L,MPI_DOUBLE, myrank+1, 1215, MPI_COMM_WORLD,&req[2]); if(myrank!=ranksize-1) MPI_Irecv(&A[nrow+1][0],L,MPI_DOUBLE, myrank+1, 1216, MPI_COMM_WORLD, &req[3]); if(myrank!=0) MPI_Isend(&A[1][0],L,MPI_DOUBLE, myrank-1, 1216, MPI_COMM_WORLD,&req[1]); ll=4; shift=0; if (myrank==0) {ll=2;shift=2;} if (myrank==ranksize-1) {ll=2;} MPI_Waitall(ll,&req[shift],&status[0]);

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 55 из 81 Алгоритм Якоби. MPI/OpenMP-версия for(i=1; i

Гибридная модель DVM/OpenMP Данные Core Данные Вычисления Core … Узел 0 OpenMP Core Данные Вычисления Core … Узел N OpenMP DVM 28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 56 из 81

Алгоритм Якоби. DVM/OpenMP-версия PROGRAM JAC_OpenMP_DVM PARAMETER (L=1000, ITMAX=100) REAL A(L,L), B(L,L) CDVM$ DISTRIBUTE ( BLOCK, BLOCK) :: A CDVM$ ALIGN B(I,J) WITH A(I,J) PRINT *, '********** TEST_JACOBI **********' DO IT = 1, ITMAX CDVM$ PARALLEL (J,I) ON A(I, J) C$OMP PARALLEL DO COLLAPSE (2) DO J = 2, L-1 DO I = 2, L-1 A(I, J) = B(I, J) ENDDO 28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 57 из 81

Алгоритм Якоби. DVM/OpenMP-версия CDVM$ PARALLEL (J,I) ON B(I, J), SHADOW_RENEW (A) C$OMP PARALLEL DO COLLAPSE (2) 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 28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 58 из 81

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 59 из 81 Тесты NAS MultiZone BT (Block Tridiagonal Solver)3D Навье-Стокс, метод переменных направлений LU (Lower-Upper Solver) 3D Навье-Стокс, метод верхней релаксации SP(Scalar PentadiagonalSolver)3D Навье-Стокс, Beam- Warning approximate factorization

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 60 из 81 Тесты NAS MultiZone

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 61 из 81 Тест SP-MZ (класс A) на IBM eServer pSeries 690 Regatta DVMMPI

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 62 из 81 Тест LU-MZ (класс A) на IBM eServer pSeries 690 Regatta DVMMPI

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 63 из 81 Тест BT-MZ (класс A) на IBM eServer pSeries 690 Regatta зоны от 13 x 13 x 16 и до 58 x 58 x 16 DVMMPI

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 64 из 81 Расчет дозвукового обтекания летательного аппарата Задача 810 областей средняя загрузка Max загрузка 75 процессоров процессоров процессоров процессоров процессоров

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 65 из 81 Ликвидация или сокращение дублирования данных в памяти узла. Дополнительный уровень параллелизма на OpenMP реализовать проще, чем на MPI (например, когда в программе есть два уровня параллелизма – параллелизм между подзадачами и параллелизм внутри подзадачи). Улучшение балансировки на многоблочных задачах при меньшей трудоемкости реализации еще одного уровня параллелизма. Преимущества гибридной модели MPI/OpenMP

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 66 из 81 Алгоритм Якоби. Оптимизированная MPI/OpenMP-версия /****** iteration loop *************************/ t1=MPI_Wtime(); #pragma omp parallel default(none) private(it,i,j) shared (A,B,myrank, nrow,ranksize,ll,shift,req,status) for(it=1; it

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 67 из 81 Алгоритм Якоби. Оптимизированная MPI/OpenMP-версия #pragma omp barrier #pragma omp single { if(myrank!=0) MPI_Irecv(&A[0][0],L,MPI_DOUBLE, myrank-1, 1215, MPI_COMM_WORLD, &req[0]); if(myrank!=ranksize-1) MPI_Isend(&A[nrow][0],L,MPI_DOUBLE, myrank+1, 1215, MPI_COMM_WORLD,&req[2]); if(myrank!=ranksize-1) MPI_Irecv(&A[nrow+1][0],L,MPI_DOUBLE, myrank+1, 1216, MPI_COMM_WORLD, &req[3]); if(myrank!=0) MPI_Isend(&A[1][0],L,MPI_DOUBLE, myrank-1, 1216, MPI_COMM_WORLD,&req[1]); ll=4; shift=0; if (myrank==0) {ll=2;shift=2;} if (myrank==ranksize-1) {ll=2;} MPI_Waitall(ll,&req[shift],&status[0]); }

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 68 из 81 Алгоритм Якоби. Оптимизированная MPI/OpenMP-версия for(i=1; i

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 69 из 81 Привязка процессов к ядрам Intel MPI export I_MPI_PIN_DOMAIN=omp (node) mpirun … или mpirun –env I_MPI_PIN_DOMAIN omp... OpenMPI mpirun –bind-to-none.... MVAPICH mpirun VIADEV_USE_AFFINITY=0 …

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 70 из 81 Привязка процессов к ядрам #include void SetAffinity (int rank) { int MPI_PROCESSES_PER_NODE = omp_get_num_procs()/omp_get_max_threads (); #pragma omp parallel { cpu_set_t mask; CPU_ZERO(&mask); int cpu = (rank% MPI_PROCESSES_PER_NODE)*omp_get_num_threads() + omp_get_thread_num (); CPU_SET(cpu,&mask); sched_setaffinity ((pid_t)0, sizeof(cpu_set_t),&mask); }

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 71 из 81 Литература OpenMP Application Program Interface Version 3.0, May MPI: A Message-Passing Interface Standard Version 2.2, September Антонов А.С. Параллельное программирование с использованием технологии OpenMP: Учебное пособие.-М.: Изд-во МГУ, Антонов А.С. Параллельное программирование с использованием технологии MPI: Учебное пособие.-М.: Изд-во МГУ, Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. – СПб.: БХВ-Петербург, Э. Таненбаум, М. ван Стеен. Распределенные системы. Принципы и парадигмы. – СПб. Питер, 2003

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 72 из 81 Автор Бахтин Владимир Александрович, кандидат физико-математических наук, заведующий сектором Института прикладной математики им. М.В. Келдыша РАН, ассистент кафедры системного программированния факультета ВМК, МГУ им. М. В. Ломоносова

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 73 из 81 Инициализация и завершение MPI программ Первой вызываемой функцией MPI должна быть функция: int MPI_Init ( int *agrc, char ***argv ) Для инициализации среды выполнения MPI-программы. Параметрами функции являются количество аргументов в командной строке и текст самой командной строки. Последней вызываемой функцией MPI обязательно должна являться функция: int MPI_Finalize (void) Обратно

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 74 из 81 Определение количества и ранга процессов Определение количества процессов в выполняемой параллельной программе осуществляется при помощи функции: int MPI_Comm_size ( MPI_Comm comm, int *size ). Для определения ранга процесса используется функция: int MPI_Comm_rank ( MPI_Comm comm, int *rank ). Обратно

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 75 из 81 Неблокирующие обмены данными между процессорами Для передачи сообщения процесс-отправитель должен выполнить функцию: int MPI_Isend(void *buf, int count, MPI_Datatype type, int dest, int tag, MPI_Comm comm, MPI_Request *request), где buf - адрес буфера памяти, в котором располагаются данные отправляемого сообщения, count - количество элементов данных в сообщении, type - тип элементов данных пересылаемого сообщения, dest - ранг процесса, которому отправляется сообщение, tag - значение-тег, используемое для идентификации сообщений, comm - коммуникатор, в рамках которого выполняется передача данных. Для приема сообщения процесс-получатель должен выполнить функцию: int MPI_Irecv(void *buf, int count, MPI_Datatype type, int source, int tag, MPI_Comm comm, MPI_Status *status, MPI_Request *request), где buf, count, type - буфер памяти для приема сообщения, назначение каждого отдельного параметра соответствует описанию в MPI_Send, source - ранг процесса, от которого должен быть выполнен прием сообщения, tag - тег сообщения, которое должно быть принято для процесса, comm - коммуникатор, в рамках которого выполняется передача данных, status - указатель на структуру данных с информацией о результате выполнения операции приема данных. Обратно

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 76 из 81 MPI_Waitall Ожидание завершения всех операций обмена осуществляется при помощи функции: int MPI_Waitall( int count, MPI_Request array_of_requests[], MPI_Status array_of_statuses[]) Обратно

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 77 из 81 MPI_Cart_create Создание декартовой топологии (решетки) в MPI: int MPI_Cart_create(MPI_Comm oldcomm, int ndims, int *dims, int *periods, int reorder, MPI_Comm *cartcomm), где: oldcomm - исходный коммуникатор, ndims - размерность декартовой решетки, dims - массив длины ndims, задает количество процессов в каждом измерении решетки, periods - массив длины ndims, определяет, является ли решетка периодической вдоль каждого измерения, reorder - параметр допустимости изменения нумерации процессов, cartcomm - создаваемый коммуникатор с декартовой топологией процессов. Обратно

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 78 из 81 MPI_Cart_shift Функция: int MPI_Card_shift(MPI_Comm comm, int dir, int disp, int *source, int *dst) для получения номеров посылающего(source) и принимающего (dst) процессов в декартовой топологии коммуникатора (comm) для осуществления сдвига вдоль измерения dir на величину disp. Обратно

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 79 из 81 MPI_Card_coords Определение декартовых координат процесса по его рангу: int MPI_Card_coords(MPI_Comm comm,int rank,int ndims,int *coords), где: comm - коммуникатор с топологией решетки, rank - ранг процесса, для которого определяются декартовы координаты, ndims - размерность решетки, coords - возвращаемые функцией декартовы координаты процесса. Обратно

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 80 из 81 MPI_Type_vector Для снижения сложности в MPI предусмотрено несколько различных способов конструирования производных типов: Непрерывный способ позволяет определить непрерывный набор элементов существующего типа как новый производный тип, Векторный способ обеспечивает создание нового производного типа как набора элементов существующего типа, между элементами которого существуют регулярные промежутки по памяти. При этом, размер промежутков задается в числе элементов исходного типа, Индексный способ отличается от векторного метода тем, что промежутки между элементами исходного типа могут иметь нерегулярный характер, Структурный способ обеспечивает самое общее описание производного типа через явное указание карты создаваемого типа данных. int MPI_Type_vector(int count, int blocklen, int stride, MPI_Data_type oldtype, MPI_Datatype *newtype), где count - количество блоков, blocklen - размер каждого блока, stride - количество элементов, расположенных между двумя соседними блоками oldtype - исходный тип данных, newtype - новый определяемый тип данных. Обратно

28 марта Москва, 2011 Гибридная модель программирования MPI/OpenMP 81 из 81 MPI_Type_commit Перед использованием производный тип должен быть объявлен при помощи функции: int MPI_Type_commit (MPI_Datatype *type ) При завершении использования производный тип должен быть аннулирован при помощи функции: int MPI_Type_free (MPI_Datatype *type ). Обратно