// Листинг 9.1. Использование функции MPI_Comm_rank() //.. .
int Tag = 33;
int WorldSize;
int TaskRank;
MPI_Status Status;
MPI_Init (&argc, &argv) ;
MPI_Comm_rank(MPI_COMM_WORLD, &TaskRank) ; MPI_Comm_size(MPI_COMM_WORLD, &WorldSize) ; //.. .
Коммуникатору MPI_COMM_WORLDпо умолчанию при запуске назначаются все MPI-задачи. MPI-задачи группируются по коммуникаторам, которые определяют группу коммуникации. В листинге 9.1 ранг возвращается в переменной TaskRank.Каждый процесс должен иметь уникальный ранг. После определения ранга задаче передаются соответствующие данные либо определяется код, который ей надлежит выполнить. Рассмотрим следующие варианты.
Вариант 1. Простая MPMD-модель Вариант 2. Простая SIMD-модель
if(TaskRank == 1){ if(TaskRank == 1){
// Некоторые действия. // Используем одни данные.
} }
if (TaskRank == 2){ if(TaskRank == 2){
// Другие действия. // Используем другие данные.
} }
В первом варианте ранг используется для разграничения между процессами выполняемой работы, а во втором — для разграничения данных, которые они должны обрабатывать. Несмотря на то что каждый выполняемый MPI-файл стартует с одним и тем же кодом, модель MPMD (MIMD) можно реализовать с помощью рангов и соответствующего ветвления программы. Аналогично после определения ранга данным процесса можно назначить некоторый тип, тем самым определив конкрет-ные данные, с которыми должен работать конкретный процесс. Ранг также используется при передаче сообщений. MPI-задачи идентифицируют одна другую при обмене сообщениями по рангам и ко мм уникатора м. Функции MPI_Send () | MPI_Recv()используют ранг в качестве указания пунктов назначения и отправления соответственно. При выполнении вызова
MPI_Send(Buffer,Count, MPI_LONG, TaskRank, Tag,Comm) ;
будет отправлено Countзначений типа longMPI-процессу с рангом, равным значению TaskRank.Параметр Bufferпредставляет собой указатель на данные, посылаемые процессу TaskRank.Параметр Countхарактеризует количество элементов в буфере Buffer,а не его раз м ер. Каждое сообщение имеет тег. Этот тег позволяет отличить одно сообщение от другого, сгруппировать сообщения в классы, связать определенные сообщения с определенными коммуникаторами и пр. Тег имеет тип int, а его значение определяется пользователем. Параметр Comm представляет коммуникатор, которому назначается процесс. Если ранг и коммуникатор задачи известны, этой задаче можно посылать сообщения. При выполнении вызова
MPI_Recv(Buffer, Count, MPI_INT, TaskRank, Tag, Comm, &Status);
будет получено Countзначений типа intот процесса с рангом TaskRank.Инициатор вызова будет заблокирован до тех пор, пока не получит сообщение от процесса с рангом TaskRankи соответствующим значением тега (Tag).MPI-интерфейс для параметров ранга и тега поддерживает групповые символы. Такими групповыми символами являются значения MPI_ANY_TAGи MPI_ANY_SOURCE.При использовании этих значений вызывающий процесс примет следующее полученное им сообщение независимо от его источника и тега. Параметр Statusимеет тип MPI_Status.Информацию об операции приема можно получить из объекта Status.Параметр статуса содержит три поля: MPI_SOURCE, MPI_TAGи MPI_ERROR.Следовательно, объект Statusможно использовать для определения тега и источника процесса-отправителя. При известном количестве процессов-участников можно точно определить отправителей сообщений и их получателей. Обычно для этого используется конкретное приложение. Распределение работы также зависит от приложения. Перед началом работы каждый процесс сразу же определяет, сколько других процессов включено в приложение. Это реализуется следующим вызовом: MPI_Comm_size(MFI_COMM_WORLD, &WorldSize) ;
С помощью этой функции определяется размер группы процессов, связанных с конкретным коммуникатором. В данном используется стандартный коммуникатор (MPI_COMM_WORLD).Количество процессов-участников возвращается в параметре WorldSize.Этот параметр имеет тип int.Если каждому процессу известно значение WorldSize,значит, он знает, сколько процессов связано его коммуникатором.
Группирование задач по коммуникаторам
Процессы связываются не только с ранга м и, но и с ко мм уникатора м и. Коммуникатор определяет область коммуникации для некоторого множества процессов. Все процессы, связанные с одним и тем же коммуникатором, относятся к одной и той же группе коммуникации. Работу, выполняемую MPI-программой, можно разделить между группами коммуникаций. По умолчанию все процессы относятся к группе MPI_C0MM_WORLD.Для создания новых ко м муникаторов можно использовать функцию MPI_Comm_create(). Список функций (с краткими описаниями), используемых для работы с коммуникаторами, приведен в табл. 9.1.
Читать дальше