Lect_4_201015 (811481)
Текст из файла
Параллельное программирование длявысокопроизводительных вычислительных систем.сентябрь – декабрь 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.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.