Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MPI - MKM.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
391.79 Кб
Скачать

2.Группы и коммуникаторы mpi. Создание новых групп (коммуникаторов).

Группа представляет собой упорядоченное множество процессов. Каждый процесс идентифицируется переменной целого типа. Идентификаторы процессов образуют непрерывный ряд, начинающийся с 0. Существует две предопределенных группы: MPI_GROUP_EMPTY– группа, не содержащая ни одного процесса; MPI_GROUP_NULL – значение, возвращаемое в случае, когда группа не может быть создана. Созданная группа не может быть модифицирована, м.б только создана новая группа.

Коммуникатор представляет собой скрытый объект с некоторым набором атрибутов, а также правилами его создания, использования и уничтожения. Коммуникатор описывает некоторую область связи. Одной и той же области связи может соответствовать несколько коммуникаторов,

но даже в этом случае они не являются тождественными и не могут участвовать во взаимном обмене сообщениями.В MPI существует два типа коммуникаторов: intracommunicator – описывает область связи некот группы процессов; intercommunicator – служит для связи между процессами двух различн групп. Функция создания коммуникатора - MPI_Comm_create:

MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm)

comm – родительский коммуникатор; group – группа, для которой создается коммуникатор; newcomm – новый коммуникатор. Для процессов, которые не являются членами группы, возвращается значение MPI_COMM_NULL. Функция возвращает код ошибки, если группа group не является подгруппой родительского коммуникатора.

Функция создания группы с помощью коммуникатора - MPI_Comm_group

MPI_Comm_group(MPI_Comm comm, MPI_Group *group)

comm – коммуникатор; group – группа. Функция создает группу group для множества процессов, входящих в область связи коммуникатора comm.

Новые группы могут быть созданы с помощью различных выборок из существующей группы.

MPI_Group_incl(MPI_Group group, int n, int *ranks, MPI_Group*newgroup)

MPI_Group_excl(MPI_Group group, int n, int *ranks, MPI_Group*newgroup)

group – существующая группа; n – число элементов в массиве ranks; ranks – массив номеров процессов; newgroup – новая группа. Функция MPI_Group_incl создает новую группу, которая состоит из процессов существующей группы, перечисленных в массиве ranks. Функция MPI_Group_excl создает новую группу из тех процессов group, которые не перечислены в массиве ranks.

3. Параллельное умножение матриц в mpi.

intsize,rank;

MPI_Status status;

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&rank);

MPI_Comm_size(MPI_COMM_WORLD,&size);

int n=10,x=0, p=n/(size-1); // kazhdyi process schitaetpo p strok

int a[n][n],c[n][n],b[n][n],d[p*n][n]; // a*b, c - rezul'tat

inti,k,l,r,j,s;

for (i=0;i<n;i++)

{ for(j=0;j<n;j++) { b[i][j]=j; a[i][j]=x; x++; } }

if (rank!=size-1)

{ for(k=rank*p;k<p*(rank+1);k++)

{ for(int j=0;j<n;j++){

s=0;

for (i=0; i<n; i++) {

s+=a[k][i]*b[i][j]; d[k][j]=s;

} } }

MPI_Send(&d[rank*p][0],p*n,MPI_DOUBLE,size-1,5,MPI_COMM_WORLD);

}

else

{ for (i=0; i<size-1;i++)

{ MPI_Recv(&c[i*p][0],p*n,MPI_DOUBLE,i,5,MPI_COMM_WORLD, &status); } }

MPI_Finalize();

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