Библиотека MPI [Электронный ресурс] (90
..pdfМИНРОБРНАУКИССИИ
ФЕДЕРАЛЬНОЕГОСУДАРСТВЕННОЕБЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОУЧРЕЖДЕНИЕВЫСШЕГО
ПРОФЕССИОНАЛЬНОГООБРАЗОВАНИЯ
«САМАРСКИЙГОСУДАРСТВЕННЫЙАЭРОКОСМИЧЕСКИЙ УНИВЕРСИМЕНАКАДЕМИКАС.П.КОРОЛЕВАТЕТ
(НАЦИССЛЕДООНАЛЬНЫЙУНИВЕРСИТЕТ)»АТЕЛЬСКИЙ
С. Б. Попов
Библиотека MPI
Учебноепособие
Самара
2011
Автор: ПОПОВСергейБорисович
Учебноепосодизложениебиержатлекционногоматтериаламы |
|
|
"Библиотека MPI" покурсу« |
Параллельноепрограммирование |
» и |
предназначенодля бакалавров |
четвертогокурсафакультетаинформатики |
|
направления 010400.62 «Прикладнаяматематикаинформатика |
». |
2
СОДЕРЖАНИЕ
КраткаяхарактербиблMPIиостиекиа |
4 |
MPIдляязыкаFORTRAN |
8 |
ОбщиепроцедурыMPI |
9 |
Органприема/передачизацияданныхмежот процессамиельнымиу |
13 |
Коллективныефункции |
30 |
Коммуникаторы,группыобластисвязи |
36 |
3
Краткаяхарактери |
|
стикабиблиотекиMPI |
|
|
||
|
MPI (message passing interface) -библиотекафункций,предназначенная |
|
||||
дляподдержкиработыпараллельныхпроцессовтерминахпередачи |
|
|
||||
сообщений. |
|
|
|
|
||
|
MPIпредоставляетпрограммистуединыймеханизмвзаимодействия |
|
|
|||
процессоввнутрипараллельн |
|
огоприложениянезависотмаш монной |
|
|||
архитектумногопроцессорныеоднопроце( или общейсорныеили |
|
|
||||
локальнойпамятью),взаимнраспветвейонагол(одномпроцессорежения |
|
|
||||
илинара |
|
зных)и API ( |
applications programmers interface,т.е.интерфейс |
|
||
разработчикаприложен)операцсистемы.Программаонной, |
|
|
||||
испоMPI,легчеьзующаяотлаживаесужается( просдлясовершениясяор |
|
|
||||
стереотошибокприпараллельномпныхпрограммировании)быстрее |
|
|
||||
переноснадругиеплав(идеалетформыся,простойпер |
|
екомпиляцией). |
|
|||
|
МинимальновсоставвходятMPI:библиотекапрограммирования |
|
|
|||
(заголовочныеибиблиотечныефайлыдляязС,С++ковFORTRAN) |
|
|
||||
загрузчикприл.Доженийполнительновключаются:профилирующий |
|
|
||||
варбиблиотекиантиспользуется( настадиитестипарованияаллельного |
|
|
||||
приложениядляопределенияоптимальностираспараллел);загрузчиванияк |
X-Windowипроч. |
|
||||
сграфичсетевыминтерфеским |
|
йсомдля |
bin, |
|||
|
СтруктуракаталогпривычнаMPIользователям |
-программистам: |
||||
include, |
lib, man, |
src, |
...Минаборимальныйфункцийпроств |
освоении |
||
позволяетбыстронаписнадежноботающуютьпрограмму.Использование |
|
|
||||
жевсегоарсеналафункцийMPIпозволитполучитьбыстроработающую |
|
|
||||
программуприсохранениинаде |
|
жности. |
|
|
||
|
Несколькокомпьюмогутвзаимодействоватьеровдругдругомодним |
|
|
|||
изтр |
ехсп |
особов: |
|
Unixсуществуютсредствадляработыней |
|
|
1. черезобщуюпамять,в |
|
|
||||
|
(разныедля |
BSD-и ATT-клонов Unix); |
|
|
||
2. черезскоросвнутсетьримашиннуюмногопроцессорных |
|
|
||||
|
вычислительныхси |
стем; |
TCP/IP. |
|
||
3. |
черезсеть,какправило,работающуюпротоколу |
|
||||
|
|
ПрограммныйинструментMPIразрабкакстандартдлярийтывался |
|
|
||
многопроцессвнутримашиннойВС,объединенскор снысетьюной, х |
|
|
||||
ноMPIможетработтакженалюбоготьзеизтрехспсоединенийсобов. |
|
|
||||
Темменее,перваядакцияMPIстанстевартомла |
|
силедующего |
|
|||
ограничения:всепроцессы,сообщающиесямеждусобойпосредством |
|
|
||||
функцMPI,начинзакйаснчиваютоеыполнениеодновременно.Это |
|
|
||||
|
|
|
|
4 |
|
|
немешаетиспользовапараллельныхMPIкакдляеетприл,ножений |
|
|
|
системымассовогообслуживанияклие( |
|
нт-серверныеприложенияпроч.) |
|
приходитсяразрабатыватьнабазестарогоинструмент |
ария. |
|
|
ПроблемаустраненавMPI |
|
-2:онгарантировстанетстандартомдля но |
|
систем,взаимодействующихпотипуНе2исключено. ,чтосистемы13 |
|
|
|
типовсовремепотеряютинем |
|
ересдляпрограммистовбудут |
|
использоватьсятолькокакинтерфейсмеждуаппарат |
|
уройиMPI |
-2. |
Существуетточказре,чтонизкоуровневыеяпересылкичерез |
|
|
|
разделяемуюпамятьисемафорыпредпримененияочтительнеетаких |
|
|
|
библи,какMPI,почтотомуработаек |
|
ютбыс.Наэтможнореепривести |
|
следующиевозраж |
ения: |
|
|
1.Вхораспаошораллелилнасобственножвзаиноммодействие
междуветвямипересылки( данныхсинхрон)тратизациются |
|
|
небольшаядолявремени |
–несколькопр общцентоввр гомени |
|
работы.Таки |
образом,замедлениепересылок,нап,вдваимер,неза |
|
означаетобщегопаденпроизводительностиявдвое |
–онапонизитсяа |
|
несколькопроцент.Зачапонижениестуюкпроизводительности |
|
|
являетсяприемлемымлихвойоправдываетсяпрочими |
|
|
соображениями. |
|
2.MPI –этоизначальнобыстрыйинструмент.Дляповышенияскорости
немиспользуютсяприемы,которыхприкладныепрограммисты |
|
зачастуюпростонезадумываются.Н |
апример: |
встроеннаябуферпозволяизбежазациязадприотржектправкеь данных –управление впередающуюветвьвозвращается
немедл,дажеслив твьнно |
-получательещенеподготов |
иласьк |
приему; |
multi-threading),выносябольшую |
|
MPIиспользуетмногопоточность( |
||
частьсвоейрабпотыоки |
(threads)снизкпри;оритетом |
|
буферизациямногопоточност |
ьсводяткминегативноеимуму |
|
влияниенеизбежныхпростоприпернасылкахв |
|
|
производительностьприкладнойпрогра |
ммы; |
|
напередачуданныхтипаодин" |
-всем"затрачиваетсявремя, |
|
пропорционнечислуучаствующветвей,логарльноеэтогоихфму |
|
|
числа. |
|
|
3.Переноспрогнадрплаугиеаммнтформыребупереиписываният повотладНезамениморной. качествдляпрограммы,к торойе предстопользоватьсяшикругурокомулюдей.Следуетучитотывать обстоят,чтоужпоявляютсяельствомашины,накоторыхизсредств межпрогрвзаиместьмтольконогодействияMPI.
4.MPIнестрахуетниотоднойизтиповыхошибок,допускаемыхпри параллельномпрограммировании, использованбиблиотекиэтой уменьшаетихвероят.Функциирабосразделяемойостпамятьюыис семафорамислишк омэлементапримитивны, .Ве безоятность ошибкиреалсихпомощзоватьнужноепрограммедействиею
5
стреумительноеньшаетсростомколичестваин ;трукцийя |
|
|
|
||
вероятностьнайтиош |
бкупуотладкиемблизканулю,потомучто |
|
|||
отладочноесредствовноситзадер |
жкуввыполноднвеитемвейхние |
|
|||
самымпозволяетноработамальнодругимвеперестают( ьви |
|
|
|
||
конкурзасовместноиспользуемыеровдать |
|
нные). |
|
||
Документация |
|
|
|
|
|
Полезнораспечататьдлясправочныхцелейзаголовочныефайлы |
|
|
mpi.h,в |
||
библиотекиизподкаталога |
|
include.В Convex MPIтакфайлодин: |
|||
WinMPICHихтри: |
mpi.h описания( константтипов), |
|
mpi_errno.h коды( |
||
ошибокихоп) сания |
|
binding.h прототипы( функций)В.случаедля |
|
||
Windowsпечататьрекомендуетсянеоригиналы,копии,изкоторых |
|
|
|
||
вычищенывсед та |
|
ли,относящиесякреализациинапример,( |
|
|
|
_declspec(dllimport)ит.д.)Далеепо. текстунеприводятсяпрототипы |
|
||||
функций,описанпеременных,типовкоя |
|
|
нстант. |
|
|
Manual pages –ещеоднохорподспорье.шееБолеетальную |
|
|
|||
информац:спецификац,учебникрю ию |
|
|
азличныереализацииMPIможно |
|
|
найтисервере |
NetLib (http://www.netlib.org/mpi)Здесь. следуетособо |
|
|||
отметитькнигу |
MPI: |
The complete |
referenceиздательства |
MIT Press, |
|
имеющуюсянаэтомса |
йте. |
|
|
|
|
Соглашениятерминах |
|
|
|
|
|
Параллельноеприложениесостоитизнес |
|
|
кольких процессовветвей(, |
||
потоков, задач) |
,выполдняющихся.овреРазныпроцессымогутнно |
|
|
|
|
выполнятьсякакнаразныхпроцессорах,такинаодномитомже |
|
|
|
–для |
|
программыэтонеиграетли,посковобоихлмеханизмучаяхькуобмена |
|
|
номерпроцесса |
|
|
даннымиодинаков.С |
|
аждымпотокомсвязывается |
-целое |
||
неотрчи,являющеесяцательноеуникальныматрибутомпроце |
|
|
|
сса. |
|
Пробменивцесдругсдругомыданнымивютсявиде |
|
|
|
сообщений. |
|
Атрибутамисообщения |
|
являютсяномерпроцесса |
|
-отправителя,номер |
|
процесса-получателяиидентификаторсообщения.Длянихзаведена |
|
|
|
||
структура MPI_Status,содетриполя:жащая |
|
MPI_Source номер(процесса |
|||
отправителя), |
MPI_Tag идентификатор( сообщения), |
MPI_Error код( |
|||
оши);могутбытькидополнительныеполя. |
|
|
|
|
|
Идентификаторсообщения(msgt |
|
ag) -атрибутсообщения,являющийся |
|
||
целымнеотрчи,лежащимсломцательнымвдиапазонеотдо032767. |
|
|
|
|
|
Идентификаторыпозволяютпрограммебиблиотекесвязиотличать |
|
|
|
|
|
сообщениядруготдруга. |
|
|
|
|
|
Длясовместногопроведениятехилииныхрасчетовпроцессывнутри |
|
|
|
||
приложениябъединяютсяв |
группы. |
Группымогутбытьвложенными. |
|
||
Внутригруппывсепроцессыпронумер.Каждыйпроцессузнатьваныжет |
|
|
|
|
|
убиблиотекисвязиномервнутрийгруппызависиотномераости |
|
|
|
||
выполнитьсоответствующуючастьрасчетов.Скаждойгру |
|
|
|
ппой |
|
ассоциировансвой |
коммуникатор.Поэтомуприосущпересылкиствлени |
|
|||
|
|
|
6 |
|
|
необходимоуказатьидентификаткоторойгруппы,внутрипроизводится |
|
|
|
|||
этапере.Впроцессыеылкасодевгрсуппепредопределеннымжатся |
|
|
|
|||
идентификатором MPI_COMM_WORLD. |
|
|
||||
Термин" |
процесс"используетсятакжев |
Unix,издесьнетпутаницы:в |
||||
MPIпроцессзапусирабкаоетсябычныйктаетпроцесс |
|
|
|
Unix,связанный |
||
черезMPIсостальнымипроцессами,входящприложение.Востальномми |
|
|
|
|
||
процслсчедуетссыизолитатьдруготдругаованными:них |
|
Unix-процессов). |
разные |
|||
областикода,стекаданныхсм(.описание |
|
|
|
|||
Категориифункц:блокирующие,локальныей,колле |
|
|
|
ктивные |
||
Блокирующие –останавлблок( )выипроцессаруваолнениеютдо |
|
|
||||
техпор,покапроиоперацимизводимаянебудетвыполнена. |
|
|
|
|
||
Неблокирующиефункциивозвращаютуправлнем, едленноние |
|
|
|
|||
выполнениеопер |
ациипродолжаетсявфоновомрежи;завершением |
|
|
|||
операциинадопр |
|
оследитьособо.Неблокируюфункциивозвращиеают |
request),спомощью |
|||
идентификаторопер |
ациипосылки -приемасообщения( |
|||||
которогопозднеемо |
жнопроверитьзавершениеоперации.Доэтого |
|
|
|||
завершспеременнмассивамииния,котобылрыегументами |
|
|
|
|
||
неблокирующейфу, ичегокцииделатьнел |
|
|
ьзя. |
|
|
|
Локальные –неинициируютпересылокданныхмеждуве. вями |
|
|
|
|||
Большинствоинформационныхфункц |
|
ийявляеокальными,т..копиися |
|
|||
системныхданныхужехранятсявкаждойветви.Функцияпередачи |
|
|
|
|
||
MPI_Sendифункциясинхронизации |
MPI_Barrierнеявляютсяокальными, |
|||||
посколькупроизводятпересылСледует. заметить,что,кпримеру,функция |
|
|
|
|
||
приема MPI_Recv парная( для |
MPI_Send)являетсяокальн:онавсеглишьой |
|
||||
пассивнождетпоступлда,ничегонпытаясьыхнияобщитьдругим |
|
|
|
|
||
ветвям. |
|
|
|
|
|
|
Коллективные –должныбытьвызвсемианыетвями |
|
|
-абонентамитого |
|||
коммуникатоедается,котоперимыйвкачествергумент |
|
|
|
а.Несоблюдение |
||
этогоправошибкамводитланастадиивыпрограолнения |
|
|
|
ммы. |
||
ПривMPIнотаязаписиция |
|
|
|
|
|
|
Регистрбукв:важС,ниграетнроливFO |
|
|
|
RTRAN. |
|
|
Всеидентификаторыначинаютсяпрефикса |
|
|
MPI_.Этоправилобез |
|||
исключений.Нерекомендуетсяза |
|
водитьпользоваиден,тельсификаторыие |
MPID_, MPIR_и |
|||
начинающиесяэтойприставки,такжеприставок |
|
|
|
|||
PMPI_,которыеисповльзуютсяужебныхц |
|
елях. |
|
|||
Еслиидентификатсконструиизнескслова, рнемьких, ан |
|
: MPI_Get_count, MPI_Comm_rank. |
||||
какправило,разделяютсяподчерками |
|
|
||||
Иногразндиспользуетсяалитель: |
|
|
MPI_Sendrecv, MPI_Alltoall. |
|||
Порядоксловсоставидентификаторевыбиомпо инципуаетсяот" |
MPI_,потомназваниекатегории( |
Type, |
||||
общегокчастному":сначалапрефикс |
|
|
||||
Comm, Group, Attr, Errhandlerит.д.),потомназваниеоперации( |
|
|||||
MPI_Errhandler_create, |
MPI_Errhandler_set, |
Наиболеечасто...). |
|
|||
|
|
|
|
7 |
|
|
употребляемыефункциивыпадаютизэтойсхемы:ониимеютанти" |
|
- |
|
методичес",нокоротстереотипныекиеназвания,например |
MPI_Barrier, |
||
или MPI_Unpack. |
|
|
|
Имеконинеизменяемыхстант( пользоватпеременных) лем |
MPI_COMM_WORLD, |
||
записываютсяполностьюзаглавныбуквами: и |
|
||
MPI_FLOAT.Вименахфункцийперваязапрефиксомбуква |
-заглавная, |
||
остальныем |
аленькие: |
MPI_Send, MPI_Comm_size. |
|
MPIдляязыкаFORT |
RAN |
||
Изложимвсжатомвидеосновныеотличияособреализациинности |
|
||
MPIдляязыкаFORTRANСихучетпро,граммистыпишущие.наязыке |
|
||
FORTRAN,смогутпристкизудальнейшегочениюпитьматериала. |
|
||
РегсимволовстрисходномтекстедляFORTRANзначенияне |
меет. |
||
MPI_Comm_rankи MPI_COMM_RANKдлянего,вотличиеС,является |
|||
однитемжеимдентификат |
|
ором. |
Вначалеисхотекстадолжнаногобытьстрока include 'mpif.h'
Этотфайлсодержитописанияпеременныхконстант.
Все,чтовСявляетсяфункциями, F ORTRANсделаноподпрограммами. ВСкошибкидMPI возвращаетсяпользовательскойпрограммекаккод завершенфункц; FORTRANкиоияшибкидвозвращается
дополнительномпараметре:
С:
errcode = MPI_Comm_rank( MPI_COMM_WORLD, &rank );
FORTRAN:
CALL MPI_COMM_RANK ( MPI_COMM_WORLD, rank, ierror )
ВсепараметвFORTRANпернеыедаютсяпозначению,поссылке. |
|
|
Соо,твет,амгдеСиственнопользуетсясим"&"дляычисления |
|
|
адресапереме,в FORTRANненадонойписатьничего.Это |
|
rank |
иллюстрипримедля рует |
редыдущегопункта,гдевпеременную |
|
функция/подпрограммазаписномервываетзвавшеезад.Т,гдчимей |
|
|
MPIтребузнатьместонахождениетсявпамятитакихданных,которые |
|
|
поссылкенепернадашьп,( конструированииимер |
|
MPI_ADDRESS. |
пользовательскихтипов),ис |
пользуетсяподпрограмма |
ВFORTRANнетструктур.Там,гдевСдляописаданвMPIнияых применяетсяструкту,в FORTRANприменяетацелочисленныйя массив,размерномячкоторогоераекописанысимвольными константами.
ВСпишем:
MPI_Status status;переменнаятипаструктура/*/
8
MPI_Probe( MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status );
/*тепроверяемерьполязаполненнойструктуры*/ |
== 1 ) |
{ ... } |
|
if( |
status.MPI_SOURCE |
||
if( |
status.MPI_TAG == |
tagMsg1 ) |
{ ... } |
ВFORTRAN ,соответственно:
INTEGER status(MPI_STATUS_SIZE) CALL MPI_PROBE( MPI_ANY_SOURCE,
MPI_ANY_TAG, MPI_COMM_WORLD, status )
IF( status(MPI_SOURCE) .EQ. 1 ) ....
IF( status(MPI_TAG) .EQ. tagMsg1 ) ...
итакдалее... |
|
|
|
|
Имятипа |
-структурыпереходитвразме |
|
рмассива,дополняясь |
|
суффиксом _SIZE,аименаполейпереходятвиндексыячееквэтом |
|
|||
целочисленноммассиве. |
|
mpiccиспользуются |
||
Длякомпиляциикомпоновкивместокоманды |
|
|||
команды |
mpif77или |
mpif90дляFORTRAN77и FORTRAN90 |
||
соответственно.Этоскриптыком( |
|
андныефайлы),котпорыесле |
||
соответствующейнастройкиокруженияпут(библиотекам.п.) |
|
|||
вызываютстандартныекомпиляторыFO |
RTRAN. |
|||
ОбщиепроцедурыMPI |
|
|
|
|
Сущнесколькофункцийтвует,которыеиспользуютсявлюбом,даже |
|
|
||
самомкороткомприложенииMPIЗани. |
|
маютонстолькоеисобственноя |
||
передачданных,сколькообеспечй |
|
ением. |
|
|
MPI_Init -инициализацияпараллельнойчастиприложе.Реальнияа |
|
|||
инициализациядлякаждогоприлвыполняжбеодногониялер,аезатся |
|
|
||
еслиMPIужебылинициализирован,тоникак |
|
иедействвыполняютсяне и |
||
происхнемедленныйвозвратдитизподпрограммы.ВсеоставшиесяMPI |
|
- |
||
процедурымогутбытьвызваныолькопослевызова |
|
|
MPI_Init. |
|
int MPI_Init( int* argc, char*** argv); |
||||
Функциипередаюадреаргументов,с сяандартнополучаемых |
|
|
||
программойотоперациосистемыхрапараметрынкоманднойящих |
|
|
||
строки.ВконецкоманднойстрокипрограммыMPI |
|
-загрузчикmpirun |
||
добавляетрядинформпар,коационныхметровребуютсяорые |
|
MPI_Init. |
||
Этоп каз ываетсяпримере3.1. |
|
|
- MPI_SUCCESS,иначе - |
|
Возвращает:случаеусп |
|
ешноговыполнения |
||
кошибкид.Тожесамое( возивсеращаютостальныефункции, |
|
|
||
рассмвдатриваемые |
нномпособии.) |
|
||
|
|
|
9 |
|
MPI_Finalize -завершениепараллельнойчастиприложения.Все |
|
MPI_Init, |
|||
последуобращенияк юMPIбымщие |
|
-процедурам,втомчисле |
к |
||
запрещвызова.Кмоменту |
MPI_Finalizeнекоторымпроцвс ссом |
|
|||
действия,требующобменеегоучастсообщениямия,должныбыть |
|
|
|
|
|
завершены. |
|
|
|
|
|
int MPI_Finalize( void ); |
|
|
|
||
MPI_Abort –аварийноезакрытбибл.Вызываетсяиотеки,если |
|
|
|
||
пользовательскаяпрограммазавершпопричошвремениетсянебок |
|
|
|
||
выполне,связаMPI:нныхия |
|
|
|
|
|
void MPI_Abort(MPI_Comm comm, int error ); |
|
|
|||
ВызовMPIизлюбойзадачиAbortпринудительнозавершаетработу |
comm.Еслиуказанописате |
|
|||
всехзадач,подскобластиединенныхсвязи |
|
ль |
|||
MPI_COMM_WORLD,будетзавершеновсеприложениевсе(егозадачи) |
|
|
|
||
целиком,что,п |
-видимому,являетсянаиболееправильреше. нымием |
|
|
|
|
Испкользуйтешибкид |
MPI_ERR_OTHER,еслинезнаете,как |
|
|
||
охарактеризоватьошибкуклассификацииMPI. |
|
|
|
|
|
Двеследующиеинф |
ормационныхфункции:сообщаютразмергруппы |
|
|
||
(тоестьобщееколичествозадач,подсообластидиненныхсвязи) |
|
|
|
|
|
порядковыйномервызывающейзад |
ачи: |
|
|
|
|
int MPI_Comm_size( MPI_Comm comm, int* size); |
|
comm. |
|||
Определениеобщегочислапараллельныхпроцессовгруппе |
|
|
|
||
Параметры: |
comm -идентификаторгруппы; |
size -размергруппывыходной( |
|
||
параметр). |
|
|
|
|
|
int MPI_Comm_rank( MPI_comm comm, int* rank); |
|
|
|||
Определениеномерапроцессавгруппе |
|
comm.Значение,возвращаемое |
|
||
поадресу |
&rank,лежитвдиапазонеотдо0 |
size_of_group-1.Параметры: |
|||
comm –идентификаторгруппы; |
rank –номервызывающегопроцесса |
|
|
||
группе comm выходной( пар |
аметр). |
|
|
|
|
double MPI_Wtime(void) |
|
|
|
||
Функциявозвращаастроновсекундахемтвещественноея(ическое |
|
|
|
||
число),прошедшеенекотомомв ро.Гарнташломго |
|
|
антируется,что |
||
этотмоментнебудетизменензавремясуществованияпроцесса. |
MPI_Init, |
MPI_Finalize, |
MPI_Comm_size, |
||
Использование |
|||||
MPI_Comm_rankи MPI_Abortпокда,впрлеезано |
имере1. |
|
|
Пример1
/*
Простейшаяприемопередача* :
*MPI_Send, MPI_Recv
Завершениепо* ошибке:
*MPI_Abort
*/
#include <mpi.h> #include <stdio.h>
10