Lect_5_272015 (MPI), страница 2
Описание файла
Файл "Lect_5_272015" внутри архива находится в папке "MPI". PDF-файл из архива "MPI", который расположен в категории "". Всё это находится в предмете "параллельное программирование для высокопроизводительных вычислительных систем" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 2 страницы из PDF
. . . . .MPI_Comm_rank(comm, &myid);color = myid%3;MPI_Comm_split(comm, color, myid, &newcomm);Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 523Пример: вычисление числа Pi(программа в приложении к лекции)Окружность вписывается в квадрат 2 x 2. Отношениеплощадей:Точки внутри квадрата выбираются случайноОтношение числа случайно выбранных точек,попавших в квадрат к числу точек, попавших в кругравно Pi.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 5243.16Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 5253.17Монте Карло метод для интегрированияпроизвольных функцийВычисление случайного значения x для вычисления f(x)и суммы f(x):xr – случайно сгенерированные значенияx, принадлежащие отрезку[x1, x2].Метод Монте Карло полезен для вычисления функций, которыене могут быть проинтегрированы численно (многомерныхфункций)Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 5263.19Вычисление числа Pi(1)/* compute pi using Monte Carlo method */#include <stdio.h>#include <limits.h>#include <stdlib.h>#include <math.h>#include "mpi.h"#define CHUNKSIZE1000/* message tags */#define REQUEST 1#define REPLY 2Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 527Вычисление числа Pi(2)int main(int argc, char *argv[]){int iter;int in, out, i, iters, max, ix, iy, ranks[1], done, temp;double x, y, Pi, error, epsilon;int numprocs, myid, server, totalin, totalout, workerid;int rands[CHUNKSIZE], request;MPI_Comm world, workers;MPI_Group world_group, worker_group;MPI_Status status;Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 528Вычисление числа Pi (2)MPI_Init(&argc, &argv);world = MPI_COMM_WORLD;MPI_Comm_size(world, &numprocs);MPI_Comm_rank(world, &myid);server = numprocs-1; /* last proc is server */if (myid == 0) {if (argc < 2) {fprintf(stderr, "Usage: %s epsilon\n", argv[0] );MPI_Abort(MPI_COMM_WORLD, 1);}sscanf( argv[1], "%lf", &epsilon );}MPI_Bcast(&epsilon, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 529MPI_Comm_group(world, &world_group);ranks[0] = server;MPI_Group_excl(world_group, 1, ranks, &worker_group);MPI_Comm_create(world, worker_group, &workers);MPI_Group_free(&worker_group);Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 530if (myid == server) {/* I am the rand server */do {MPI_Recv(&request, 1, MPI_INT, MPI_ANY_SOURCE, REQUEST,world, &status);if (request) {for (i = 0; i < CHUNKSIZE; ) {rands[i] = random();if (rands[i] <= INT_MAX) i++;}MPI_Send(rands, CHUNKSIZE, MPI_INT,status.MPI_SOURCE, REPLY, world);}}while(request > 0);Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 531}else {/* I am a worker process */request = 1;done = in = out = 0;max = INT_MAX;/* max int, for normalization */MPI_Send(&request, 1, MPI_INT, server, REQUEST, world);MPI_Comm_rank(workers, &workerid);iter = 0;while (!done) {iter++;request = 1;MPI_Recv(rands, CHUNKSIZE, MPI_INT, server, REPLY,world, MPI_STATUS_IGNORE);Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 532for (i=0; i<CHUNKSIZE; ) {x = (((double) rands[i++])/max) * 2 - 1;y = (((double) rands[i++])/max) * 2 - 1;if (x*x + y*y < 1.0)in++;elseout++;}MPI_Allreduce(&in, &totalin, 1, MPI_INT, MPI_SUM,workers);MPI_Allreduce(&out, &totalout, 1, MPI_INT, MPI_SUM,workers);Pi = (4.0*totalin)/(totalin + totalout);Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 533error = fabs( Pi-3.141592653589793238462643);done = (error < epsilon || (totalin+totalout) > 100000000);request = (done) ? 0 : 1;if (myid == 0) {printf( "\rpi = %23.20f", Pi );MPI_Send(&request, 1, MPI_INT, server, REQUEST,world);} else {if (request)MPI_Send(&request, 1, MPI_INT, server, REQUEST,world);} }MPI_Comm_free(&workers); }Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 534if (myid == 0) {printf( "\npoints: %d\nin: %d, out: %d, <ret> to exit\n",totalin+totalout, totalin, totalout );getchar();}MPI_Finalize();return 0;}Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 535Виртуальные топологииТопология – механизм сопоставления процессамальтернативной схемы адресации.
В MPI топологиивиртуальны, не связаны с физической топологиейсети.Два типа топологий:- декартова (прямоугольная решеткапроизвольной размерности)- топология графа.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 536Декартова топологияЛогическая топология, определяемая многомернойрешеткой.Обобщение линейной и матричной топологий напроизвольное число измерений.Для создания коммуникатора с декартовойтопологией используется функция MPI_Cart_create.С помощью этой функции можно создаватьтопологии с произвольным числом измерений,причем по каждому измерению в отдельности можнонакладывать периодические граничные условия.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 537Виртуальные топологииОсновные функции:MPI_CART_CREATEMPI_CART_COORDSMPI_CART_RANKMPI_CART_SUBMPI_CARTDIM_GETMPI_CART_GETMPI_CART_SHIFTСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 538MPI_CART_CREATEСоздает структуру «прямоугольная решетка»произвольной размерности.int MPI_Cart_create(MPI_Comm old_comm, int ndims, int*dim_size, int *periods, int reorder, MPI_Comm *new_comm).Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 539MPI_CART_CREATEПараметрыold_commMPI_CommInputИсходный коммуникаторndimsintInputЧисло измеренийdim_sizeint *InputМассив размера ndims длязадания числа элементов покаждой из размерностейperiodsint *InputМассив размера ndims длязадания «периодичности» покаждой из размерностейreorderintInputФлаг для заданияпереупорядочиванияэлементовnew_commMPI_Comm *OutputНовый коммуникаторСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 540MPI_Cart_createФункция является коллективной, т.е.
должна запускаться навсех процессах, входящих в группу коммуникатора comm_old.Если какие-то процессы не попадают в новую группу, то для нихвозвращается результат MPI_COMM_NULL. В случае, когдаразмеры заказываемой сетки больше имеющегося в группечисла процессов, функция завершается аварийно.Значение параметра reorder=false означает, что идентификаторывсех процессов в новой группе будут такими же, как в старойгруппе. Если reorder=true, то MPI будет пытатьсяперенумеровать их с целью оптимизации коммуникаций.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 541Пример виртуальной топологиирешетка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);Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 542Определение оптимальнойконфигурации декартовой решеткиint MPI_Dims_create(int nnodes, int ndims, int *dims)nnodes - общее число узлов в сетке;ndims - число измерений;dims - массив целого типа размерности ndims, в который помещаетсярекомендуемое число процессов вдоль каждого измерения.В массив dims должны быть занесены целые неотрицательные числа.Если элементу массива dims[i] присвоено положительное число, тодля этой размерности вычисление не производится (число процессоввдоль этого направления считается заданным).
Вычисляются толькоте компоненты dims[i], для которых перед обращением к процедуребыли присвоены значения 0. Функция стремится создатьмаксимально равномерное распределение процессов вдольнаправлений, выстраивая их по убыванию, т.е. для 12-ти процессовона построит трехмерную сетку 4 х 3 х 1.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 543MPI_CARTDIM_GETОпределение числа измерений врешетке.int MPI_Cartdim_get( MPI_Comm comm, int* ndims )- comm- ndimsкоммуникатор (решетка)число измеренийСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 544MPI_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);Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 545MPI_CART_COORDSint MPI_Cart_coords( MPI_Comm comm, int rank, int maxdims,int *coords)Перевод номера процесса в его координаты в решеткеСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 546MPI_CART_COORDSПараметрыcommMPI_Comm InputКоммуникаторrankintInputРанг процессаmaxdimsintInputЧисло измеренийрешеткиcoordsint *Outpu Координаты вtрешеткеСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 547MPI_CART_RANKИспользуется для перевода логическихкоординат поцесса в решетке в рангпроцесса.int MPI_Cart_rank( MPI_Comm comm, int *coords, int *rank )Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 548MPI_CART_RANKПараметрыcommMPI_CommInputПараметрыcoordsint *InputМассив размера ndimsопределяющийкоординаты процессав решеткеrankintOutput Ранг процессаСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 549MPI_CART_SUBИспользуется для разделения коммуникатора наподгруппы .MPI_CART_SUB создает новый коммуникаторменьшей размерностиint MPI_Cart_sub( MPI_Comm old_comm, int *belongs,MPI_Comm *new_comm )Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 550MPI_CART_SUBПараметрыold_commMPI_CommInputПараметрыbelongsint *InputМассив размераndims, определяющийпринадлежностьновомукоммуникаторуnew_commnew_commMPI_CommOutput Новый коммуникаторрешеткаСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 551MPI_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.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 552MPI_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 ...