int MPI_Barrier(MPI_Comm comm)

Download Report

Transcript int MPI_Barrier(MPI_Comm comm)

Параллельное программирование с
использованием технологии MPI
Лекция 8
Томский политехнический университет
Аксёнов Сергей Владимирович
к.т.н., доцент каф.ОСУ ТПУ
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
1
Барьерная синхронизация
int MPI_Barrier(MPI_Comm comm)
Вход
comm:
Коммуникатор
Функция блокирует вызывающий процесс пока все процессы
группы не вызовут её. В каждом процессе управление
возвращается только тогда, когда все процессы в группе вызовут
процедуру
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
2
Барьерная синхронизация
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
if (rank == 0)
{
MPI_Bsend(buf1,20,MPI_INT,1,25,MPI_COMM_WORLD);
MPI_Ssend(buf2,20,MPI_INT,1,26,MPI_COMM_WORLD);
printf(“Отправка данных окончена”);
}
if (rank==1)
{
MPI_Recv(source1, 20, MPI_INT, 0, 26, MPI_COMM_WORLD, &status);
MPI_Recv(source2, 20, MPI_INT, 0, 25, MPI_COMM_WORLD, &status);
printf(“Прием данных окончен”);
}
MPI_Barrier(MPI_COMM_WORLD);
printf(“Завершение работы процесса %d”,rank);
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
3
Широковещательный обмен
int MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root,
MPI_Comm comm)
Вход/Выход
Вход
Вход:
Вход
Вход
buf:
count:
datatype:
root:
comm:
Адрес начала буфера
Количество записей в буфере
Тип данных в буфере
Номер корневого процесса
Коммуникатор
Функция поcылает сообщение из корневого процесса всем процессам
группы, включая себя.
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
4
Широковещательный обмен
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
5
Широковещательный обмен
#include “mpi.h”
#include <stdio.h>
int main (int argc, char *argv[])
{
int rank, *a;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
a = malloc(100*sizeof(int));
if (rank==0)
{
for( i =0; i<100; i++) a[i] =i;
}
MPI_Bsend(a, 100, MPI_INT, 0, MPI_COMM_WORLD);
printf (“Значение n = %d на процессе %d”,n, rank);
MPI_Finalize();
return 0;
}
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
6
Распределение данных MPI_Scatter
int MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype,
void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm
comm)
Вход
Вход
sendbuf:
sendcount:
Вход
Вход/Выход
Вход
sendtype:
recvbuf:
recvcount:
Вход
Вход
Вход
recvtype:
root:
comm:
Адрес буфера рассылки
Количество элементов, посылаемых
каждому процессу
Тип данных в буфере рассылки
Адрес буфера-получателя
Количество элементов в буфере
приема
Тип данных в буфере приема
Номер корневого процесса
Коммуникатор
Процесс с рангом root распределяет содержимое буфера передачи
sendbuf среди всех процессов. Содержимое буфера передачи
разбивается на несколько фрагментов, каждый из которых содержит
sendcount элементов.
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
7
Распределение данных
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
8
Пример MPI_Scatter
#include “mpi.h”
#include <stdio.h>
int main (int argc, char *argv[])
{
int rank, *a;
int gsize,*sendbuf, size;
int root, rbuf[100]; root =0;
MPI_Init(&argc, &argv);
MPI_Comm_size( comm, &gsize);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
size = gsize*100;
sendbuf = malloc(size*sizeof(int));
if (rank==root)
{
for( i =0; i<size; i++) sendbuf[i] =i;
}
MPI_Scatter( sendbuf, 100, MPI_INT, rbuf, 100, MPI_INT, root, MPI_COMM_WORLD);
MPI_Finalize();
return 0;
}
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
9
Распределение данных MPI_Scatterv
int MPI_Scatterv(void *sendbuf, int *sendcounts, int displs, MPI_Datatype
sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root,
MPI_Comm comm)
Вход
Вход
sendbuf:
sendcount:
Вход
Вход
Вход/Выход
Вход
displs:
sendtype:
recvbuf:
recvcount:
Вход
Вход
Вход
recvtype:
root:
comm:
Адрес буфера рассылки
Массив определяющий, число
элементов для пересылки каждому
процессу
Смещение
Тип данных в буфере рассылки
Адрес буфера-получателя
Количество элементов в буфере
приема
Тип данных в буфере приема
Номер корневого процесса
Коммуникатор
Функция MPI_Scatterv позволяет передавать каждому процессу переменное
число элементов данных.
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
10
Сравнение MPI_Scatterv и MPI_Scatter
MPI_Scatterv
MPI_Scatter
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
11
Пример MPI_Scatterv
int gsize,*sendbuf, root, rbuf[100], i, *displs, *scounts;
MPI_Comm_size( comm, &gsize);
sendbuf = malloc(gsize*stride*sizeof(int));
displs = malloc(gsize*sizeof(int));
scounts = malloc(gsize*sizeof(int));
for (i=0; i<gsize; ++i)
{ displs[i] = i*stride;
scounts[i] = 100;
}
MPI_Scatterv( sendbuf, scounts, displs, MPI_INT, rbuf, 100, MPI_INT,
root, MPI_COMM_WORLD);
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
12
Сбор данных MPI-Gather
int MPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm
comm)
Вход
Вход
sendbuf:
sendcount:
Вход
Вход/Выход
Вход
sendtype:
recvbuf:
recvcount:
Вход
Вход
Вход
recvtype:
root:
comm:
Адрес буфера рассылки
Количество элементов в
отсылаемом сообщении
Тип данных в буфере рассылки
Адрес буфера-процесса сборки
Количество элементов в
принимаемом сообщении
Тип данных в буфере приема
Номер процесса-получателя
Коммуникатор
При выполнении операции сборки данных MPI_Gather каждый процесс, включая
корневой, посылает содержимое своего буфера в корневой процесс.
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
13
Сбор данных
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
14
Пример MPI_Gather
int gsize,sendarray[100];
int root, myrank, *rbuf;
MPI_Comm_rank( comm, &myrank);
if ( myrank == root)
{
MPI_Comm_size( comm, &gsize);
rbuf = malloc(gsize*100*sizeof(int));
}
MPI_Gather(sendarray,100,MPI_INT, rbuf,100, MPI_INT,root, MPI_COMM_WORLD);
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
15
Сбор данных MPI_Gatherv
int MPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
void *recvbuf, int *recvcount, int *displs, MPI_Datatype recvtype, int root,
MPI_Comm comm)
Вход
Вход
sendbuf:
sendcount:
Вход
Вход/Выход
Вход
sendtype:
recvbuf:
recvcount:
Вход
displs:
Вход
Вход
Вход
recvtype:
root:
comm:
Адрес буфера рассылки
Количество элементов в буфере
рассылки
Тип данных в буфере рассылки
Адрес буфера-получателя
Количество элементов, полученных
от каждого процесса в буфере
приема
Элемент i определяет смещение
относительно recvbuf, в котором
размещаются данные из процесса i
Тип данных в буфере приема
Номер процесса-получателя
Коммуникатор
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
16
Сравнение MPI_Gather и MPI_Gatherv
MPI_Gather
MPI_Gatherv
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
17
Пример MPI_Gatherv
int gsize,sendarray[100], root, *rbuf, stride, *displs,i,*rcounts;
MPI_Comm_size( comm, &gsize);
rbuf = malloc(gsize*stride*sizeof(int));
displs = malloc(gsize*sizeof(int));
rcounts = malloc(gsize*sizeof(int));
for (i=0; i<gsize; ++i) {
displs[i] = i*stride;
rcounts[i] = 100;
}
MPI_Gatherv( sendarray, 100, MPI_INT, rbuf, rcounts, displs,MPI_INT, root,
MPI_COMM_WORLD);
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
18
Сбор для всех процессов
int MPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm)
Вход
Вход
sendbuf:
sendcount:
Вход
Вход/Выход
Вход
sendtype:
recvbuf:
recvcount:
Вход
Вход
recvtype:
comm:
Адрес буфера рассылки
Количество элементов в буфере
рассылки
Тип данных в буфере рассылки
Адрес буфера-получателя
Количество элементов, полученных
от любого процесса
Тип данных в буфере приема
Коммуникатор
Функцию MPI_Allgather можно представить как функцию MPI_Gather, где
результат принимают все процессы, а не только главный.
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
19
Сбор для всех процессов
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
20
Пример MPI_Allgather
MPI_Comm comm;
int gsize,sendarray[100], *rbuf;
MPI_Comm_size( comm, &gsize);
rbuf = malloc(gsize*100*sizeof(int));
MPI_Allgather( sendarray, 100, MPI_INT, rbuf, 100, MPI_INT, MPI_COMM_WORLD);
Параллельное программирование с
использованием технологии MPI Аксёнов
С.В.
21