Lect_2_061015 (MPI)
Описание файла
Файл "Lect_2_061015" внутри архива находится в папке "MPI". PDF-файл из архива "MPI", который расположен в категории "". Всё это находится в предмете "параллельное программирование для высокопроизводительных вычислительных систем" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
СпецкурсПараллельное программирование длявысокопроизводительныхвычислительных систем2015 – 2016 уч. г.Лекторы: доцент Н.Н.Попова,асс. В. А.БахтинЛекция 26 октября 2015 г.Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 21Параллельное программирование длямногопроцессорных систем. MPI.Основные возможности.Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 22ЛитератураMPI: A Message-Passing Interface Standardhttp://www.mpi-forum.org/docs/(http://parallel.ru/docs/Parallel/mpi1.1/mpi-report.html)Антонов А.С. Параллельное программирование с использованиемтехнологии MPI: Учебное пособие. -М.: Изд-во МГУ, 2004.-71 с.Немнюгин С.А., Стесик О.Л. Параллельное программирование длямногопроцессорных вычислительных систем систем.- СПб, БХВПетербургИнтернет ресурсы:https://computing.llnl.gov/tutorials/mpi, www.parallel.ru, intuit.ru,www.mpi-forum.org, www.open-mpi.org, www.openmp.orghttp://www.mcs.anl.gov/research/projects/mpi/www/www3Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 23Модели параллельных программСистемы с общей памятьюПрограммирование, основанное на потокахПрограмма строится на базе последовательной программыВозможно автоматическое распараллеливание компиляторомс использованием соответствующего ключа компилятораДирективы компиляторов (OpenMP, …)Системы с распределенной памятью Программа состоит из параллельных процессов Явное задание коммуникаций между процессами - “MessagePassing” Реализация - Message Passing библиотеки: MPI (“Message Passing Interface”) PVM (“Parallel Virtual Machine”) Shmem, MPT ( Cray)Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 24Пример параллельной программыпрограммы на общей памятиСкалярное произведение двух векторов#include <stdio.h>#define N 1024int main(int argc, char *argv[]){ double sum;double a[N], b[N];int status, i, n =N;for (i=0; i<n; i++){a[i] = i*0.5; b[i] = i* 2.0; }sum =0;#pragma omp for reduction (+:sum)for (i=0; i<n; i++)sum = sum+a[i]*b[i];printf (“Sum=%f\n”, sum);}Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 25MPI#include <stdio.h>#include <mpi.h>#define N 1024int main(int argc, char *argv[]){ double sum; double dot_prod;double a[N], b[N];int i, n =N;int size, myrank;n= n/ size;for (i=myrank*n; i<n; i++){a[i] = i*0.5; b[i] = i* 2.0; }sum =0;for (i=myrank*n; i<n; i++)sum = sum+a[i]*b[i];MPI_Reduce(& sum,& all_sum, 1,MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLMPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, If ( !myrank)&myrank);printf (“Dot product =%f\n”, dot_prod);MPI_Comm_size(MPI_COMM_WORLD, MPI_Finalize();&size);return 0;}Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 26MPIMPI 1.1 Standard разрабатывался 92-94MPI 2.0 - 95-97MPI 2.1 - 2008MPI 3.0 – 2012Стандартыhttp://www.mcs.anl.gov/mpihttp://www.mpi-forum.org/docs/docs.htmlОписание функций http://www-unix.mcs.anl.gov/mpi/www/Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 27Цель MPIОсновная цель:Обеспечение переносимости исходных кодовЭффективная реализацияКроме того:Большая функциональностьПоддержка неоднородных параллельныхархитектурСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 28Реализации MPIMPICHLAM/MPIMvapichOpenMPIКоммерческие реализации Intel,IBM идр.Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 29Модель MPIПараллельная программа состоит из процессов,процессы могут быть многопоточными.MPI реализует передачу сообщений междупроцессами.Межпроцессное взаимодействие предполагает: синхронизацию перемещение данных из адресного пространстваодного процесса в адресное пространство другогопроцесса.Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 210Message passing =передача данных + синхронизацияProcess 0Process 1DataМогу я послать?ДаDataDataDataDataDataDataDataDataTimeТребуется взаимодействие между отправителем иполучателем сообщенийСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 211Модель MPI-программ• SPMD – Single ProgramMultiple Data• Одна и та же программавыполняется различнымипроцессорами• Управляющимиоператорами выбираютсяразличные частипрограммы на каждомпроцессоре.Текст программыКомпиляция:одна программаДля всех процессоровИсполняемый кодProcessor 0Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 2Processor122.12Модель выполненияMPI- программыЗапуск: mpirunПри запуске указываем число требуемых процессоров np иназвание программы: пример:mpirun –np 3 progНа выделенных узлах запускается np копий (процессов) указаннойпрограммы- Например, на двух узлах запущены три копии программы.02Каждый процесс MPI-программы получает два значения:1np – число процессовrank из диапазона [0 … np-1] – номер процессаЛюбые два процесса могут непосредственно обмениватьсяданными с помощью функций передачи сообщенийСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 213 13Основы передачи данных в MPIТехнология передачи данных MPI предполагаеткооперативный обмен.Данные посылаются одним процессом ипринимаются другим.Передача и синхронизация совмещены.Process 0Process 1Send(data)Receive(data)Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 214Основы передачи данных в MPIНеобходимы уточнения процесса передачиProcess 0Process 1Send(data)Receive(data)Требуется уточнить:Как должны быть описаны данные ?Как должны идентифицироваться процессы?Как получатель получит информацию о сообщении?Что значить завершение передачи?Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 215Основные понятияПроцессы объединяются в группы.Каждое сообщение посылается в рамках некоторогоконтекста и должно быть получено в том же контексте.Группа и контекст вместе определяют коммуникатор.Процесс идентифицируется своим номером в группе,ассоциированной с коммуникатором.Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 216Понятие коммуникатора MPIВсе обращения к MPI функциям содержаткоммуникатор, как параметр.Наиболее часто используемый коммуникаторMPI_COMM_WORLD:- определяется при вызове MPI_Initсодержит ВСЕ процессы программыДругие предопределенные коммуникаторы:- MPI_COMM_SELF – только один (собственный)процесс--MPI_COMM_NULL – пустой коммуникаторСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 217Типы данных MPIДанные в сообщении описываются тройкой:(address, count, datatype), гдеdatatype определяется рекурсивно как :предопределенный базовый тип, соответствующий типуданных в базовом языке (например, MPI_INT,MPI_DOUBLE_PRECISION)Непрерывный массив MPI типовВекторный типИндексированыый типПроизвольные структурыMPI включает функции для построенияпользовательских типов данных, например, типаданных, описывающих пары (int, float).Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 218Базовые MPI-типы данных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Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 219Специальные типы MPIMPI_CommMPI_StatusMPI_datatypeСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 220Понятие тэгаСообщение сопровождается определяемымпользователем признаком – целым числом – тэгомдля идентификации принимаемого сообщенияТеги сообщений у отправителя и получателя должныбыть согласованы.
Можно указать в качествезначения тэга константу MPI_ANY_TAG.Некоторые не-MPI системы передачи сообщенийназывают тэг типом сообщения. MPI вводитпонятие тэга, чтобы не путать это понятие с типомданных MPI.Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 221C:MPI helloworld.c#include <stdio.h>#include <mpi.h>int main(int argc, char **argv){MPI_Init(&argc, &argv);printf("Hello, MPI world\n");MPI_Finalize();return 0; }Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 222Формат MPI-функцийC (большие и маленькие буквы различаются):error = MPI_Xxxxx(parameter,...);MPI_Xxxxx(parameter,...);C++ (case sensitive):error = MPI::Xxxxx(parameter,...);MPI::Xxxxx(parameter,...);Имена констант – большими буквами.
Например:MPI_COMM_WORLDСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 223Функции определения среды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)завершает работу программыСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 224Инициализация MPIMPI_Init должна быть первым вызовом,вызывается только один разC:int MPI_Init(int *argc, char ***argv)http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Init.htmlСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 225Обработка ошибок MPI-функцийОпределяется константой MPI_SUCCESSIint error;……error = MPI_Init(&argc, &argv));If (error != MPI_SUCCESS){fprintf (stderr, “ MPI_Init error \n”);return 1;}Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 226MPI_Comm_sizeКоличество процессов в коммуникатореРазмер коммуникатораint MPI_Comm_size(MPI_Comm comm, int*size)Результат – число процессовhttp://www-unix.mcs.anl.gov/mpi/www/www3/MPI_Comm_size.htmlСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 227MPI_Comm_rankномер процесса (process rank)Process ID в коммуникаторе Начинается с 0 до (n-1), где n – числопроцессовИспользуется для определения номера процессаотправителя и получателяint MPI_Comm_rank(MPI_Comm comm, int*rank)Результат – номер процессаСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 228Завершение MPI-процессовНикаких вызовов MPI функций послеC:int MPI_Finalize()int MPI_Abort (MPI_Comm_size(MPI_Comm comm, int*errorcode)Если какой-либо из процессов не выполняетMPI_Finalize, программа зависает.Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 229Hello, MPI world! (2)#include <stdio.h>#include "mpi.h"int main(int argc, char **argv){int rank, size;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &rank);MPI_Comm_size(MPI_COMM_WORLD, &size);printf("Hello, MPI world! I am %d of %d\n“,rank,size);MPI_Finalize();return 0; }Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 230Трансляция MPI-программТрансляцияmpicc –o <имя_программы> <имя>.c <опции>Например:mpicc –o hw helloworld.cЗапуск в интерактивном режимеmpirun –np 128 hwСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 231Трансляция MPI-программ на ВСРегаттаТрансляцияmpicc –o hw helloworld.cПостановка в очередь на выполнениеmpisubmit –n 128 hwmpisubmit -helpСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 232mpisubmit -helpСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 233Пример сессии работы на РегаттеСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 234Результат работы hello_worldСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 235Взаимодействие «точка-точка»Самая простая форма обменасообщениемОдин процесс посылает сообщениядругомуНесколько вариантов реализации того,как пересылка и выполнение программысовмещаютсяСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 236Варианты передачи «точка-точка»Синхронные пересылкиАсинхронные передачиСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 237Функции MPI передачи«точка-точка»Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 238Передача сообщений типа «точкаточка»14communicator52destination30sourceВзаимодействие между двумя процессамиПроцесс-отправитель(Source process) посылает сообщениепроцессу-получателю (Destination process )Процесс-получатель принимает сообщениеПередача сообщения происходит в рамках заданногокоммуникатораПроцесс-получатель определяется рангом в коммуникатореСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 239Завершение“Завершение” передачи означает, что буфер в памяти,занятый для передачи, может быть безопасноиспользован для доступа, т.е. Send: переменная, задействованная в передачесообщения, может быть доступна для дальнейшейработы Receive: переменная, получающая значение врезультате передачи, может быть использованаСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 240MPI (блокирующий) SendОбобщенная форма:MPI_SEND (buf, count, datatype, dest, tag, comm)Буфер сообщения описывается как (start, count, datatype).Процесс получатель (dest) задается номером (rank) в заданномкоммуникаторе (comm) .По завершению функции буфер может быть использован.MPI_Send(buf, count, datatype, dest, tag, comm)Address ofDatatype ofMessage tagsend buffereach itemNumber of itemsRank of destination Communicatorto sendprocessСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 241MPI (блокирующий) ReceiveMPI_RECV(buf, count, datatype, source, tag, comm, status)Ожидает, пока не придет соответствующее сообщение с заданнымиsource и tagsource – номер процессаMPI_ANY_SOURCE.status содержит дополнительную информациюв коммуникаторе comm илиMPI_Recv(buf, count, datatype, src, tag, comm, status)StatusMessage tag after operationAddress ofDatatype ofreceive buffereach itemMaximum numberRank of source Communicatorof items to receiveprocessСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 242MPI_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)Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 2http://www-unix.mcs.anl.gov/mpi/www/www3/MPI_Send.html43MPI_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_Recv(data,500,MPI_FLOAT,6,33,MPI_COMM_WORLD,&stat)Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 244Пример: MPI Send/Receive (1)#include <mpi.h>#include <stdio.h>int main(int argc, char *argv[]){int numtasks, rank, dest, source, rc, tag=1;char inmsg, outmsg='X';MPI_Status Stat;MPI_Init (&argc,&argv);MPI_Comm_size (MPI_COMM_WORLD, &numtasks);MPI_Comm_rank (MPI_COMM_WORLD, &rank);if (rank == 0) {dest = 1;rc = MPI_Send (&outmsg, 1, MPI_CHAR, dest, tag, MPI_COMM_WORLD);printf("Rank0 sent: %c\n", outmsg);source = 1;rc = MPI_Recv (&inmsg, 1, MPI_CHAR, source, tag, MPI_COMM_WORLD,&Stat); }Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 245Пример: MPI Send/Receive (2)else if (rank == 1) {source = 0;rc = MPI_Recv (&inmsg, 1, MPI_CHAR, source, tag, MPI_COMM_WORLD, &Stat);printf("Rank1 received: %c\n", inmsg);dest = 0;rc = MPI_Send (&outmsg, 1, MPI_CHAR, dest, tag, MPI_COMM_WORLD);}MPI_Finalize();}Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 246Wildcarding (джокеры)Получатель может использовать джокердля получения сообщения от ЛЮБОГО процессаMPI_ANY_SOURCEДля получения сообщения с ЛЮБЫМ тэгомMPI_ANY_TAGРеальные номер процесса-отправителя и тэг возвращаютсячерез параметр statusСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 247Информация о завершившемся приемесообщенияВозвращается функцией MPI_Recv через параметрstatusСодержит: Source: status.MPI_SOURCE Tag:status.MPI_TAG Count: MPI_Get_countСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 248Полученное сообщениеМожет быть меньшего размера, чем указано в функцииMPI_Recvcount – число реально полученных элементовC:int MPI_Get_count (MPI_Status *status,MPI_Datatype datatype, int *count)Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 249Примерint recvd_tag, recvd_from, recvd_count;MPI_Status status;MPI_Recv (..., MPI_ANY_SOURCE, MPI_ANY_TAG, ..., &status )recvd_tag = status.MPI_TAG;recvd_from = status.MPI_SOURCE;MPI_Get_count( &status, datatype, &recvd_count );Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 250Условия успешного взаимодействия«точка-точка»Отправитель должен указать правильный rank получателяПолучатель должен указать верный rank отправителяОдинаковый коммуникаторТэги должны соответствовать друг другуБуфер у процесса-получателя должен быть достаточногообъемаСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 251MPI_Probeint MPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status*status)Проверка статуса операции приема сообщения.Параметры аналогичны функции MPI_RecvСпецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 252Пример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);}Спецкурс "Параллельное программированиедля высокопроизводительных систем",Лекция 253.