Интернет Университет Суперкомпьютерных технологий Использование OpenMP на кластере Учебный курс Параллельное программирование с OpenMP Бахтин В.А., кандидат физ.-мат. наук, заведующий сектором, Институт прикладной математики им. М.В.Келдыша РАН
Москва, 2009 г. Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А. 2 из 26 Содержание Технология Intel Cluster OpenMP Гибридная модель параллельного программирования MPI/OpenMP Гибридная модель параллельного программирования DVM/OpenMP
Москва, 2009 г. 3 из 26 Технология Intel Cluster OpenMP В 2006 году в Intel® компиляторах версии 9.1 появилась поддержка Cluster OpenMP. Технология Cluster OpenMP поддерживает выполнение OpenMP программ на нескольких вычислительных узлах, объединенных сетью. Базируется на программной реализации DSM (Thread Marks software by Rice University). Для компилятора Intel® C++: icc -cluster-openmp options source-file icc -cluster-openmp-profile options source-file Для компилятора Intel® Fortran: ifort -cluster-openmp options source-file ifort -cluster-openmp-profile options source-file kmp_cluster.ini --hostlist=home,remote --process_threads=2 Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.
Москва, 2009 г. 4 из 26 Преимущества Intel Cluster OpenMP Упрощает распределение последовательного или OpenMP кода по узлам. Позволяет использовать одну и ту же программу для последовательных, многоядерных и кластерных систем. Требует совсем незначительного изменения кода программы, что упрощает отладку. Позволяет слегка измененной OpenMP-программе выполняться на большем числе процессоров без вложений в аппаратную составляющую SMP. Представляет собой альтернативу MPI, которая может быть быстрее освоена и применена. Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.
Москва, 2009 г. 5 из 26 Преимущества Intel Cluster OpenMP Переносимость и гибкость упрощает и снижает стоимость разработки приложений. Тип вычислительной системы Аппаратная составляющая расходов Программная составляющая расходов Большие SMP системы с общей памятью и OpenMP Кластерные системы с распределенной памятью и MPI Кластерные системы с распределенной памятью и Cluster OpenMP Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.
001 Модель памяти в OpenMP Москва, 2009 г. 6 из 26 Нить 001 Нить 001 Нить Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.
001 Модель памяти в OpenMP Москва, 2009 г. 7 из 26 Нить Нить 1 static int i = 0; … = i + 1; i = i + 1; i = 0 i = 1 … = i + 2; // ? #pragma omp flush (i) i = 1 Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.
Консистентность памяти в OpenMP Москва, 2009 г. 8 из 26 Корректная последовательность работы нитей с переменной: Нить0 записывает значение переменной - write(var) Нить0 выполняет операцию синхронизации – flush (var) Нить1 выполняет операцию синхронизации – flush (var) Нить1 читает значение переменной – read (var) 1: A = : flush(A) Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.
Директива SHARABLE Москва, 2009 г. 9 из 26 #pragma intel omp sharable ( variable [, variable …] ) – для Си и Си++ !dir$ omp sharable ( variable [, variable …] ) - для Фортрана определяют переменные, которые должны быть помещены в Distributed Virtual Shared Memory В компиляторе существуют опции, которые позволяют изменить класс переменных, не изменяя текст программы: [-no]-clomp-sharable-argexprs [-no]-clomp-sharable-commons [-no]-clomp-sharable-localsaves [-no]-clomp-sharable-modvars Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.
Москва, 2009 г. 10 из 26 Использование Intel Cluster OpenMP malloc (…) -> kmp_sharable_malloc (…) #include foo * fp = new foo (10); foo * fp = new kmp_sharable foo (10); std::vector * vp = new std::vector ; std::vector > * vp = new kmp_sharable std::vector >; Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.
Работа с SHARABLE- переменными Москва, 2009 г. 11 из 26 Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.
Москва, 2009 г. 12 из 26 Использование Intel Cluster OpenMP Целесообразно: если программа дает хорошее ускорение при использовании технологии OpenMP: Speedup = Time(1thread)/Time (n threads) = ~n еcли программа требует малой синхронизации данные в программе хорошо локализованы Наиболее целесообразно для задач (RMS - recognition, mining, and synthesis): Обработка больших массивов данных Рендеринг в графике Поиск Распознавание образов Выделение последовательностей в генетике Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.
Москва, 2009 г. 13 из 26 Использование Intel Cluster OpenMP 1. a particle-simulation code 2. a magneto-hydro-dynamics code 3. a computational fluid dynamics code 4. a structure-simulation code 5. a graph-processing code 6. a linear solver code 7. an x-ray crystallography code Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.
Москва, 2009 г. 14 из 26 Гибридная модель параллельного программирования MPI/OpenMP Данные Core Данные Вычисления Core … Узел 0 OpenMP Core Данные Вычисления Core … Узел N OpenMP Вычисления MPI Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.
Москва, 2009 г. 15 из 26 Алгоритм Якоби на языке Fortran 77 PROGRAM JAC_F77 PARAMETER (L=8, ITMAX=20) REAL A(L,L), B(L,L) PRINT *, '********** TEST_JACOBI **********' DO IT = 1, ITMAX DO J = 2, L-1 DO I = 2, L-1 A(I, J) = B(I, J) ENDDO DO J = 2, L-1 DO I = 2, L-1 B(I, J) = (A(I-1, J) + A(I, J-1) + * A(I+1, J) + A(I, J+1)) / 4 ENDDO END Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.
Москва, 2009 г. 16 из 26 Алгоритм Якоби на языке Fortran OpenMP PROGRAM JAC_F77 PARAMETER (L=8, ITMAX=20) REAL A(L,L), B(L,L) PRINT *, '********** TEST_JACOBI **********' !$OMP PARALLEL SHARED (A,B) PRIVATE(I,J,IT) DO IT = 1, ITMAX !$OMP DO DO J = 2, L-1 DO I = 2, L-1 A(I, J) = B(I, J) ENDDO !$OMP DO DO J = 2, L-1 DO I = 2, L-1 B(I, J) = (A(I-1, J) + A(I, J-1) + * A(I+1, J) + A(I, J+1)) / 4 ENDDO !$OMP END PARALLEL END Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.
Distribution of array A [8][8]
Алгоритм Якоби в модели MPI/OpenMP PROGRAM JAC_MPI_OpenMP include 'mpif.h' integer me, nprocs PARAMETER (L=8, ITMAX=20, LC=2, LR=2) REAL A(0:L/LR+1,0:L/LC+1), B(L/LR,L/LC) integer dim(2), coords(2) logical isper(2) integer status(MPI_STATUS_SIZE,4), req(8), newcomm integer srow,lrow,nrow,scol,lcol,ncol,up,pdown,pleft,pright dim(1) = LR dim(2) = LC isper(1) =.false. isper(2) =.false. reor =.true. call MPI_Init( ierr ) call MPI_Comm_rank( mpi_comm_world, me, ierr ) call MPI_Comm_size( mpi_comm_world, nprocs, ierr) call MPI_Cart_create(mpi_comm_world,2,dim,isper,.true., newcomm, ierr) Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А. Москва, 2009 г. 18 из 26
call MPI_Cart_shift(newcomm,0,1,pup,pdown, ierr) call MPI_Cart_shift(newcomm,1,1,pleft,pright, ierr) call MPI_Comm_rank (newcomm, me, ierr) call MPI_Cart_coords(newcomm,me,2,coords, ierr) C rows of matrix I have to process srow = (coords(1) * L) / dim(1) lrow = (((coords(1) + 1) * L) / dim(1))-1 nrow = lrow - srow + 1 C colomns of matrix I have to process scol = (coords(2) * L) / dim(2) lcol = (((coords(2) + 1) * L) / dim(2))-1 ncol = lcol - scol + 1 call MPI_Type_vector(ncol,1,nrow+2,MPI_DOUBLE_PRECISION, * vectype, ierr) call MPI_Type_commit(vectype, ierr) IF (me.eq. 0) PRINT *, '***** TEST_JACOBI *******' C$OMP PARALLEL SHARED (A,B)PRIVATE(I,J,IT) DO IT = 1, ITMAX C$OMP DO DO J = 1, ncol DO I = 1, nrow A(I, J) = B(I, J) ENDDO
CCopying shadow elements of array A from Cneighbouring nodes before loop execution C$OMP MASTER call MPI_Irecv(A(1,0),nrow,MPI_DOUBLE_PRECISION, * pleft, 1235, MPI_COMM_WORLD, req(1), ierr) call MPI_Isend(A(1,ncol),nrow,MPI_DOUBLE_PRECISION, * pright, 1235, MPI_COMM_WORLD,req(2), ierr) call MPI_Irecv(A(1,ncol+1),nrow,MPI_DOUBLE_PRECISION, * pright, 1236, MPI_COMM_WORLD, req(3), ierr) call MPI_Isend(A(1,1),nrow,MPI_DOUBLE_PRECISION, * pleft, 1236, MPI_COMM_WORLD,req(4), ierr) call MPI_Irecv(A(0,1),1,vectype, * pup, 1237, MPI_COMM_WORLD, req(5), ierr) call MPI_Isend(A(nrow,1),1,vectype, * pdown, 1237, MPI_COMM_WORLD,req(6), ierr) call MPI_Irecv(A(nrow+1,1),1,vectype, * pdown, 1238, MPI_COMM_WORLD, req(7), ierr) call MPI_Isend(A(1,1),1,vectype, * pup, 1238, MPI_COMM_WORLD,req(8), ierr) call MPI_Waitall(8,req,status, ierr) C$OMP END MASTER C$OMP BARRIER
C$OMP DO DO J = 2, ncol-1 DO I = 2, nrow-1 B(I, J) = (A( I-1, J ) + A( I, J-1 ) + * A( I+1, J) + A( I, J+1 )) / 4 ENDDO C$OMP END PARALLEL call MPI_Finalize(ierr) END программисту надо знать и уметь использовать две разные модели параллелизма и разные инструментальные средства
DVM/OpenMP – гибридная модель программирования высокого уровня Данные Core Данные Вычисления Core … Узел 0 OpenMP Core Данные Вычисления Core … Узел N OpenMP DVM Вычисления Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А. Москва, 2009 г. 22 из 26
Алгоритм Якоби в модели DVM/OpenMP PROGRAM JAC_OpenMP_DVM PARAMETER (L=8, ITMAX=20) REAL A(L,L), B(L,L) CDVM$ DISTRIBUTE ( BLOCK, BLOCK) :: A CDVM$ ALIGN B(I,J) WITH A(I,J) C$OMP PARALLEL SHARED(A,B) PRIVATE(I,J,IT) DO IT = 1, ITMAX CDVM$ PARALLEL (J,I) ON A(I, J) C$OMP DO DO J = 2, L-1 DO I = 2, L-1 A(I, J) = B(I, J) ENDDO CDVM$ PARALLEL (J,I) ON B(I, J), SHADOW_RENEW (A) C$OMP DO DO J = 2, L-1 DO I = 2, L-1 B(I, J) = (A(I-1, J) + A(I, J-1) + A(I+1, J) + A(I, J+1)) / 4 ENDDO C$OMP END PARALLEL END
24 из 26 Литература 1. Cluster OpenMP. User Manual Jay P. Hoeflinger. Extending OpenMP to Clusters Rolf Rabenseifner, Bettina Krammer. OpenMP on MPPs and clusters of SMP nodes using Intel ® Compilers with Cluster OpenMP penMP.pdf penMP.pdf 4. DVM-система. Москва, 2009 г. Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.
25 из 26 Спасибо за внимание! Вопросы? Москва, 2009 г. Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.
26 из 26 Бахтин В.А., кандидат физ.-мат. наук, заведующий сектором, Институт прикладной математики им. М.В.Келдыша РАН Контакты Москва, 2009 г. Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.