лекции (MPI), страница 7
Описание файла
Файл "лекции" внутри архива находится в папке "MPI". PDF-файл из архива "MPI", который расположен в категории "". Всё это находится в предмете "параллельное программирование для высокопроизводительных вычислительных систем" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 7 страницы из PDF
Terminating.\n",SIZE);MPI_Finalize(); }Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 564Задание 3.Разработать параллельную программудля умножения матриц. Распределение элементов матриц –ленточное, по строкам. Провести исследованиеэффективности разработанныхалгоритмов.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 565Параллельное программирование длявысокопроизводительных системсентябрь – декабрь 2015 г.Лекция MPI_624 ноября 2015 г.Лектор доцент Н.Н.ПоповаЛекции спецкурс "Пар.
прогр. длявысокопроизводительных систем",24.11.20151ТемаВиртуальные топологии MPIБлочные параллельные алгоритмыматричного умножения.Лекции спецкурс "Пар. прогр. длявысокопроизводительных систем",24.11.20152Виртуальные топологииТопология – механизм сопоставления процессамальтернативной схемы адресации. В MPI топологиивиртуальны, не связаны с физической топологиейсети.Два типа топологий:- декартова (прямоугольная решеткапроизвольной размерности)- топология графа.Лекции спецкурс "Пар. прогр.
длявысокопроизводительных систем",24.11.20153Декартова топологияЛогическая топология, определяемая многомернойрешеткой.Обобщение линейной и матричной топологий напроизвольное число измерений.Для создания коммуникатора с декартовойтопологией используется функция MPI_Cart_create.С помощью этой функции можно создаватьтопологии с произвольным числом измерений,причем по каждому измерению в отдельности можнонакладывать периодические граничные условия.Лекции спецкурс "Пар. прогр.
длявысокопроизводительных систем",24.11.20154Виртуальные топологииОсновные функции:MPI_CART_CREATEMPI_CART_COORDSMPI_CART_RANKMPI_CART_SUBMPI_CARTDIM_GETMPI_CART_GETMPI_CART_SHIFTЛекции спецкурс "Пар. прогр. длявысокопроизводительных систем",24.11.20155MPI_CART_CREATEСоздает структуру «прямоугольная решетка»произвольной размерности.int MPI_Cart_create(MPI_Comm old_comm, int ndims, int*dim_size, int *periods, int reorder, MPI_Comm *new_comm).Лекции спецкурс "Пар.
прогр. длявысокопроизводительных систем",24.11.20156MPI_CART_CREATEПараметрыold_commMPI_CommInputИсходный коммуникаторndimsintInputЧисло измеренийdim_sizeint *InputМассив размера ndims длязадания числа элементов покаждой из размерностейperiodsint *InputМассив размера ndims длязадания «периодичности» покаждой из размерностейreorderintInputФлаг для заданияпереупорядочиванияэлементовnew_commMPI_Comm *OutputНовый коммуникаторЛекции спецкурс "Пар. прогр. длявысокопроизводительных систем",24.11.20157MPI_Cart_createФункция является коллективной, т.е. должна запускаться навсех процессах, входящих в группу коммуникатора comm_old.Если какие-то процессы не попадают в новую группу, то для нихвозвращается результат MPI_COMM_NULL.
В случае, когдаразмеры заказываемой сетки больше имеющегося в группечисла процессов, функция завершается аварийно.Значение параметра reorder=false означает, что идентификаторывсех процессов в новой группе будут такими же, как в старойгруппе.
Если reorder=true, то MPI будет пытатьсяперенумеровать их с целью оптимизации коммуникаций.Лекции спецкурс "Пар. прогр. длявысокопроизводительных систем",24.11.20158Пример виртуальной топологиирешеткаMPI_Comm vu;int dim[2], period[2], reorder;dim[0]=4; dim[1]=3;period[0]=TRUE; period[1]=FALSE;reorder=TRUE;MPI_Cart_create(MPI_COMM_WORLD,2,dim,period,reorder,&vu);Лекции спецкурс "Пар. прогр.
длявысокопроизводительных систем",24.11.20159Определение оптимальнойконфигурации декартовой решеткиint MPI_Dims_create(int nnodes, int ndims, int *dims)nnodes - общее число узлов в сетке;ndims - число измерений;dims - массив целого типа размерности ndims, в который помещаетсярекомендуемое число процессов вдоль каждого измерения.В массив dims должны быть занесены целые неотрицательные числа.Если элементу массива dims[i] присвоено положительное число, тодля этой размерности вычисление не производится (число процессоввдоль этого направления считается заданным). Вычисляются толькоте компоненты dims[i], для которых перед обращением к процедуребыли присвоены значения 0. Функция стремится создатьмаксимально равномерное распределение процессов вдольнаправлений, выстраивая их по убыванию, т.е.
для 12-ти процессовона построит трехмерную сетку 4 х 3 х 1.Лекции спецкурс "Пар. прогр. длявысокопроизводительных систем",24.11.201510MPI_CARTDIM_GETОпределение числа измерений врешетке.int MPI_Cartdim_get( MPI_Comm comm, int* ndims )- comm- ndimsкоммуникатор (решетка)число измеренийЛекции спецкурс "Пар. прогр. длявысокопроизводительных систем",24.11.201511MPI_CARTDIM_GETПример/* create column subgrids */belongs[0] = 1;belongs[1] = 0;MPI_Cart_sub(grid_comm, belongs, &col_comm);/* queries number of dimensions of cartesan grid */MPI_Cartdim_get(col_comm, &ndims);Лекции спецкурс "Пар. прогр.
длявысокопроизводительных систем",24.11.201512MPI_CART_COORDSint MPI_Cart_coords( MPI_Comm comm, int rank, int maxdims,int *coords)Перевод номера процесса в его координаты в решеткеЛекции спецкурс "Пар. прогр. длявысокопроизводительных систем",24.11.201513MPI_CART_COORDSПараметрыcommMPI_Comm InputКоммуникаторrankintInputРанг процессаmaxdimsintInputЧисло измеренийрешеткиcoordsint *Outpu Координаты вtрешеткеЛекции спецкурс "Пар.
прогр. длявысокопроизводительных систем",24.11.201514MPI_CART_RANKИспользуется для перевода логическихкоординат поцесса в решетке в рангпроцесса.int MPI_Cart_rank( MPI_Comm comm, int *coords, int *rank )Лекции спецкурс "Пар. прогр. длявысокопроизводительных систем",24.11.201515MPI_CART_RANKПараметрыcommMPI_CommInputПараметрыcoordsint *InputМассив размера ndimsопределяющийкоординаты процессав решеткеrankintOutput Ранг процессаЛекции спецкурс "Пар. прогр.
длявысокопроизводительных систем",24.11.201516MPI_CART_SUBИспользуется для разделения коммуникатора наподгруппы .MPI_CART_SUB создает новый коммуникаторменьшей размерностиint MPI_Cart_sub( MPI_Comm old_comm, int *belongs,MPI_Comm *new_comm )Лекции спецкурс "Пар. прогр. длявысокопроизводительных систем",24.11.201517MPI_CART_SUBПараметрыold_commMPI_CommInputПараметрыbelongsint *InputМассив размераndims, определяющийпринадлежностьновомукоммуникаторуnew_commnew_commMPI_CommOutput Новый коммуникаторрешеткаЛекции спецкурс "Пар.
прогр. длявысокопроизводительных систем",24.11.201518MPI_CART_SUB примерПредполагаем, что число процессов =6.Формируем 2D (3x2) решетку. Заполняем матрицуA(i,j)A(i,j) = (i+1)*10 + j + 1; i=0,1,2; j=0,1Значения элементов:A(0,0) = 11, A(2,1) = 32 и т.д..Создаем подрешетку, используя MPI_CART_SUB.Лекции спецкурс "Пар. прогр.
длявысокопроизводительных систем",24.11.201519MPI_CART_SUB пример#include "stdio.h"#include "mpi.h"void main(int argc, char *argv[]){int nrow, mcol, i, lastrow, p, root;int Iam, id2D, colID, ndim;int coords1D[2], coords2D[2], dims[2], aij[1], alocal[3];int belongs[2], periods[2], reorder;MPI_Comm comm2D, commcol;/* Starts MPI processes ... */MPI_Init(&argc, &argv); /* starts MPI */MPI_Comm_rank(MPI_COMM_WORLD, &Iam);/* get current process id */MPI_Comm_size(MPI_COMM_WORLD, &p);/* get number of processes */Лекции спецкурс "Пар.
прогр. длявысокопроизводительных систем",24.11.201520MPI_CART_SUB примерnrow = 3; mcol = 2; ndim = 2;root = 0; periods[0] = 1; periods[1] = 0; reorder = 1;/* create cartesian topology for processes */dims[0] = ncol;/* number of columns */dims[1] = mrow;/* number of rows */MPI_Cart_create(MPI_COMM_WORLD, ndim, dims, periods, reorder,&comm2D);MPI_Comm_rank(comm2D, &id2D);MPI_Cart_coords(comm2D, id2D, ndim, coords2D);/* Create 1D column subgrids */belongs[0] = 1;/* this dimension belongs to subgrid */belongs[1] = 0;MPI_Cart_sub(comm2D, belongs, &commcol);MPI_Comm_rank(commcol, &colID);MPI_Cart_coords(commcol, colID, 1, coords1D);Лекции спецкурс "Пар.
прогр. длявысокопроизводительных систем",24.11.201521MPI_CART_SUB примерMPI_Barrier(MPI_COMM_WORLD);/* aij = (i+1)*10 + j + 1; 1 matrix element to each proc */aij[0] = (coords2D[0]+1)*10 + coords2D[1]+1;if(Iam == root) {printf("\n MPI_Cart_sub example:");printf("\n 3x2 cartesian grid ==> 2 (3x1) column subgrids\n");printf("\n Iam 2D2D1D1Daij");printf("\n Rank Rank coords. Rank coords.\n");}/* Last element of each column gathers elements of its own column */for ( i=0; i<=nrow-1; i++) {alocal[i] = -1;}Лекции спецкурс "Пар. прогр.