Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Судаков / Лекции / lec22_mpi_pvm.ppt
Скачиваний:
17
Добавлен:
20.03.2015
Размер:
268.8 Кб
Скачать

Пример MPI программы

int main(int argc, char* argv[]){

int my_number; //Мой номер процесса

int proc_num; //общее количество процессов

MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &proc_num); MPI_Comm_rank(MPI_COMM_WORLD, &my_number);

printf("I an process %d, sending data\n", my_number);

MPI_Finalize(); return 0;

}

Создание новых коммуникационных доменов

Иногда необходимо организовать обмен между процессами параллельно с обменом в основном коммуникационном домене

Чтобы теги сообщений повторялись

Чтобы выполнять коллективные операции обмена

Алгоритм Фокса

Это делается путем создания нового коммуникационного домена

Копированием существующего

Разделением существующего на поддомены

Отображение групп на коммуникационные домены

Копирование доменов

Создание копии существующего домена

Обмен в новом домене не перекрывается с обменом в старом

Все процессы старого коммуникатора должны вызвать эту функцию

MPI_Comm tempComm;

MPI_Comm_dup( MPI_COMM_WORLD, &tempComm );

/* ... передаем данные через tempComm ... */

MPI_Comm_free( &tempComm );

Разбиение существующего домена на части

Существующий коммуникатор можно разбить на части

Все процессы старого коммуникатора должны вызвать эту функцию

Все процессы с одинаковым «цветом» (задается) попадают в один коммуникатор

Номер процесса в новом коммуникаторе

задается

MPI_Comm_split(

 

 

existingComm,

/* расщепляемый описатель ( MPI_COMM_WORLD) */

indexOfNewSubComm,

/* номер подгруппы, куда попадает вызывающий

процесс */

 

rankInNewSubComm,

 

/* желательный номер в новой подгруппе */

&newSubComm );

/* описатель области связи новой подгруппы */

Пример расщепления

#include "mpi.h"

int main(int argc, char* argv[]){ MPI_Comm subComm;

int size, rank, subrank, subsize; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank( MPI_COMM_WORLD, &rank );

//разбиваем набор процессов на 3 группы //нумерация процессов в каждой группе 0-2

MPI_Comm_split(MPI_COMM_WORLD, rank/3, rank%3, &subComm);

MPI_Comm_rank( subComm, &subrank ); MPI_Comm_size( subComm, &subsize ); printf("old size = %d new size %d ",size, subsize);

printf("old rank = %d new rank %d\n",rank, subrank); MPI_Comm_free(&subComm);

MPI_Finalize(); return 0;

}

Компиляция и выполнения

[saa@cluster mpi]$ mpicc ./comm_split.c -o comm_split [saa@cluster mpi]$ mpirun -np 10 -wd /net/s1/$PWD ./comm_split old size = 10 new size 1 old rank = 9 new rank 0

old size = 10 new size 3 old rank = 8 new rank 2 old size = 10 new size 3 old rank = 6 new rank 0 old size = 10 new size 3 old rank = 7 new rank 1 old size = 10 new size 3 old rank = 0 new rank 0 old size = 10 new size 3 old rank = 1 new rank 1 old size = 10 new size 3 old rank = 2 new rank 2 old size = 10 new size 3 old rank = 4 new rank 1 old size = 10 new size 3 old rank = 5 new rank 2 old size = 10 new size 3 old rank = 3 new rank 0

Создание коммуникатора на базе группы

Создается группа процессов на базе существующего коммуникатора

В/из группы добавляются/удаляются номера процессов

На базе группы создается новый коммуникатор

Все процессы с общим коммуникатором должны вызвать соответствующие функции

Создание группы на базе коммуникатора

Группа – набор номеров процессов

Может выполнить каждый процесс параллельной программы

В каждом процессе можно создавать свои группы

MPI_Group group; MPI_Comm_group(MPI_COMM_WORLD, &group);

Операции с группами

Удаление процессов из группы

Добавление процессов в группы

Объединение групп

Удаление групп

MPI_Group group, subgroup; int ranks[5], i;

for(i = 0; i<5; i++) ranks[i]=i; MPI_Group_excl(group,5,ranks,&subgroup);

Создание нового коммуникатора на базе

группыMPI Comm subComm;

MPI_Group subgroup;

MPI_Comm_create(MPI_COMM_WORLD, subgroup,&subComm);

Соседние файлы в папке Лекции