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

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



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

В.А. Бахтин, М.С. Клинов, В.А. Крюков, Н.В. Поддерюгина, М.Н. Притула, Ю.Л. Сазанов Институт прикладной математики им. М.В. Келдыша.
МГУ им. М.В. Ломоносова, Москва, 21 октября 2011г. КОНСОРЦИУМ УНИВЕРСИТЕТОВ РОССИИ Курс: «Технология параллельного программирования OpenMP» Лабораторная.
МГУ им. М.В. Ломоносова, Москва, 2011 г. Гибридная модель параллельного программирования MPI/OpenMP Бахтин Владимир Александрович Ассистент кафедры системного.
Методика распараллеливания программ в модели DVM Институт прикладной математики им. М.В.Келдыша РАН
Система автоматизации распараллеливания: DVM-эксперт Блюменберг Э.П. 528 Научный руководитель: профессор В.А. Крюков.
Лекция 6 Множественное распараллеливание на Linux кластере с помощью библиотеки MPI 1. Компиляция и запуск программы на кластере. 2. SIMD модель параллельного.
Параллельные аппаратные архитектуры и модели программирования Традиционная архитектура фон Неймана Расширение традиционной архитектуры Сопроцессоры Многоядерные.
Гибридная модель параллельного программирования DVM/OpenMP Бахтин В.А. ИПМ им.М.В.Келдыша РАН г. Москва, 20 марта 2008 г.
Fortan OpenMP/DVM - язык параллельного программирования для кластеров В.А. Бахтин, Н.А. Коновалов, В.А. Крюков, Н.В. Поддерюгина Институт прикладной математики.
Введение в параллельные вычисления. Технология программирования MPI (день второй) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных.
1 Система автоматизации распараллеливания. Отображение на SMP-кластер. Автор: Картавец Евгений Олегович Научные руководители: д.ф.-м.н. Крюков Виктор Алексеевич.

