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