Lect_4_201015 (MPI)
Описание файла
Файл "Lect_4_201015" внутри архива находится в папке "MPI". PDF-файл из архива "MPI", который расположен в категории "". Всё это находится в предмете "параллельное программирование для высокопроизводительных вычислительных систем" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Параллельное программирование длявысокопроизводительных вычислительных систем.сентябрь – декабрь 2015 г.Лекция 420 октября 2015 г.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 41ТемаПроизводные типы данныхСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 42Производные типы данных MPIНазначение:пересылка данных, расположенных внесмежных областях памяти в одномсообщении;пересылка разнотипных данных в одномсообщении;облегчение понимания программы;Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 43Производные типы данныхне могут использоваться ни в какихоперациях, кроме коммутационных производные ТД следует понимать какописатели расположения в памятиэлементов базовых типов производный ТД - скрытый объект отображение типа:Typemap = {(type0, disp0), ...
, (typen-1, dispn-1)}Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 44СЦЕНАРИЙ РАБОТЫ СПРОИЗВОДНЫМИ ТИПАМИСоздание типа с помощью конструктора.Регистрация.Использование.Освобождение памяти.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 45Стандартный сценарий создания ииспользования производного ТДПроизводный тип строится из предопределенных типовMPI и ранее определенных производных типов спомощью специальных функций-конструкторовMPI_Type_contiguous,MPI_Type_vector, MPI_Type_hvector,MPI_Type_indexed, MPI_Type_hindexed,MPI_Type_structНовый производный тип регистрируется вызовомфункции MPI_Type_commitКогда производный тип становится ненужным, онуничтожается функцией MPI_Type_freeСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 46Производные типы данных.Typemap = {(type0, disp0), ...
, (typen-1, dispn-1)} отображение типа вместе с базовымадресом начала расположения данных bufопределяет коммуникационный буферобмена (состоит из n элементов) i-й элемент имеет адрес buf+dispi ибазовый тип typeiСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 47Характеристики ТД в MPIПротяженность (кол-во байт, котороепеременная данного типа занимает впамяти)MPI_Type_extentРазмер (кол-во реально передаваемыхбайт в коммуникационных операциях)MPI_Type_sizeСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 48MPI_Type_extentint MPI_Type_extent(MPI_Datatype datatype,MPI_Aint *extent)datatypeextent- тип данных- протяженность элемента заданного типаСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 49MPY_Type_sizeint MPI_Type_size(MPI_Datatype datatype, int*size)datatypesize- тип данных- размер элемента заданного типаСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 410MPI_Type_contiguousСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 411MPI_Type_contiguousint MPI_Type_contiguous(int count, MPI_Datatype oldtype,MPI_Datatype *newtype)count - число элементов базового типаoldtype - базовый тип данныхnewtype - новый производный тип данныхСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 412MPI_Type_commitКаждый конструктор возвращает незарегистрированный(uncommited) тип.
Процесс commit можно представить себе какпроцесс компиляции типа во внутренне представление.Должен вызываться MPI_Type_commit (&datatype).После регистрации тип может повторно использоваться.Повторный вызов commit не имеет эффекта.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 413MPI_Type_commitint MPI_Type_commit(MPI_Datatype *datatype)datatype - новый производный тип данныхСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 414MPI_Type_contiguous - пример/* create a type which describes a line of ghost cells *//* buf[0..n-1] set to ghost cells */int n;MPI_Datatype ghosts;MPI_Type_contiguous (n, MPI_DOUBLE, &ghosts);MPI_Type_commit(&ghosts)MPI_Send (buf, 1, ghosts, dest, tag, MPI_COMM_WORLD);....MPI_Type_free(&ghosts);Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 415Typemaps, продолжение Дополнительныеопределенияlower_bound(Typemap) = min dispj , j = 0,…, n-1 upper_bound(Typemap) = max(dispj +sizeof(typej)) + eextent(Typemap) =upper_bound(Typemap) lower_bound(Typemap)Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 416Дополнительные функцииMPI_Type_get_extent (MPI_Datatype datatype, MPI_Aint *lb,MPI_Aint *extent)datatype (datatype you are querying)lb(lower bound of datatype)extent (extent of datatype)Возвращает нижнюю границу и extent заданного типа.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 417MPI_Type_vectorСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 418MPI_Type_vectorint MPI_Type_vector(int count, int blocklength, int stride,MPI_Datatype oldtype, MPI_Datatype *newtype)count- число блоковblocklength - число элементов базового типа в каждом блокеstride- шаг между началами соседних блоков, измеренныйчислом элементов базового типаoldtype- базовый тип данныхnewtype- новый производный тип данных.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 419MPI_Type_hvectorСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 420MPI_Type_hvectorint MPI_Type_hvector(int count, int blocklength, MPI_Aintstride, MPI_Datatype oldtype, MPI_Datatype *newtype)count - число блоковblocklength - число элементов базового типа в каждом блокеstride - шаг между началами соседних блоков в байтахoldtype - базовый тип данныхnewtype - новый производный тип данных.Отличие от MPI_Type_vector: stride определяется в байтах, не в элементах (‘h’ –heterogeneous)Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 421Пример 1 – рассылка клеточнойструктурыИспользуется MPI_type_vector и MPI_Type_create_hvectorвместе для рассылки отмеченных клеток:Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 422Пример, продолжение.double a[6][5], e[3][3];MPI_Datatype oneslice, twosliceMPI_Aint lb, sz_dblint myrank, ierrMPI_Comm_rank (MPI_COMM_WORLD, &myrank);MPI_Type_get_extent (MPI_DOUBLE, &lb, &sz_dbl);MPI_Type_vector (3,1,2,MPI_DOUBLE, &oneslice);MPI_Type_create_hvector (3,1,12*sz_dbl, oneslice, &twoslice);MPI_Type_commit (&twoslice);Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 423MPI_Type_indexedСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 424MPI_Type_indexedint MPI_Type_indexed(int count, int *array_of_blocklengths, int*array_of_displacements, MPI_Datatype oldtype,MPI_Datatype *newtype)count - число блоковarray_of_blocklengths - массив, содержащий число элементов базового типа в каждомблокеarray_of_displacements - массив смещений каждого блока от начала размещенияэлемента нового типа, смещения измеряются числом элементов базового типаoldtype - базовый тип данныхnewtype - новый производный тип данныхСмещения между последовательными блоками не обязательно должнысовпадать.
Это позволяет выполнять пересылку данных однимвызовом.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 425Пример: верхнетреугольнаяматрица[0][0 [0][1 Последовательное расположение]]Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 426Пересылка верхнетреугольнойматрицыdouble a[100][100];Int disp[100], blocklen[100], i, dest, tag;MPI_Datatype upper;/* compute start and size of each row */for (i = 0; i < 100; ++i){disp[i] = 100*i + i;blocklen[i] = 100 – i;}MPI_Type_indexed(100, blocklen, disp, MPI_DOUBLE, &upper);MPI_Type_commit(&upper);MPI_Send(a, 1, upper, dest, tag, MPI_COMM_WORLD);Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 427MPI_Type_structСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 428MPI_Type_structint MPI_Type_struct(int count, int *array_of_blocklengths,MPI_Aint *array_of_displacements, MPI_Datatype*array_of_types, MPI_Datatype *newtype)count - число блоков;array_of_blocklength - массив, содержащий число элементоводного из базовых типов в каждом блоке;array_of_displacements - массив смещений каждого блока отначала размещения структуры, смещения измеряются в байтах;array_of_type - массив, содержащий тип элементов в каждомблоке;newtype - новый производный тип данных.Наиболее общий конструктор.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 429Упаковка данныхУпаковка / распаковка:MPI_PackMPI_UnpackОпределение размера буфера дляупаковки:MPI_Pack_sizeСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 430MPI_Packint MPI_Pack(void* inbuf, int incount, MPI_Datatype datatype,void *outbuf, int outsize, int *position, MPI_Comm comm)IN inbuf - адрес начала области памяти с элементами, которые требуется упаковать;IN incount - число упаковываемых элементов;IN datatype - тип упаковываемых элементов;OUT outbuf - адрес начала выходного буфера для упакованных данных;IN outsize - размер выходного буфера в байтах;INOUT position -текущая позиция в выходном буфере в байтах;IN comm - коммуникатор.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 431MPI_Unpackint MPI_Unpack(void* inbuf, int insize, int *position, void *outbuf, intoutcount, MPI_Datatype datatype, MPI_Comm comm)IN inbuf - адрес начала входного буфера с упакованными данными;IN insize - размер входного буфера в байтах;INOUT position - текущая позиция во входном буфере в байтах;OUT outbuf - адрес начала области памяти для размещения распакованных элементоIN outcount - число извлекаемых элементов;IN datatype - тип извлекаемых элементов;IN comm - коммуникатор.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 432Пересылка элементов разноготипаэлементы нужно предварительно запаковать водин массив, последовательно обращаясь кфункции упаковки MPI_Packпри 1ом вызове функции упаковки параметрposition, как правило, устанавливается в 0, чтобыупакованное представление размещалось сначала буферадля непрерывного заполнения буферанеобходимо в каждом последующем вызовеиспользовать значение параметра position,полученное из предыдущего вызовараспаковывать - аналогичноСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 433MPI_Pack_sizeC:int MPI_Pack_size(int incount, MPI_Datatypedatatype, MPI_Comm comm, int *size)IN incount - число элементов, подлежащих упаковкеIN datatype - тип элементов, подлежащих упаковкеIN comm - коммуникаторOUT size - размер сообщения в байтах после его упаковкиСпецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 434Пример рассылки разнотипных данных из 0-го процесса сиспользованием функций MPI_Pack и MPI_Unpackсhar buff[100];double x, y;int position, a[2];{MPI_Comm_rank(MPI_COMM_WORLD, &myrank);if (myrank == 0){ /* Упаковка данных*/position = 0;MPI_Pack(&x, 1, MPI_DOUBLE, buff, 100, &position, MPI_COMM_WORLD);MPI_Pack(&y, 1, MPI_DOUBLE, buff, 100, &position, MPI_COMM_WORLD);MPI_Pack(a, 2, MPI_INT, buff, 100, &position, MPI_COMM_WORLD);}/* Рассылка упакованного сообщения */MPI_Bcast(buff, position, MPI_PACKED, 0, MPI_COMM_WORLD);/* Распаковка сообщения во всех процессах */if (myrank != 0)position = 0;MPI_Unpack(buff, 100, &position, &x, 1, MPI_DOUBLE, MPI_COMM_WORLD);MPI_Unpack(buff, 100, &position, &y, 1, MPI_DOUBLE, MPI_COMM_WORLD);MPI_Unpack(buff, 100, &position, a, 2, MPI_INT, MPI_COMM_WORLD);Спецкурс "Параллельное программирование}для высокопроизводительных систем",лекция 435Задание 2Разработать параллельный алгоритм и исследовать егоэффективность для задачи умножения матрицы на вектор:- Матрица плотная.- Матрица разреженная.Формат представления разреженных матриц выбратьсамостоятельно.Предусмотреть возможность проверки правильности выполненияалгоритмов.В отчете представить анализ и объяснение полученных оценокэффективности алгоритмов.
Построить графики ускорения иэффективности для различных параметров решаемой задачи.Спецкурс "Параллельное программированиедля высокопроизводительных систем",лекция 436.