Библиотека MPI [Электронный ресурс] (90
..pdf
* |
|
|
|
|
|
Созданиеподкоммуникаторов* .Неявноеразбиениегруппы |
|
||||
на*подгру |
|
ппы: |
|
|
|
* |
MPI_Comm_split |
|
|||
* |
|
|
|
|
|
Рекомендация* : |
|
|
|
||
*запуститеэтотпримернесколькоразразнымчислом |
|
|
|||
*ветвейN ( |
|
-npнапримерN:),N = 6,7,8 |
|
||
*/ |
|
|
|
|
|
#include <mpi.h> |
|
|
|||
#include |
<stdio.h> |
|
|
||
#define |
|
tag1 |
1 |
|
|
#define |
|
tag2 |
2 |
/* |
фикатор |
#defineсознательнаяошtag3"":ибкаденти1 |
|||||
равен'tag1' */ |
|
|
|||
#define |
|
ELEMS(x) |
(sizeof( x )/sizeof( x[0] )) |
|
|
int main( int argc, char **argv )
{
MPI_Comm subComm;
int rank, size, subCommIndex, subRank, subSize;
MPI_Init( &argc, &argv );
MPI_Comm_size( MPI_COMM_WORLD, &size );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
/*Распследующемуределяемоправилу:
каждыетри* ветви - вподгруппу, *каждуючетвертую - вникуда" " */
subCommIndex = rank % 4; if( subCommIndex == 3 )
subCommIndex = MPI_UNDEFINED;
Желательнаянумерация/*внутриподгрупп:
обратнаятой,чтоимеетсяв* MPI_COMM_WORLD */
subRank = size - rank;
ВызывоВСЕХ/*ваеметвях |
-абонентахMPI COMM_WORLD, |
указпервымаргументом*нного |
функции |
*/ |
|
MPI_Comm_split( MPI_COMM_WORLD, subCommIndex, |
|
|
rank, &subComm ); |
Каждаяветвьпиш/*,кчеонатеперьмуотносится |
|
*/ |
|
printf("My rank in MPI_COMM_WORLD = %d. ", rank);
41
if( subComm == MPI_COMM_NULL ) printf("I\'m not attached ",
"to any subcommunicator\n");
else { |
&subSize ); |
MPI_Comm_size( subComm, |
|
MPI_Comm_rank( subComm, |
&subRank ); |
printf("My local rank = |
%d, local size = %d\n", |
subRank, subSize |
); |
} |
|
MPI_Comm_free( &subComm ); |
|
MPI_Finalize(); |
|
}
Полезнаянагрузкакоммуникатора: |
трибуты. |
|
Помимохарактеристикобластисвязи,телокоммуникаторасодержитв |
|
|
себенекиедополданныеатрибутыительнМеханизм(). хранения |
|
|
атрибутовназывается |
"caching".Атрибсистемныемогбытьут |
|
пользовательские; |
системных,вчастности,хр |
анятся: |
адресфункции |
-обработчикаошибок; |
|
описаниепользт пологиивательской;
максимальнодопустимыйидентификатордляобщений.
Атрибуцелымидентифицчислами,которыеMPIруютсяназначает |
|
|
автоматически.Некоторыенста |
нтыдляописаниясистемныхатрибутов: |
|
MPI_TAG_UB, MPI_HOST, MPI_IO, MPI_WTIME_IS_GLOBAL.Кэтим |
||
атрибутампрограмобращаетсяредко,имихнстможетять;длятаких |
|
|
частоиспользуемыхатри,какобрабутовошибокилитчикписание |
|
|
топологии,существуют |
персональныенаборыфу, апримеркций, |
|
MPI_Errhandler_xxx. |
|
|
Атрибуты -удобноеместохранениясовместноиспользуемой |
|
|
информациз;помещеватродвенбутнаяой,такаявейинформация |
|
|
стандоступнойвсемитсяспользующимкоммуникаторветвямбез |
|
|
пересылкисоо бщенийвернее(,наMPP |
-машине,кпримеру,сообщения |
|
будут,нонасистемнуровне,..скрытыеотглазпрограмм |
|
иста). |
Пользовательскиеатрибсоздаютсяуничтожаютсятыфункциями |
|
|
MPI_Keyval_createи |
MPI_Keyval_free;модифицируютсяфункциями |
|
MPI_Attr_put, MPI_Attr_getи MPI_Attr_delete.Присозданиикоммуникатора |
||
набазесуществующегоатрибутыизпоследнеготемилиинымобразом |
|
|
копируютилинетвзавиотфункцисимостиякопированияпа |
|
|
MPI_Copy_function,адрескоторойявляетсяпараметромфункциисоз |
дания |
|
атрибута. |
|
|
Тожеидляудатрибутленияприуничтожек вмму: ниикатора |
MPI_Delete_function,указываемой |
|
задаетсяпользовательскойфункциейтипа |
|
|
присозданииатрибута. |
|
|
|
42 |
|
Корректудаленотслужившихописателейое.
int MPI_Comm_Free( MPI_Comm comm); |
|
||
Параметр: |
comm -идентификатгрупвыходной( пар р |
аметр) |
|
Уничтожаетгруппу,ассоциированнуюидентификатором |
comm, |
||
котпвозвращениярыйслеустанавливается |
MPI_COMM_NULL. |
||
Здесьимеютсяввидувсетипысистемныхданных,длякоторых |
|
||
предусмотренафун |
кция MPI_Xxx_free и(константа MPI_XXX_NULL)В.MPI - |
||
Iихсесм(. ь |
mpi.h ): |
|
|
коммуникаторы;
группы;
типыданных;
распределенныеоперации;
квитанции(request's);
атрибутыкоммуникаторов;
обработчикиошибок(errhandler's).
Дальшевсеописываетсянапр |
|
имерекоммуигрупп,никаторов |
|
изложеннаясхемаявляетсяобщейдлвсехтиповр |
|
|
есурсов. |
Неиграетроли,вкакомпорядкеуничтожатьвзаимосвязанные |
|
||
описатели.Главное |
-незабвыфункциюзватьудаленияресурса |
|
|
MPI_Xxx_freeвовсе.Соотвресурстствующий |
небуднемедленноетален, |
||
онпрекратитсуществованиетолькоеслибудутвыполненыдва |
|
словия: |
|
программепользователяникогданепредоставлялисьссылкинаресурс, |
овами MPI_Xxx_free ; |
||
иливсепользовательскиессылкиочищенывыз |
|
||
ресурсперестаети пользо |
|
ватьсядругимиресуртоMPI,естьами |
|
удаляютсяв исте |
|
мныессылки. |
|
Взаимосвязанныописателиописателяявляютсякомимуникатора |
|
||
группыкомму( ссылаетсянгрупикатор);илиписателитипову,если |
|
|
|
одинсозданнабазедругогопорожденный( ссылае |
|
|
тсян аисходный). |
Пример5
MPI_Comm subComm; MPI_Group subGroup; int rank;
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Comm_split( MPI_COMM_WORLD, rank / 3, |
|
|
|
rank % 3, &subComm ); |
|
/*ТеперьсозданкоммуникаторsubComm,автоматически |
|
|
соз* |
данагруппа,накоторуюраспрегостраняетсябласть |
|
* действия. |
- subComm. |
|
На*коммуникатпрограммызаведенассылкиз |
||
На*группузаведенасистемнаяссылкаизкоммуникатора. |
|
|
|
43 |
|
*/ |
|
|
|
MPI_Comm_group( subComm, &subGroup ); |
- системная |
||
Теперь/*нагруппуимеетсядв |
ессылки |
||
изкоммуникатора* ,пользовательскаяsu |
|
bGroup. |
|
*/ |
|
|
|
MPI_Group_free( &subGroup ); |
|
|
|
Пользов/* ссылкангртельскаяуничтоженаппу, |
|
|
|
*сброшенsubGroupв MPI GROUP_NULL. |
|
|
|
Собственноописание* группыизсистемныхданных |
|
|
|
неу* |
дале,таккакнаоегоссылаетсящекоммуникатор. |
|
|
*/ |
|
|
|
MPI_Comm_free( &subComm );
Удалена/*пользовссылканкоммуникатортельская,
*subCommсброшенв MPIТаккакCOMMдругихссылокNULL. накоммуникатор* ,еописгоуд излясисетсяемных
*данных.
Вместе*коммуникаторомудаленасистемнаяссылка нагруппу*.Таккакдругихссылокнагруппунет, ееопис* удаизнлясиседанныхт.сяемных
*/
Ещеразотмет,чтодляMPIнеиграетмроли,вкакомпорябудутке |
|
|
|||
вызванызавершающ |
|
иевызовы MPI_Xxx_free,этоделопр |
ограммы. |
||
Непытайтесьуничтконстописателижвродентныеть |
|
|
|||
MPI_COMM_WORLDили MPI_CHAR:ихсозданиеуничтожение |
-дело |
||||
самогоMPI. |
|
|
|
|
|
Взаключениеобсунекодиметали, связорыенапрямуюнныес |
|
|
|||
организациеймежпроце |
|
ссорныхвзаим |
одействий. |
|
|
Обработчикиошибок |
.Поумолчанию,еслипривыполненфункции |
|
|||
MPIобнаруженаошибка,выполнениевс приложенияхтвейзавершается. |
|
|
|||
Этосделановрасчетенапрограммиста,непривыкшегопроверятькоды |
|
|
|||
завершения( |
malloc,open,write,...и;),пытающеграспространитьтак сяй |
|
|||
стильнаMPIПриаварийном.завершепотакомусценариюконсольии |
|
|
|||
выдаочскуднаяеньинформациятся:влучшемслучае,тамбудетназвание |
|
|
|||
функцииназваниеMPIоши.Обработчикошибоккиявляется |
|
|
|||
принадлежностьюк |
оммуникатора,дляуправленияобработчикамислужат |
|
|||
функциисемейства |
|
MPI_Errhandler_xxx (http://www.csa.ru). |
|||
Многопоточность.СамMPIнеявноиспользуетмногопоточностьочень |
|
||||
шине, рокомешаетпрограммистуделатьтожесамое.Однако:разные |
обязательно разныеномразные, |
||||
задачиимеют |
|
сточкизренияMPI |
|||
потоки( |
threads)внутриоднойза неголяачичемтличаются. |
|
|||
Программсамидентсообщенийфикаторамисткоммуникаторамидолжен |
|
|
|||
устанавливатьтакуюдисциплинудляпот,чтобыодинковпотокнест |
|
ал, |
|||
|
|
|
|
44 |
|
допустим,вызывая |
|
MPI_Recv,джокерперехватыватьсообщениям,которые |
|
долженприобрабаниматьдругпотоктойжеыватьзадачи.Другим |
|
||
истошибокчникомможетбытьиспользованиеразнымипотоками |
|
||
коллективныхфун |
|
кцийнадо итемнимжекоммуникатором: |
используйте |
MPI_Comm_dup. |
|
|
|
Работасфайлами |
.В MPI -2средстваперен сботыправления |
|
|
файламипоявились, MPI |
|
-1ихнет.Всевызовыфункцийнапрямую |
|
передаютсяоперационнойсистеме( |
Unix/Parix/NFS/...)натоймаш,илнаине |
||
томпр оцессорномузлеMPP |
-компьютера,гденаходитсявызывающаяветвь. |
|
|
Теоретическивозмподключенияжностьсредрасшитвуправленияенного |
|
||
вводом/выводомMPI |
|
-1есть -каждыйкоммуникаторхранатрибутс |
|
числовымкодом |
MPI_IO -этон ветвимер,котоперенаправляетсяую |
|
|
в/выводот |
всехостальныхветвейкомму;самMPIниснимчегокатре |
|
|
неделаетиникакнеиспо.ДлMPIсущяьзуряддополнительныхствует |
|
||
библитакрокак, дготекконкретныхляплатф,такисв рмбодно |
|
||
распрострамногоплатформенные, явиделяемыени |
дной. |
||
Рабсконсольютаотдкжеоткупасиет;сэможетяеме |
|
||
приводитькперемешиваниювыводанесколькихзадач,поэтому |
|
||
рекомендуетсявесьвыводнаэкранпроизвл какойб дить |
-тоодной |
||
задачину( ?),либоевойначалефункцииmain()нап |
исать: |
|
|
setvbuf( stdout, NULL, _IOLBF, BUFSIZ ); |
|
||
setvbuf( stderr, NULL, _IOLBF, BUFSIZ ); |
|
||
Инезабудьтенаписать"#includeвначалепрогра<stdio.h>" |
ммы. |
||
45
