MPI (по Бахтину) (Лекции)
Описание файла
Файл "MPI (по Бахтину)" внутри архива находится в папке "Лекции". PDF-файл из архива "Лекции", который расположен в категории "". Всё это находится в предмете "суперкомпьютерное моделирование и технологии" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Стандарт MPIОсновные понятияБлокирующие двухточечные обменыДвухточечные обмены с буферизацией,другие типы двухточечных обменовMPIMPIMPIMPI1.12.02.13.0Standard разрабатывался 92-94- 95-97- 2008 сентябрь 2008 г.- сентябрь 2012 г.Стандартыhttp://www.mcs.anl.gov/mpihttp://www.mpi-forum.org/docs/docs.htmlhttps://computing.llnl.gov/tutorials/mpi/Описание функцийhttp://www-unix.mcs.anl.gov/mpi/www/Основная цель:• Обеспечение переносимости исходных кодов• Эффективная реализацияКроме того:◦ Большая функциональность◦ Поддержка неоднородных параллельныхархитектурMPICH LAM/MPI Mvapich OpenMPI Коммерческие реализации Intel, IBM идр.Параллельная программа состоит изпроцессов, процессы могут бытьмногопоточными.MPI реализует передачу сообщений междупроцессами.Межпроцессное взаимодействие предполагает:◦ синхронизацию◦ перемещение данных из адресного пространстваодного процесса в адресное пространство другогопроцесса.Процессы объединяются в группы.Каждое сообщение посылается в рамкахнекоторого контекста и должно бытьполучено в том же контексте.Группа и контекст вместе определяюткоммуникатор.Процесс идентифицируется своим номеромв группе, ассоциированной скоммуникатором.Коммуникатор, содержащий все начальныепроцессы, называется MPI_COMM_WORLD.Управляющий объект, представляющий группупроцессов, которые могут взаимодействовать другс другомВсе обращения к MPI функциям содержаткоммуникатор, как параметрНаиболее часто используемый коммуникаторMPI_COMM_WORLDОпределяется при вызове MPI_InitСодержит ВСЕ процессы программыДанные в сообщении описываются тройкой:(address, count, datatype), где datatypeопределяется рекурсивно как:◦ Предопределенный базовый тип, соответствующий типуданных в базовом языке (например, MPI_INT,MPI_DOUBLE_PRECISION)◦ Непрерывный массив MPI типов◦ Векторный тип◦ Индексированыый тип◦ Произвольные структурыMPI включает функции для построенияпользовательских типов данных, например, типаданных, описывающих пары (int, float).MPI datatypeC datatypeMPI_CHARsigned charMPI_SHORTsigned short intMPI_INTsigned intMPI_LONGsigned long intMPI_UNSIGNED_CHARunsigned charMPI_UNSIGNED_SHORTunsigned short intMPI_UNSIGNEDunsigned intMPI_UNSIGNED_LONGunsigned long intMPI_FLOATfloatMPI_DOUBLEdoubleMPI_LONG_DOUBLElong doubleСообщение сопровождается определяемымпользователем признаком дляидентификации принимаемого сообщенияТеги сообщений у отправителя иполучателя должны быть согласованы.Можно указать в качестве значения тэгаконстанту MPI_ANY_TAG.Некоторые не-MPI системы передачисообщений называют тэг типом сообщения.MPI вводит понятие тэга, чтобы не путатьэто понятие с типом данных MPI.error = MPI_Xxxxx(parameter,...);MPI_Xxxxx(parameter,...);Возвращаемое значение – код ошибки.
Определяетсяконстантой MPI_SUCCESSint error;......error = MPI_Init(&argc, &argv));if (error != MPI_SUCCESS){fprintf (stderr, “ MPI_Init error \n”);return 1;}При запуске указываем число требуемыхпроцессоров np и название программыmpirun –np 3 progНа выделенных для расчета узлах запускается npкопий указанной программыКаждая копия программы получает два значения:◦ np◦ rank из диапазона [0 ... np-1]Любые две копии программы могутнепосредственно обмениваться данными спомощью функций передачи сообщений#include <mpi.h>main(int argc, char **argv){int numtasks, rank;MPI_Init(&argc, &argv);MPI_Comm_size(MPI_COMM_WORLD, &numtasks);MPI_Comm_rank(MPI_COMM_WORLD, &rank);printf("Hello World from process %d of %d\n“,rank, numtasks);MPI_Finalize();}int MPI_Init(int *argc, char ***argv)должна первым вызовом, вызывается только один разint MPI_Comm_size(MPI_Comm comm, int *size)число процессов в коммуникатореint MPI_Comm_rank(MPI_Comm comm, int *rank)номер процесса в коммуникаторе (нумерация с 0)int MPI_Finalize()завершает работу процессаint MPI_Abort (MPI_Comm_size(MPI_Comm comm, int*errorcode)завершает работу программыСодержит: Source: status.MPI_SOURCE Tag: status.MPI_TAG Count: MPI_Get_countВ двухточечном обмене участвуют толькодва процесса, процесс-отправитель ипроцесс-получатель (источник сообщенияи адресат).Двухточечные обмены используются дляорганизации локальных инеструктурированных коммуникаций.Двухточечный обмен возможен только междупроцессами, принадлежащими одной областивзаимодействия (одному коммуникатору).Отправитель должен указать правильныйrank получателяПолучатель должен указать верный rankотправителяОдинаковый коммуникаторТэги должны соответствовать друг другуБуфер у процесса-получателя должен бытьдостаточного объемаблокирующие прием/передача, которыеприостанавливают выполнение процесса на времяприема или передачи сообщения;неблокирующие прием/передача, при которыхвыполнение процесса продолжается в фоновомрежиме, а программа в нужный момент можетзапросить подтверждение завершения приемасообщения;синхронный обмен, который сопровождаетсяуведомлением об окончании приема сообщения;асинхронный обмен, который таким уведомлениемне сопровождается.Правильно организованный двухточечныйобмен сообщениями должен исключатьвозможность блокировки или некорректнойработы параллельной MPI-программы.Примеры ошибок в организации двухточечныхобменов: выполняется передача сообщения, но не выполняется егоприем; процесс-источник и процесс-получатель одновременнопытаютсявыполнить блокирующие передачу или приемсообщения.В MPI приняты следующие соглашения об именах подпрограммдвухточечного обмена:MPI_[I][R, S, B]Sendздесь префикс [I] (Immediate) обозначает неблокирующий режим.Один из префиксов [R, S, B] обозначает режим обмена: по готовности,синхронный и буферизованный.Отсутствие префикса обозначает подпрограмму стандартного обмена.Имеется 8 разновидностей операции передачи сообщений.Для подпрограмм приема:MPI_[I]Recvто есть всего 2 разновидности приема.Подпрограмма MPI_Irsend, например, выполняет передачу «поготовности» в неблокирующем режиме, MPI_Bsend буферизованнуюпередачу с блокировкой, а MPI_Recv выполняет блокирующий приемсообщений.Подпрограмма приема любого типа может принять сообщения от любойподпрограммы передачи.int MPI_Send(void *buf, int count, MPI_Datatype datatype,intdest, int tag, MPI_Comm comm)MPI_Send(buf, count, datatype, dest, tag, comm, ierr) buf - адрес первого элемента в буфере передачи; count - количество элементов в буфере передачи(допускается count = 0); datatype - тип MPI каждого пересылаемого элемента; dest - ранг процесса-получателя сообщения ( целоечисло от 0 до n - 1, где n число процессов в областивзаимодействия); tag - тег сообщения; comm - коммуникатор; ierr - код завершения.При стандартной блокирующей передаче послезавершения вызова (после возврата изфункции/процедуры передачи) можноиспользовать любые переменные,использовавшиеся в списке параметров.
Такоеиспользование не повлияет на корректностьобмена.Дальнейшая «судьба» сообщения зависит отреализации MPI. Сообщение может быть сразупередано процессу-получателю или может бытьскопировано в буфер передачи.Завершение вызова не гарантирует доставкисообщения по назначению. Такая гарантияпредоставляется при использовании другихразновидностей двухточечного обмена.int MPI_Recv(void *buf, int count, MPI_Datatype datatype, intsource, int tag, MPI_Comm comm, MPI_Status *status)MPI_Recv(buf, count, datatype, dest, tag, comm, status, ierr)buf - адрес первого элемента в буфере приёма;count - количество элементов в буфере приёма;datatype - тип MPI каждого пересылаемого элемента;source - ранг процесса-отправителя сообщения ( целоечисло от 0 до n - 1, где n число процессов в областивзаимодействия);tag - тег сообщения;comm - коммуникатор;status - статус обмена;ierr - код завершения.Значение параметра count может оказаться больше, чемколичество элементов в принятом сообщении.
В этомслучае после выполнения приёма в буфере изменитсязначение только тех элементов, которые соответствуютэлементам фактически принятого сообщения.Для функции MPI_Recv гарантируется, что послезавершения вызова сообщение принято и размещено вбуфере приема.MPI_ERR_COMM - неправильно указан коммуникатор.Часто возникает при использовании «пустого»коммуникатора;MPI_ERR_COUNT - неправильное значение аргументаcount(количество пересылаемых значений);MPI_ERR_TYPE - неправильное значение аргумента,задающего тип данных;MPI_ERR_TAG - неправильно указан тег сообщения;MPI_ERR_RANK - неправильно указан ранг источникаили адресата сообщения;MPI_ERR_ARG - неправильный аргумент, ошибочноезадание которого не попадает ни в один классошибок;MPI_ERR_REQUEST - неправильный запрос навыполнение операции.В качестве ранга источника сообщения и вкачестве тега сообщения можно использовать«джокеры» :◦ MPI_ANY_SOURCE - любой источник;◦ MPI_ANY_TAG - любой тег.При использовании «джокеров» есть опасностьприема сообщения, не предназначенногоданному процессуПодпрограмма MPI_Recv может приниматьсообщения, отправленные в любом режиме.Прием может выполняться от произвольногопроцесса, а в операции передачи должен бытьуказан вполне определенный адрес.Приемник может использовать «джокеры» дляисточника и для тега.
Процесс может отправитьсообщение и самому себе, но следует учитывать,что использование в этом случае блокирующихопераций может привести к «тупику».Размерполученногосообщения(count)определить с помощью вызова подпрограммыintMPI_Get_count(MPI_Statusdatatype, int *count)*status,можноMPI_DatatypeMPI_Get_count(status, datatype, count, ierr) count - количество элементов в буфере передачи; datatype - тип MPI каждого пересылаемого элемента; status - статус обмена; ierr - код завершения.Аргумент datatype должен соответствовать типу данных,указанному в операции обменаПередача сообщения в буферизованномрежиме может быть начата независимо от того,зарегистрирован ли соответствующий прием.Источник копирует сообщение в буфер, а затемпередает его в неблокирующем режиме, так жекак в стандартном режиме.Эта операция локальна, поскольку еевыполнение не зависит от наличиясоответствующего приема.Если объем буфера недостаточен, возникаетошибка.