Лекция 5. Распределение данных. Основы MPI (1186103), страница 2
Текст из файла (страница 2)
2015-2016 уч.г.MPI_Sendint MPI_Send(void *buf,int count, MPI_Datatype datatype,int dest,int tag, MPI_Comm comm)bufcountDatatype desttagcomm-адрес буферачисло пересылаемых элементовMPI datatyperank процесса-получателяопределяемый пользователем параметр,MPI-коммуникаторПример:MPI_Send(data,500,MPI_FLOAT,6,33,MPI_COMM_WORLD)http://www-unix.mcs.anl.gov/mpi/www/www3/MPI_Send.htmlMPI_Recvint MPI_Recv(void *buf,int count, MPI_Datatype datatype,int source, inttag, MPI_Comm comm, MPI_Status *status )bufcountDatatype sourcetagcommstatus-адрес буферачисло пересылаемых элементовMPI datatyperank процесса-отправителяопределяемый пользователем параметр,MPI-коммуникатор,статусПример:MPI_Send(data,500,MPI_FLOAT,6,33,MPI_COMM_WORLD)http://www-unix.mcs.anl.gov/mpi/www/www3/MPI_Send.htmlWildcarding (джокеры)Получатель может использовать джокердля получения сообщения от ЛЮБОГО процессаMPI_ANY_SOURCEДля получения сообщения с ЛЮБЫМ тэгомMPI_ANY_TAGРеальные номер процесса-отправителя и тэг возвращаютсячерез параметр statusИнформация о завершившемся приемесообщенияВозвращается функцией MPI_Recv через параметрstatusСодержит: Source: status.MPI_SOURCE Tag:status.MPI_TAG Count: MPI_Get_countПолученное сообщениеМожет быть меньшего размера, чем указано в функцииMPI_Recvcount – число реально полученных элементовC:int MPI_Get_count (MPI_Status *status,MPI_Datatype datatype, int *count)MPI_Probeint MPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status*status)Проверка статуса операции приема сообщения.Параметры аналогичны функции MPI_RecvПримерif (rank == 0) {// Send size of integers to process 1MPI_Send(buf, size, MPI_INT, 1, 0,MPI_COMM_WORLD);printf("0 sent %d numbers to 1\n",size);} else if (rank == 1) {MPI_Status status;// Probe for an incoming message fromprocessMPI_Probe (0, 0, MPI_COMM_WORLD,&status);MPI_Get_count (&status, MPI_INT,&size);int* number_buf =(int*)malloc(sizeof(int) * size);// Now receive the message with theallocated bufferMPI_Recv (number_buf, size, MPI_INT,0, 0, MPI_COMM_WORLD,MPI_STATUS_IGNORE);printf("1 dynamically received %dnumbers from 0.\n",number_amount);free(number_buf);}Совмещение передач типа «отсылкаприем»int MPI_Sendrecv (void *sendbuf,int sendcount, MPI_Datatype sendtype,int dest, int sendtag,void *rcvbuf, int rcvcount, MPI_Datatype rcvtype,int source, int rcvtag,MPI_Comm comm,MPI_Status *status)Обмен данными одного типа сзамещениемint MPI_Sendrecv_replace(void* buf, int count,MPI_Datatype datatype,int dest, int sendtag,int source, int recvtag,MPI_Comm comm, MPI_Status *status)Неблокирующие коммуникацииЦель – уменьшение времени работы параллельнойпрограммы за счет совмещения вычислений и обменов.Неблокирующие операции завершаются, не дожидаясьокончания передачи данных.Проверка состояния передач и ожидание завершениепередач выполняются специальными функциями.Форматы неблокирующих функцийMPI_Isend(buf,count,datatype,dest,tag,comm,request)MPI_Irecv(buf,count,datatype,source,tag,comm, request)Проверка завершения операций MPI_Wait() and MPI_Test().MPI_Wait() ожидание завершения.MPI_Test() проверка завершения.
Возвращается флаг,указывающий на результат завершения.Замер времени MPI_WtimeВремя замеряется в секундахВыделяется интервал в программеdouble MPI_Wtime(void);Пример.double start, finish, elapsed, time ;start=-MPI_Wtime;MPI_Send(…);finish = MPI_Wtime();time= start+finish;Параллельное программирование для ВВС.Магистр. 2015-2016 уч.г.Функции коллективных передачПараллельное программирование для ВВС.Магистр. 2015-2016 уч.г.Характеристики коллективных передачКоллективные операции не являются помехой операциям типа«точка-точка» и наоборотВсе процессы коммуникатора должны вызывать коллективнуюоперациюСинхронизация не гарантируется (за исключением барьера)Нет неблокирующих коллективных операцийНет тэговПринимающий буфер должен точно соответствовать размеруотсылаемого буфераШироковещательная рассылкаOne-to-all передача: один и тот же буфер отсылается отпроцесса root всем остальным процессам в коммуникатореint MPI_Bcast (void *buffer, int, count,MPI_Datatype datatype,int root, MPI_Comm comm)Все процессы должны указать один тот же root и communicatorScatterOne-to-all communication: различные данные из одногопроцесса рассылаются всем процессам коммуникатора (впорядке их номеров)int MPI_Scatter(void* sendbuf, int sendcount,MPI_Datatype sendtype, void* recvbuf,int recvcount,MPI_Datatype recvtype, int root,MPI_Comm comm)sendcount – число элементов, посланных каждому процессу, необщее число отосланных элементов;send параметры имеют смысл только для процесса rootScatter – графическая иллюстрацияABCDEABCDEABCDEГлобальные операции редукцииОперации выполняются над данными, распределенными попроцессам коммуникатораПримеры: Глобальная сумма или произведение Глобальный максимум (минимум) Глобальная операция, определенная пользователемПараллельное программирование для ВВС.Магистр.
2015-2016 уч.г.Общая формаint MPI_Reduce(void* sendbuf, void* recvbuf,int count, MPI_Datatype datatype, MPI_Op op,int root,MPI_Comm comm)•••count число операций “op” выполняемых надпоследовательными элементами буфера sendbuf(также размер recvbuf)op является ассоциативной операцией, котораявыполняется над парой операндов типа datatypeи возвращает результат того же типаПараллельное программирование для ВВС.Магистр. 2015-2016 уч.г.Предопределенные операции редукцииMPI NameMPI_MAXMPI_MINMPI_SUMMPI_PRODMPI_LANDMPI_BANDMPI_LORMPI_BORMPI_LXORMPI_BXORMPI_MAXLOCMPI_MINLOCFunctionMaximumMinimumSumProductLogical ANDBitwise ANDLogical ORBitwise ORLogical exclusive ORBitwise exclusive ORMaximum andlocationMinimum and locationПараллельное программирование для ВВС.Магистр.
2015-2016 уч.г.Виртуальные топологииДекартова топологияЛогическая топология, определяемая многомернойрешеткой.Обобщение линейной и матричной топологий напроизвольное число измерений.Для создания коммуникатора с декартовойтопологией используется функция MPI_Cart_create.С помощью этой функции можно создаватьтопологии с произвольным числом измерений,причем по каждому измерению в отдельности можнонакладывать периодические граничные условия.Лекции "Параллельное программированиедля высокопроизводительных систем",лекция 6, 13.11.201566Виртуальные топологииОсновные функции:MPI_CART_CREATEMPI_CART_COORDSMPI_CART_RANKMPI_CART_SUBMPI_CARTDIM_GETMPI_CART_GETMPI_CART_SHIFTЛекции "Параллельное программированиедля высокопроизводительных систем",лекция 6, 13.11.201567MPI_CART_CREATEСоздает структуру «прямоугольная решетка»произвольной размерности.int MPI_Cart_create(MPI_Comm old_comm, int ndims, int*dim_size, int *periods, int reorder, MPI_Comm *new_comm).Лекции "Параллельное программированиедля высокопроизводительных систем",лекция 6, 13.11.201568MPI_CART_SUBИспользуется для разделения коммуникатора наподгруппы .
MPI_CART_SUB создает новыйкоммуникатор меньшей размерностиint MPI_Cart_sub( MPI_Comm old_comm, int*belongs, MPI_Comm *new_comm )Лекции "Параллельное программированиедля высокопроизводительных систем",лекция 6, 13.11.201569MPI_CART_SHIFTПолучение номеров посылающего (source) ипринимающего (dest) процессов в декартовой топологиикоммуникатора comm для осуществления сдвига вдольизмерения direction на величину disp.int MPI_Cart_shift( MPI_Comm comm, int direction,int displ, int *source, int *dest )Лекции "Параллельное программированиедля высокопроизводительных систем",лекция 6, 13.11.201570MPI_CART_SHIFTПараметрыcommMPI_CommInputКоммуникаторdirectionintInputРазмерность, по которой будетпроизводиться сдвигdisplintInputВеличина и направлениесдвига (<0; >0; or 0)sourceint *OutputПроцесс- источникdestint *OutputПроцесс- получательЛекции "Параллельное программированиедля высокопроизводительных систем",лекция 6, 13.11.201571MPI_CART_SHIFTДля периодических измерений осуществляетсяциклический сдвиг, для непериодических – линейныйсдвиг.Для n-мерной декартовой решетки значение directionдолжно быть в пределах от 0 до n-1.Значения source и dest можно использовать,например, для обмена функцией MPI_Sendrecv.Не является коллективной операцией!Лекции "Параллельное программированиедля высокопроизводительных систем",лекция 6, 13.11.201572Обмен данными в программе.Процессунеобходимоданными с соседями.обменятьсяИз-за того что данные хранятся впамяти не непрерывно, для выполнениямежпроцессорныхобменовпредварительноформируютсяпередаваемые сообщения.ПотомприпомощифункцийMPI_Cart_shift происходит определениеранга процесса, которому надо послатьданные, и процесса, от которого данныенеобходимо получить.