Система автоматизации распараллеливания: DVM-эксперт Студент 528 группы Нгуен Минь Дык Научный руководитель: Профессор, д. ф.-м. н. Крюков Виктор Алексеевич.
Гергель В.П. Общий курс Теория и практика параллельных вычислений Лекция 9 Методы разработки параллельных программ при использования интерфейса передачи.
1. Определить последовательность проезда перекрестка
Автоматизация разработки параллельных программ для современных высокопроизводительных ЭВМ В.А. Крюков Факультет ВМК МГУ, Институт прикладной математики.
Введение в параллельные вычисления. Технология программирования MPI (день седьмой) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных.
Фрагмент карты градостроительного зонирования территории города Новосибирска Масштаб 1 : 6000 Приложение 7 к решению Совета депутатов города Новосибирска.
Стадник Е. Г. ФПМИ НГТУ Руководитель: Городничев М.А., м.н.с. ИВМ и МГ СО РАН.
Транксрипт:

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

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 2 из 70 Содержание Современные направления развития параллельных вычислительных систем Технологии параллельного программирования Система Автоматизированной Параллелизации ФОРтран- программ (САПФОР)

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

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

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 5 из 70 Суперкомпьютер 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 Тенденции развития современных процессоров 8 апреля Москва, 2011 Автоматизация разработки параллельных программ 6 из 70

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 Тенденции развития современных процессоров 8 апреля Москва, 2011 Автоматизация разработки параллельных программ 7 из 70

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

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

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

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 11 из 70 Тенденции развития современных процессоров

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 12 из 70 Алгоритм Якоби. Последовательная версия /* 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

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 13 из 70 Алгоритм Якоби. Последовательная версия /****** iteration loop *************************/ for(it=1; it

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 14 из 70 Алгоритм Якоби. MPI-версия

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 15 из 70 Алгоритм Якоби. 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];

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 16 из 70 Алгоритм Якоби. 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");

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

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 18 из 70 Алгоритм Якоби. MPI-версия /****** iteration loop *************************/ t1=MPI_Wtime(); for(it=1; it

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 19 из 70 Алгоритм Якоби. 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]);

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 20 из 70 Алгоритм Якоби. MPI-версия for(i=1; i

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 21 из 70 Алгоритм Якоби. MPI-версия

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 22 из 70 Алгоритм Якоби. 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];

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 23 из 70 Алгоритм Якоби. 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 */

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 24 из 70 Алгоритм Якоби. 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);

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 25 из 70 Алгоритм Якоби. 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));

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 26 из 70 Алгоритм Якоби. MPI-версия for(i=0; i

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 27 из 70 Алгоритм Якоби. 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);

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 28 из 70 Алгоритм Якоби. MPI-версия for(i=1; i

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 29 из 70 Данные Core Данные Вычисления Core … Узел 0 OpenMP Core Данные Вычисления Core … Узел N OpenMP Вычисления MPI Гибридная модель MPI/OpenMP

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 30 из 70 Алгоритм Якоби. 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];

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 31 из 70 Алгоритм Якоби. 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");

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

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 33 из 70 Алгоритм Якоби. MPI/OpenMP-версия /****** iteration loop *************************/ t1=MPI_Wtime(); for(it=1; it

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 34 из 70 Алгоритм Якоби. 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]);

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 35 из 70 Алгоритм Якоби. MPI/OpenMP-версия for(i=1; i

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 36 из 70 Тенденции развития современных процессоров

8 апреля Москва, 2011 Автоматизация разработки параллельных программ CPU или GPU 37 из 70

8 апреля Москва, 2011 Автоматизация разработки параллельных программ Архитектура GPU (NVIDIA GF100) 38 из 70

Алгоритм Якоби на языке Fortran 8 апреля Москва, 2011 Автоматизация разработки параллельных программ 39 из 70 PROGRAM JACOB_SEQ PARAMETER (L=4096, ITMAX=100) 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

Алгоритм Якоби на языке Fortran CUDA 8 апреля Москва, 2011 Автоматизация разработки параллельных программ 40 из 70 program JACOB_CUDA use cudafor use jac_cuda parameter (k=4096, itmax = 100, block_dim = 16) real, device, dimension(k, k) :: a, b integer it type(dim3) :: grid, block print *, '********** test_jacobi ********** grid = dim3(k / block_dim, k / block_dim, 1) block = dim3(block_dim, block_dim, 1) do it = 1, itmax call arr_copy >>(a, b, k) call arr_renew >>(a, b, k) end do end program JACOB_CUDA

Алгоритм Якоби на языке Fortran CUDA 8 апреля Москва, 2011 Автоматизация разработки параллельных программ 41 из 70 module jac_cuda contains attributes(global) subroutine arr_copy(a, b, k) real, device, dimension(k, k) :: a, b integer, value :: k integer i, j i = (blockIdx%x - 1) * blockDim%x + threadIdx%x j = (blockIdx%y - 1) * blockDim%y + threadIdx%y if (i.ne.1.and. i.ne.k.and. j.ne.1.and. j.ne.k) a(i, j) = b(i, j) end subroutine arr_copy attributes(global) subroutine arr_renew(a, b, k) real, device, dimension(k, k) :: a, b integer, value :: k integer i, j i = (blockIdx%x - 1) * blockDim%x + threadIdx%x j = (blockIdx%y - 1) * blockDim%y + threadIdx%y if (i.ne.1.and.i.ne.k.and.j.ne.1.and.j.ne.k) b(i,j)=(a(i-1,j)+a(i+1,j)+a(i,j-1)+a(I,j+1))/4 end subroutine arr_renew end module jac_cuda

DVM-система DVM-система состоит из следующих компонент: Компилятор Fortran-DVM/OpenMP Компилятор C-DVM Библиотека поддержки LIB-DVM DVM-отладчик Предсказатель выполнения DVM-программ Анализатор производительности DVM-программ Аббревиатура DVM (Distributed Virtual Memory, Distributed Virtual Machine) отражает поддержку виртуальной общей памяти на распределенных системах 8 апреля Москва, 2011 Автоматизация разработки параллельных программ 42 из 70

Средства программирования C-DVM = Язык Си + специальные макросы Fortran-DVM/OpenMP = Язык Фортран 95 + специальные комментарии Специальные комментарии и макросы являются высокоуровневыми спецификациями параллелизма в терминах последовательной программы Отсутствуют низкоуровневые передачи данных и синхронизации Последовательный стиль программирования Спецификации параллелизма «невидимы» для стандартных компиляторов Существует только один экземпляр программы для последовательного и параллельного счета 8 апреля Москва, 2011 Автоматизация разработки параллельных программ 43 из 70

Алгоритм Якоби. DVM-версия PROGRAM JAC_DVM PARAMETER (L=4096, 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) DO J = 2, L-1 DO I = 2, L-1 A(I, J) = B(I, J) ENDDO 8 апреля Москва, 2011 Автоматизация разработки параллельных программ 44 из 70

Алгоритм Якоби. DVM-версия CDVM$ PARALLEL (J,I) ON B(I, J), SHADOW_RENEW (A) 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 8 апреля Москва, 2011 Автоматизация разработки параллельных программ 45 из 70

Тесты NAS 8 апреля Москва, 2011 Автоматизация разработки параллельных программ ТестХарактеристика тестаSEQMPIDVM MPI/ SEQ DVM/S EQ BT 3D Навье-Стокс, метод переменных направлений CG Оценка наибольшего собственного значения симметричной разреженной матрицы EP Генерация пар случайных чисел Гаусса FT Быстрое преобразование Фурье, 3D спектральный метод IS Параллельная сортировка LU 3D Навье-Стокс, метод верхней релаксации MG 3D уравнение Пуассона, метод Multigrid SP 3D Навье-Стокс, Beam-Warning approximate factorization

Тесты NAS 8 апреля Москва, 2011 Автоматизация разработки параллельных программ 47 из 70

Тесты NAS 8 апреля Москва, 2011 Автоматизация разработки параллельных программ 48 из 70

Алгоритм Якоби. DVM/OpenMP-версия PROGRAM JAC_OpenMP_DVM PARAMETER (L=4096, 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 8 апреля Москва, 2011 Автоматизация разработки параллельных программ 49 из 70

Алгоритм Якоби. 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 8 апреля Москва, 2011 Автоматизация разработки параллельных программ 50 из 70

Алгоритм Якоби. DVM/GPU-версия PROGRAM JAC_GPU_DVM PARAMETER (L=4096, 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 ********** C$ACC DATA REGION COPYOUT(B), LOCAL (A) DO IT = 1, ITMAX C$ACC REGION CDVM$ PARALLEL (J,I) ON A(I, J) DO J = 2, L-1 DO I = 2, L-1 A(I, J) = B(I, J) ENDDO 8 апреля Москва, 2011 Автоматизация разработки параллельных программ 51 из 70

Алгоритм Якоби. DVM/GPU-версия CDVM$ PARALLEL (J,I) ON B(I, J), SHADOW_RENEW (A) 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 C$ACC END REGION ENDDO C$ACC END DATA REGION END 8 апреля Москва, 2011 Автоматизация разработки параллельных программ 52 из 70

Система САПФОР 8 апреля Москва, 2011 Автоматизация разработки параллельных программ Программа на последовательном языке Фортран Задание на отладку Распараллеливающий компилятор с языка Фортран Характеристики эффективности Средства функциональной отладки Средства отладки эффективности Протокол отладки Результаты компиляции Кластер Инструментальная ЭВМ 53 из 70

Автоматически распараллеливающий компилятор 8 апреля Москва, 2011 Автоматизация разработки параллельных программ Анализатор 1 Описание ЭВМ Фортран программа База данных Эксперт 1 Фортран -DVM/OpenMP программа Анализатор 2 Эксперт 2 Фортран -DVM/OpenMP/GPU программа 54 из 70

Автоматически распараллеливающий компилятор 8 апреля Москва, 2011 Автоматизация разработки параллельных программ Далее приводятся результаты работы распараллеливающего компилятора на: тестах NAS LU, BT, SP программе MHPDV (трехмерного моделирования сферического взрыва во внешнем магнитном поле с помощью решения уравнений идеальной магнитогидродинамики) программе ZEBRA (расчет нейтронных полей атомного реактора в диффузионном приближении) 55 из 70

Автоматически распараллеливающий компилятор 8 апреля Москва, 2011 Автоматизация разработки параллельных программ Варианты Число проц 1 Число проц 8 Число проц 64 Число проц 256 Число проц 1024 BT-автомало памяти BT-ручноемало памяти LU-авто LU-ручное SP-авто SP-ручное MHPDV-авто MHPDV-ручное ZEBRA-авто ZEBRA-ручное из 70

BTLUSPMHPDVZEBRA Время работы DVM-эксперта на ПЭВМ (сек) Количество строк Количество циклов Количество параллелизуемых циклов DVM-экспертом Количество обращений к массивам Количество массивов Суммарное число измерений Распределение массивов по измерениям (начиная с одномерных массивов) Количество групп измерений65556 Количество построенных схем16 64 Среднее время построения одной схемы (сек) 38,563,932,621,430,29 Среднее время оценки эффективности одной схемы (сек) 77,392,0652,311,1311,47 Общее количество перебранных процессорных решеток

Система САПФОР 8 апреля Москва, 2011 Автоматизация разработки параллельных программ

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 59 из 70 Вопросы, замечания? Спасибо!

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

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

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

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 63 из 70 Определение количества и ранга процессов Определение количества процессов в выполняемой параллельной программе осуществляется при помощи функции: int MPI_Comm_size ( MPI_Comm comm, int *size ). Для определения ранга процесса используется функция: int MPI_Comm_rank ( MPI_Comm comm, int *rank ). Обратно

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 64 из 70 Неблокирующие обмены данными между процессорами Для передачи сообщения процесс-отправитель должен выполнить функцию: 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 - указатель на структуру данных с информацией о результате выполнения операции приема данных. Обратно

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 65 из 70 MPI_Waitall Ожидание завершения всех операций обмена осуществляется при помощи функции: int MPI_Waitall( int count, MPI_Request array_of_requests[], MPI_Status array_of_statuses[]) Обратно

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 66 из 70 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 - создаваемый коммуникатор с декартовой топологией процессов. Обратно

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 67 из 70 MPI_Cart_shift Функция: int MPI_Card_shift(MPI_Comm comm, int dir, int disp, int *source, int *dst) для получения номеров посылающего(source) и принимающего (dst) процессов в декартовой топологии коммуникатора (comm) для осуществления сдвига вдоль измерения dir на величину disp. Обратно

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

8 апреля Москва, 2011 Автоматизация разработки параллельных программ 69 из 70 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 - новый определяемый тип данных. Обратно

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