лекции (MPI), страница 5
Описание файла
Файл "лекции" внутри архива находится в папке "MPI". PDF-файл из архива "MPI", который расположен в категории "". Всё это находится в предмете "параллельное программирование для высокопроизводительных вычислительных систем" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 5 страницы из PDF
Построить графики ускорения иэффективности для различных параметров решаемой задачи.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 436СпецкурсПараллельное программирование длявысокопроизводительных системсентябрь – декабрь 2015 г.Лектор доцент Н.Н.ПоповаЛекция 527 октября 2015 г.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 51ТемаГруппы процессовВиртуальные топологии MPIБлочные параллельные алгоритмыматричного умножения.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 52Группы и коммуникаторыСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 53Группы и коммуникаторыГруппа:Упорядоченное множество процессовКаждый процесс в группе имеет уникальный номерПроцесс может принадлежать нескольким группамКоммуникаторы:rank всегда относителен группыВсе обмены сообщений всегда проходят в рамкахкоммуникатораС точки зрения программирования группы и коммуникаторыэквивалентныГруппы и коммуникаторы – динамические объекты,должны создаваться и уничтожаться в процессеработы программыСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 54Типы коммуникаторовСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 55Типы коммуникаторыIntercommunicatorОбмены (только 2-ухточеченные) между процессами изразных коммуникаторовIntracommunicator:Все обмены сообщений всегда проходят в рамках одногокоммуникатораКоммуникатор может быть только одного типа: либо inter, либоintra !Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 56Создание новых коммуникаторов2 способа создания новых коммуникаторов:• Использовать функции для работы с группами икоммуникаторами (создать новую группупроцессов и по новой группе создатькоммуникатор, разделить коммуникатор и т.п.)• Использовать встроенные в MPI виртуальныетопологииСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 57Типичный шаблон работы1.2.3.4.5.6.Извлечение глобальной группы из коммуникатораMPI_COMM_WORLD, используя функциюMPI_Comm_groupФормирование новой группы как подмножестваглобальной группы, используя MPI_Group_incl илиMPI_Group_exclСоздание новый коммуникатор для новой группы,используя MPI_Comm_createОпределение номера процесса в новом коммуникаторе,используя MPI_Comm_rankОбмен сообщениями, используя функции MPIПо окончании освобождение созданных коммуникатораи группы, используя MPI_Comm_free и MPI_Group_freeСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 58main(int argc, char **argv) {int me, count, count2;void *send_buf, *recv_buf, *send_buf2, *recv_buf2;MPI_Group MPI_GROUP_WORLD, grprem;MPI_Comm commslave;static int ranks[] = {0};MPI_Init(&argc, &argv);MPI_Comm_group(MPI_COMM_WORLD, &MPI_GROUP_WORLD);MPI_Comm_rank(MPI_COMM_WORLD, &me);MPI_Group_excl(MPI_GROUP_WORLD, 1, ranks, &grprem);MPI_Comm_create(MPI_COMM_WORLD, grprem, &commslave);if(me != 0){ /* compute on slave */MPI_Reduce(send_buf,recv_buff,count, MPI_INT, MPI_SUM, 1,commslave);}/* zero falls through immediately to this reduce, others do later...
*/MPI_Reduce(send_buf2, recv_buff2, count2, MPI_INT, MPI_SUM, 0,MPI_COMM_WORLD);MPI_Comm_free(&commslave);MPI_Group_free(&MPI_GROUP_WORLD);MPI_Group_free(&grprem);MPI_Finalize();}Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 59Специальные типы MPIMPI_CommMPI_COMM_WORLD – коммуникатор для всех процессов приложения.MPI_COMM_NULL – значение, используемое для ошибочногокоммуникатора.MPI_COMM_SELF – коммуникатор, включающий только вызвавшийпроцесс.MPI_groupMPI_GROUP_EMPTY – пустая группа.MPI_GROUP_NULL – значение, используемое для ошибочной группыСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 510Количество процессов в группеРазмер группы (число процессов в группе)int MPI_Group_size(MPI_Group comm, int *size)Результат – число процессовЕсли указать MPI_GROUP_EMPTY, то size=0Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 511Номер процесса в группеНомер процесса в группеint MPI_Group_rank(MPI_Group comm, int *rank)Результат – номер процессов или MPI_UNDEFINEDСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 512Определение группы по коммуникаторуГруппа по коммуникаторуint MPI_Comm_group(MPI_Comm comm, MPI_Group*group)Пример:MPI_Group commGroup;MPI_Comm_group (MPI_COMM_WORLD, &commGroup);Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 513Включение процессов в группуВключение процессов в группуint MPI_Group_incl(MPI_Group comm, , int n, int*ranks, MPI_Group *newgroup)n- число процессов в новой группеranks – номера процессов в группе group, которыебудут составлять группу newgroup (выходнойпараметр);newgroup – новая группа, составленная изпроцессов из ranks, в порядке, определенном ranks(выходной параметр).В случае n=0 MPI_Group_incl вернет MPI_GROUP_EMPTY.Функция может применяться для перенумерации процессов вгруппе.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 514Исключение процессов из группыНомер процесса в группеint MPI_Group_excl(MPI_Group oldgroup, , int n, int *ranks, MPI_Group*newgroup)n - число процессов в массиве ranksranks – номера процессов в группе oldgroup, которые будутисключаться из группы oldgroup;newgroup – новая группа , не содержащая процессов с номерами изranks, порядок процессов такой же, как в группе group (выходнойпараметр).Каждый из n процессов с номерами из массива ranks долженсуществовать, иначе функция вернет ошибку.
В случае n=0MPI_Group_excl вернет группу group.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 515Сравнение групп процессовint MPI_Group_compare(MPI_Group group1,MPI_Group group2, int *result)MPI_Group_compare возвращает результат сравнения двухгрупп:MPI_IDENT – состав и порядок одинаковые в обеих группах;MPI_SIMILAR – обе группы содержат одинаковые процессы, ноих порядок в группах разный;MPI_UNEQUAL – различные состав и порядок групп.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 516Трансляция номеров процессов междугруппамиint MPI_Group_translate_ranks ( MPI_Group group_a,int n, int *ranks_a, MPI_Group group_b, int*ranks_b )Функция возвращает список номеров процессов из группыgroup_a в их номера в группе group_bMPI_UNDEFINED возвращается для процессов, которых нет вgroup_bСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 517Создание коммуникатора по группеint MPI_Comm_create (MPI_Comm comm, MPI_Group group,MPI_Comm *newcomm)comm – коммуникатор;group – группа, представляющая собой подмножество процессов,ассоциированное с коммуникатором comm;newcomm – новый коммуникатор (выходной параметр).Функия MPI_Comm_create создает новый коммуникатор, с которымассоциирована группа group.
Функция возвращает MPI_COMM_NULLпроцессам, не входящим в group.MPI_Comm_create завершится с ошибкой, если не все аргументы groupбудут одинаковыми в различных вызывающих функцию процессах, илиесли group не является подмножеством группы, ассоциированной скоммуникатором comm. Вызвать функцию должны все процессы,входящие в comm, даже если они не принадлежат новой группе.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 518Создание несколькихкоммуникаторовint MPI_Comm_split(MPI_Comm comm, int color, int key,MPI_Comm *newcomm)comm - коммуникатор;color - признак разделения на группы;key - параметр, определяющий нумерацию в новыхкоммуникаторах;newcomm – новый коммуникатор (выходнойпараметр).Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 519MPI_Comm_splitФункция разбивает все множество процессов,входящих в коммуникатор comm, на непересекающиесяподгруппы - одну подгруппу на каждое значениепараметра color (неотрицательное число).Каждая новая подгруппа содержит все процессыодного цвета.
Если в качестве color указано значениеMPI_UNDEFINED, то в newcomm будет возвращенозначение MPI_COMM_NULL.Это коллективная функция, но каждый процесс можетуказывать свои значения для параметров color и key..Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 520MPI_Comm_splitЗначение color определяет порядок нумерациипроцессов в новом коммуникаторе:- процессы с меньшим значением color получатменьший rank в новом коммуникаторе;-если значение color одинаково, то нумерацияпроцессов в новом коммуникаторе будет определятьсяпорядком следования в исходном коммуникаторе.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 521ПримерБудет создано 3 группы процессов:{I,c,d}, {k,b,e,g,h}, {f}Процессы a a и j получат значение MPI_COMM_NULLСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 522Пример MPI_Comm_splitMPI_comm comm, newcomm;int myid, color; .
. . . . .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Виртуальные топологииТопология – механизм сопоставления процессамальтернативной схемы адресации.