Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Библиотека MPI [Электронный ресурс] (90

..pdf
Скачиваний:
8
Добавлен:
15.11.2022
Размер:
546.43 Кб
Скачать

*

 

 

 

 

 

Созданиеподкоммуникаторов* .Неявноеразбиениегруппы

 

на*подгру

 

ппы:

 

 

*

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]