лекции (OpenMP), страница 9
Описание файла
Файл "лекции" внутри архива находится в папке "OpenMP". PDF-файл из архива "OpenMP", который расположен в категории "". Всё это находится в предмете "параллельное программирование для высокопроизводительных вычислительных систем" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 9 страницы из PDF
MPI/OpenMP-версия/****** iteration loop *************************/t1=MPI_Wtime();for(it=1; it<=ITMAX; it++){for(i=1; i<=nrow; i++){if (((i==1)&&(myrank==0))||((i==nrow)&&(myrank==ranksize-1)))continue;#pragma omp parallel forfor(j=1; j<=L-2; j++){A[i][j] = B[i-1][j];}}8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP54 из 84Алгоритм Якоби. 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 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP55 из 84Алгоритм Якоби. MPI/OpenMP-версияfor(i=1; i<=nrow; i++){if (((i==1)&&(myrank==0))||((i==nrow)&&(myrank==ranksize-1))) continue;#pragma omp parallel forfor(j=1; j<=L-2; j++)B[i-1][j] = (A[i-1][j]+A[i+1][j]+A[i][j-1]+A[i][j+1])/4.;}}/*DO it*/printf("%d: Time of task=%lf\n",myrank,MPI_Wtime()-t1);MPI_Finalize ();return 0;}8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP56 из 84Гибридная модель DVM/OpenMPДанныеCoreДанныеДанныеВычисленияВычисленияOpenMPOpenMPCore … CoreУзел 08 декабряМосква, 2015CoreCore … CoreУзел NГибридная модель программирования MPI/OpenMP57 из 84Алгоритм Якоби.
DVM/OpenMP-версияPROGRAMJAC_OpenMP_DVMPARAMETERREAL(L=1000, ITMAX=100)A(L,L), B(L,L)CDVM$ DISTRIBUTE( BLOCK, BLOCK) :: ACDVM$ ALIGN B(I,J) WITH A(I,J)PRINT *, '********** TEST_JACOBI **********'DO IT = 1, ITMAXCDVM$PARALLEL (J,I) ON A(I, J)C$OMPPARALLEL DO COLLAPSE (2)DO J = 2, L-1DO I = 2, L-1A(I, J) = B(I, J)ENDDOENDDO8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP58 из 84Алгоритм Якоби. DVM/OpenMP-версияCDVM$PARALLEL (J,I) ON B(I, J), SHADOW_RENEW (A)C$OMPPARALLEL DO COLLAPSE (2)DO J = 2, L-1DO I = 2, L-1B(I, J) = (A(I-1, J) + A(I, J-1) + A(I+1, J) + A(I, J+1)) / 4ENDDOENDDOENDDOEND8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP59 из 84Тесты NAS MultiZoneBT (Block Tridiagonal Solver) 3D Навье-Стокс, методпеременных направленийLU (Lower-Upper Solver) 3D Навье-Стокс, метод верхнейрелаксацииSP (Scalar PentadiagonalSolver) 3D Навье-Стокс, BeamWarning approximate factorizationhttp://www.nas.nasa.gov/News/Techreports/2003/PDF/nas-03-010.pdf8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP60 из 84Тесты NAS MultiZone8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP61 из 84Тест SP-MZ (класс A) на IBM eServer pSeries 690 Regatta2 процессора4 процессора1004590,479041,7439,564083,676,358037,836,9536,0235,33566,877030602550204015302010105001x21x42x18 процессовMPI25DVM1621,64 21,6321,7620,8719,822020,44 20,872x2144x116 процессоров14,9812,9712,7219,21211,1110,9811,441010,479,9210,4110158106452001x88 декабряМосква, 20152x44x28x11x162x84x4Гибридная модель программирования MPI/OpenMP8x216x162 из 84Тест LU-MZ (класс A) на IBM eServer pSeries 690 Regatta2 процессора4 процессора80,0035,0031,19 31,1571,1366,2970,0028,5830,0060,13 60,8560,0032,38 31,7031,1625,0050,0020,0040,0015,0030,0010,0020,005,0010,000,000,001x22x18 процессоров1x4MPI2x24x116 процессоровDVM16,0035,0031,19 31,1514,0713,4914,0030,0012,3612,0312,0025,0020,0010,7821,5510,0019,23 19,2216,838,1915,619,799,368,9817,868,428,0015,006,0010,004,005,002,000,000,001x88 декабряМосква, 20152x44x28x11x162x84x4Гибридная модель программирования MPI/OpenMP8x216x163 из 84Тест BT-MZ (класс A) на IBM eServer pSeries 690 Regattaзоны от 13 x 13 x 16 и до 58 x 58 x 162 процессора4 процессора100,0090,0045,0089,5788,5384,2438,1340,0078,7880,0041,75 41,5540,3939,8336,5435,0070,0030,0060,0025,0050,0020,0040,0030,0015,0020,0010,0010,005,000,000,001x22x11x48 процессоровMPI40,0016 процессоровDVM32,6035,7335,0030,4630,0030,0025,0023,25 22,9320,7321,7521,1920,0019,0920,0015,8915,3215,0013,7315,0013,2011,1616,8212,4710,5710,0010,005,005,000,000,001x88 декабряМосква, 20154x135,0034,6825,002x22x44x28x11x162x84x4Гибридная модель программирования MPI/OpenMP8x216x164 из 84Расчет дозвукового обтекания летательного аппарата8 декабряМосква, 2015Задача810 областейсредняязагрузкаMaxзагрузка75 процессоров1925819296128 процессоров1128411648256 процессоров564211648384 процессоров376111648512 процессоров282111648Гибридная модель программирования MPI/OpenMP65 из 84Преимущества гибридной модели MPI/OpenMPЛиквидация или сокращение дублирования данных в памятиузла.Дополнительный уровень параллелизма на OpenMPреализовать проще, чем на MPI (например, когда впрограмме есть два уровня параллелизма – параллелизммежду подзадачами и параллелизм внутри подзадачи).Улучшение балансировки на многоблочных задачах применьшей трудоемкости реализации еще одного уровняпараллелизма.8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP66 из 84Алгоритм Якоби.
Оптимизированная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<=ITMAX; it++){for(i=1; i<=nrow; i++){if (((i==1)&&(myrank==0))||((i==nrow)&&(myrank==ranksize-1)))continue;#pragma omp for nowaitfor(j=1; j<=L-2; j++){A[i][j] = B[i-1][j];}}8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP67 из 84Алгоритм Якоби. Оптимизированная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]);8 декабряМосква, 2015}Гибридная модель программирования MPI/OpenMP68 из 84Алгоритм Якоби.
ОптимизированнаяMPI/OpenMP-версияfor(i=1; i<=nrow; i++){if (((i==1)&&(myrank==0))||((i==nrow)&&(myrank==ranksize-1))) continue;#pragma omp for nowaitfor(j=1; j<=L-2; j++)B[i-1][j] = (A[i-1][j]+A[i+1][j]+A[i][j-1]+A[i][j+1])/4.;}}/*DO it*/printf("%d: Time of task=%lf\n",myrank,MPI_Wtime()-t1);MPI_Finalize ();return 0;}8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP69 из 84Привязка процессов к ядрамIntel MPIexport I_MPI_PIN_DOMAIN=omp (node)mpirun …илиmpirun –env I_MPI_PIN_DOMAIN omp ...OpenMPImpirun –bind-to-none ....MVAPICHmpirun VIADEV_USE_AFFINITY=0 …8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP70 из 84Привязка процессов к ядрам#include <sched.h>#include <omp.h>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);}}8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP71 из 84инициализацияИнициализацияMPIMPIссподдержкойподдержкойнитейнитейint main(int argc, char **argv) {int required = MPI_THREAD_FUNNELED;int mpi_rank, mpi_size, mpi_err, provided;MPI_Comm comm = MPI_COMM_WORLD;mpi_err = MPI_Init_thread(&argc, &argv, required, &provided);mpi_err = MPI_Comm_rank(comm, &mpi_rank);if (mpi_rank == 0) {switch (provided) {case MPI_THREAD_SINGLE: /* */ break;case MPI_THREAD_FUNNELED: /* */ break;case MPI_THREAD_SERIALIZED: /* */ break;case MPI_THREAD_MULTIPLE: /* */ break;default: /* */ break;}}}8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP72 из 84инициализацияИнициализацияMPIMPIссподдержкойподдержкойнитейнитейMPI_THREAD_SINGLEMPI-процесс исполняет единственную нитьMPI_THREAD_FUNNELEDMPI-процесс может быть многонитевым, но делать MPI-вызовыразрешено только тому процессу, который проводилинициализацию MPIMPI_THREAD_SERIALIZEDMPI-процесс может быть нитевым, но в любой момент времени MPIвызов делает лишь одна нитьMPI_THREAD_MULTIPLEMPI-процесс может быть многонитевым, и несколько нитей могутвызывать MPI-функции одновременно8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP73 из 84Литература OpenMP Application Program Interface Version 3.1, July 2015.http://www.openmp.org/mp-documents/OpenMP3.1.pdf MPI: A Message-Passing Interface Standard Version 2.2, September2009.http://www.mpi-forum.org/docs/mpi-2.2/mpi22-report.pdf Антонов А.С.
Параллельное программирование с использованиемтехнологии OpenMP: Учебное пособие.-М.: Изд-во МГУ, 2009.http://parallel.ru/info/parallel/openmp/OpenMP.pdf Антонов А.С. Параллельное программирование с использованиемтехнологии MPI: Учебное пособие.-М.: Изд-во МГУ, 2004.http://parallel.ru/tech/tech_dev/MPI/mpibook.pdf Воеводин В.В., Воеводин Вл.В.
Параллельные вычисления. – СПб.:БХВ-Петербург, 2002.8 декабряМосква, 2015OpenMP 4.074 из 84АвторБахтин Владимир Александрович, кандидат физико-математических наук,заведующий сектором Института прикладной математики им. М.В. Келдыша РАН,ассистент кафедры системного программированния факультета ВМК, МГУ им.
М. В.Ломоносоваbakhtin@keldysh.ru8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP75 из 84Инициализация и завершение MPI программПервой вызываемой функцией MPI должна быть функция:int MPI_Init ( int *agrc, char ***argv )Для инициализации среды выполнения MPI-программы. Параметрами функции являютсяколичество аргументов в командной строке и текст самой командной строки.Последней вызываемой функцией MPI обязательно должна являться функция:int MPI_Finalize (void)Обратно8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP76 из 84Определение количества и ранга процессовОпределение количества процессов в выполняемой параллельной программеосуществляется при помощи функции:int MPI_Comm_size ( MPI_Comm comm, int *size ).Для определения ранга процесса используется функция:int MPI_Comm_rank ( MPI_Comm comm, int *rank ).Обратно8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP77 из 84Неблокирующие обмены данными междупроцессорамиДля передачи сообщения процесс-отправитель должен выполнить функцию: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 декабря78 из 84Гибридная модель программирования MPI/OpenMPМосква, 2015MPI_WaitallОжидание завершения всех операций обмена осуществляется при помощи функции:int MPI_Waitall(int count,MPI_Request array_of_requests[],MPI_Status array_of_statuses[])Обратно8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP79 из 84MPI_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 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP80 из 84MPI_Cart_shiftФункция:int MPI_Card_shift(MPI_Comm comm, int dir, int disp, int *source, int *dst)для получения номеров посылающего(source) и принимающего (dst) процессов вдекартовой топологии коммуникатора (comm) для осуществления сдвига вдоль измеренияdir на величину disp.Обратно8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP81 из 84MPI_Card_coordsОпределение декартовых координат процесса по его рангу:int MPI_Card_coords(MPI_Comm comm,int rank,int ndims,int *coords),где:•comm - коммуникатор с топологией решетки,• rank - ранг процесса, для которого определяются декартовы координаты,• ndims - размерность решетки,• coords - возвращаемые функцией декартовы координаты процесса.Обратно8 декабряМосква, 2015Гибридная модель программирования MPI/OpenMP82 из 84MPI_Type_vectorДля снижения сложности в MPI предусмотрено несколько различных способовконструирования производных типов:• Непрерывный способ позволяет определить непрерывный набор элементовсуществующего типа как новый производный тип,• Векторный способ обеспечивает создание нового производного типа как набораэлементов существующего типа, между элементами которого существуют регулярныепромежутки по памяти.