Разделы презентаций


Лекция 10. Коллективные операции передачи данных в MPI. Тема 2. Автоматизация

Содержание

Распределение данныхint MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *rcvbuf, int rcvcount, MPI_Datatype rcvtype, int root, MPI_Comm comm)MPI_SCATTER(SENDBUF, SENDCOUNT, SENDTYPE, RCVBUF, RCVCOUNT, RCVTYPE, ROOT, COMM, IERR)Входные параметры:sendbuf — адрес буфера передачи;sendcount

Слайды и текст этой презентации

Слайд 1
Лекция 10. Коллективные операции
передачи данных в MPI.
Тема 2.

Автоматизация проектирования
параллельных программ.

Лекция 10. Коллективные операции передачи данных в MPI. Тема 2. Автоматизация проектирования параллельных программ.

Слайд 2Распределение данных

int MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *rcvbuf,

int rcvcount, MPI_Datatype rcvtype, int root, MPI_Comm comm)

MPI_SCATTER(SENDBUF, SENDCOUNT, SENDTYPE,

RCVBUF, RCVCOUNT, RCVTYPE, ROOT, COMM, IERR)

Входные параметры:
sendbuf — адрес буфера передачи;
sendcount — количество элементов, пересылаемых каждому процессу (но не суммарное количество пересылаемых элементов);
sendtype — тип передаваемых данных;
rcvcount — количество элементов в буфере приема;
rcvtype — тип принимаемых данных;
root — ранг передающего процесса;
comm — коммуникатор.

Выходной параметр:
rcvbuf — адрес буфера приема.
Распределение данныхint MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *rcvbuf, int rcvcount, MPI_Datatype rcvtype, int root, MPI_Comm

Слайд 3
Процесс с рангом root распределяет содержимое буфера передачи sendbuf

среди всех процессов (рис. 1). Содержимое буфера передачи разбивается на

несколько фрагментов, каждый из которых содержит sendcount элементов. Первый фрагмент передается процессу 0, второй процессу 1 и т. д. Аргументы send имеют значение только на стороне процесса root.

Процесс с рангом root распределяет содержимое буфера передачи sendbuf среди всех процессов (рис. 1). Содержимое буфера

Слайд 4Сбор сообщений от остальных процессов в буфер главной задачи

int MPI_Gather(void

*sendbuf, int sendcount, MPI_Datatype sendtype, void *rcvbuf, int rcvcount, MPI_Datatype

rcvtype, int root, MPI_Comm comm)

MPI_GATHER(SENDBUF, SENDCOUNT, SENDTYPE, RCVBUF, RCVCOUNT, RCVTYPE, ROOT, COMM, IERR)
Сбор сообщений от остальных процессов в буфер главной задачиint MPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *rcvbuf,

Слайд 5Каждый процесс в коммуникаторе comm пересылает содержимое буфера передачи sendbuf

процессу с рангом root. Процесс root "склеивает" полученные данные в

буфере приема (рис. 2). Порядок склейки определяется рангами процессов, то есть в результирующем наборе после данных от процесса 0 следуют данные от процесса 1, затем данные от процесса 2 и т. д. Аргументы rcvbuf, rcvcount и rcvtype играют роль только на стороне главного процесса. Аргумент rcvcount указывает количество элементов данных, полученных от каждого процесса (но не суммарное их количество). При вызове подпрограмм MPI_Scatter и MPI_Gather из разных процессов следует использовать общий главный процесс.

Рис.2. Сбор данных при выполнении операции Gather

Каждый процесс в коммуникаторе comm пересылает содержимое буфера передачи sendbuf процессу с рангом root. Процесс root

Слайд 6Векторная подпрограмма распределения данных
int MPI_Scatterv(void *sendbuf, int *sendcounts, int *displs,

MPI_Datatype sendtype, void *rcvbuf, int rcvcount, MPI_Datatype rcvtype, int root,

MPI_Comm comm)

MPI_SCATTERV(SENDBUF, SENDCOUNTS, DISPLS, SENDTYPE, RCVBUF, RCVCOUNT, RCVTYPE, ROOT, COMM, IERR)

Входные параметры:
sendbuf — адрес буфера передачи;
sendcounts — целочисленный одномерный массив, содержащий количество элементов, передаваемых каждому процессу (индекс равен рангу адресата). Его длина равна количеству процессов в коммуникаторе;
displs — целочисленный массив, длина которого равна количеству процессов в коммуникаторе. Элемент с индексом i задает смещение относительно начала буфера передачи. Ранг адресата равен значению индекса i;
sendtype — тип данных в буфере передачи;
rcvcount — количество элементов в буфере приема;
rcvtype — тип данных в буфере приема;
root — ранг передающего процесса;
comm — коммуникатор.
Выходной параметр:
rcvbuf — адрес буфера приема.
Векторная подпрограмма распределения данныхint MPI_Scatterv(void *sendbuf, int *sendcounts, int *displs, MPI_Datatype sendtype, void *rcvbuf, int rcvcount, MPI_Datatype

Слайд 7Сбор данных от всех процессов в заданном коммуникаторе и запись

их в буфер приема с указанным смещением

int MPI_Gatherv(void *sendbuf, int

sendcount, MPI_Datatype sendtype, void *recvbuf, int *recvcounts, int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm)
MPI_GATHERV(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS, DISPLS, RECVTYPE, ROOT, COMM, IERR)

Список параметров у этой подпрограммы похож на список параметров подпрограммы MPI_Scatterv.

В обменах, выполняемых подпрограммами MPI_Allgather и MPI_Alltoall, нет главного процесса. Детали отправки и приема важны для всех процессов, участвующих в обмене.
Сбор данных от всех процессов в заданном коммуникаторе и запись их в буфер приема с указанным смещениемint

Слайд 8
Сбор данных от всех процессов и распределение их всем

процессам

int MPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *rcvbuf, int

rcvcount, MPI_Datatype rcvtype, MPI_Comm comm)

MPI_ALLGATHER(SENDBUF, SENDCOUNT, SENDTYPE, RCVBUF, RCVCOUNT, RCVTYPE, COMM, IERR)

Входные параметры:
sendbuf — начальный адрес буфера передачи;
sendcount — количество элементов в буфере передачи;
sendtype — тип передаваемых данных;
rcvcount — количество элементов, полученных от каждого процесса;
rcvtype — тип данных в буфере приема;
comm — коммуникатор.

Выходной параметр:
rcvbuf — адрес буфера приема.
Сбор данных от всех процессов и распределение их всем процессамint MPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype,

Слайд 9Блок данных, переданный от j-го процесса, принимается каждым процессом и

размещается в j-м блоке буфера приема recvbuf (рис. 3).

Блок данных, переданный от j-го процесса, принимается каждым процессом и размещается в j-м блоке буфера приема recvbuf

Слайд 10Пересылка данных по схеме «каждый — всем»

int MPI_Alltoall(void *sendbuf, int

sendcount, MPI_Datatype sendtype, void *rcvbuf, int rcvcount, MPI_Datatype rcvtype, MPI_Comm

comm)

MPI_ALLTOALL(SENDBUF, SENDCOUNT, SENDTYPE, RCVBUF, RCVCOUNT, RCVTYPE, COMM, IERR)

Входные параметры:
sendbuf — начальный адрес буфера передачи;
sendcount — количество элементов данных, пересылаемых каждому процессу;
sendtype — тип данных в буфере передачи;
rcvcount — количество элементов данных, принимаемык от каждого процесса;
rcvtype — тип принимаемык даннык;
comm — коммуникатор.

Выходной параметр:
rcvbuf — адрес буфера приема.

Векторными версиями MPI_Allgather и MPI_Alltoall являются подпрограммы
MPI_Allgatherv и MPI_Alltoallv.
Пересылка данных по схеме «каждый — всем»int MPI_Alltoall(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *rcvbuf, int rcvcount,

Слайд 11 Сбор данных от всех

процессов и пересылка их всем процессам

int MPI_Allgatherv(void *sendbuf, int sendcount,

MPI_Datatype sendtype, void *rcvbuf, int *rcvcounts, int *displs, MPI_Datatype rcvtype, MPI_Comm comm)

MPI_ALLGATHERV(SENDBUF, SENDCOUNT, SENDTYPE, RCVBUF, RCVCOUNTS, DISPLS, RCVTYPE, COMM, IERR)

Ее параметры совпадают с параметрами подпрограммы MPI_Allgather, за исключением дополнительного входного параметра displs.
Это целочисленный одномерный массив, количество элементов в котором равно количеству процессов в коммуникаторе.
Элемент массива с индексом i задает смещение относительно начала буфера приема recvbuf, в котором располагаются данные, принимаемые от процесса i. Блок данных, переданный от j- го процесса, принимается каждым процессом и размещается в j-м блоке буфера приема.
Сбор данных от всех процессов и пересылка их всем процессамint MPI_Allgatherv(void

Слайд 12Пересылка данных от всех процессов всем процессам со смещением

int MPI_Alltoallv(void

*sendbuf, int *sendcounts, int *sdispls, MPI_Datatype sendtype, void *rcvbuf, int

*rcvcounts, int *rdispls, MPI_Datatype rcvtype, MPI_Comm comm)

MPI_ALLTOALLV(SENDBUF, SENDCOUNTS, SDISPLS, SENDTYPE, RCVBUF, RCVCOUNTS, RDISPLS, RCVTYPE, COMM, IERR)

Ее параметры аналогичны параметрам подпрограммы MPI_Alltoall, кроме двух дополнительных параметров:
sdispls — целочисленный массив, количество элементов в котором равно количеству процессов в коммуникаторе. Элемент j задает смещение относительно начала буфера, из которого данные передаются j-му процессу.
• rdispls — целочисленный массив, количество элементов в котором равно количеству процессов в коммуникаторе. Элемент i задает смещение относительно начала буфера, в который принимается сообщение от i-го процесса.
Пересылка данных от всех процессов всем процессам со смещениемint MPI_Alltoallv(void *sendbuf, int *sendcounts, int *sdispls, MPI_Datatype sendtype,

Слайд 13Операция приведения, результат которой передается одному процессу

int MPI_Reduce(void *buf, void

*result, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm

comm)

MPI_REDUCE(BUF, RESULT, COUNT, DATATYPE, OP, ROOT, COMM, IERR)

Входные параметры:
buf — адрес буфера передачи;
count — количество элементов в буфере передачи;
datatype — тип данных в буфере передачи;
op — операция приведения;
root — ранг главного процесса;
comm — коммуникатор.
Операция приведения, результат которой передается одному процессуint MPI_Reduce(void *buf, void *result, int count, MPI_Datatype datatype, MPI_Op op,

Слайд 14MPI_Reduce применяет операцию приведения к операндам из buf, а результат

каждой операции помещается в буфер результата result (рис. 4). MPI_Reduce

должна вызываться всеми процессами в коммуникаторе comm, а аргументы count, datatype и op в этих вызовах должны совпадать.

Рис. 4. Распределение данных при выполнении операции приведения

MPI_Reduce применяет операцию приведения к операндам из buf, а результат каждой операции помещается в буфер результата result

Слайд 15Предопределенные операции приведения приведены в лекции 9 в табл. 3.



Определение собственных глобальных операций

int MPI_Op_create(MPI_User_function *function, int commute, MPI_Op *op)

MPI_OP_CREATE(FUNCTION,

COMMUTE, OP, IERR)

Входные параметры:
function — пользовательская функция;
commute — флаг, которому присваивается значение "истина", если операция коммутативна (результат не зависит от порядка операндов).
Описание типа пользовательской функции выглядит следующим образом:
typedef void (MPI_User_function)(void *a, void *b, int *len,
MPI_Datatype *dtype)
Здесь операция определяется так:
b[I] = a[I] op b[I]
для I = 0, ..., len - 1.

Удаление пользовательской функции
int MPI_Op_free(MPI_Op *op)
MP I_OP_FREE(OP, IERR)
После завершения вызова op присваивается значение MPI_OP_NULL.

Предопределенные операции приведения приведены в лекции 9 в табл. 3. Определение собственных глобальных операцийint MPI_Op_create(MPI_User_function *function, int

Слайд 16Одновременные сбор и распределение данных

int MPI_Reduce_scatter(void *sendbuf, void *rcvbuf, int

*rcvcounts, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)

MPI_REDUCE_SCATTER(SENDBUF, RCVBUF, RCVCOUNTS, DATATYPE,

OP, COMM, IERR)

Входные параметры:
sendbuf — стартовый адрес буфера приема;
rcvcounts — целочисленный одномерный массив, который задает количество элементов в результирующем массиве, распределяемом каждому процессу. Этот массив должен быть одинаковым во всех процессах, вызывающих данную подпрограмму;
datatype — тип данных в буфере приема;
op — операция;
comm — коммуникатор.

Выходной параметр:
rcvbuf — стартовый адрес буфера приема.
Каждая задача получает не весь результирующий массив, а его часть.
Одновременные сбор и распределение данныхint MPI_Reduce_scatter(void *sendbuf, void *rcvbuf, int *rcvcounts, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)MPI_REDUCE_SCATTER(SENDBUF,

Слайд 17Сбор данных от всех процессов и сохранение результата операции приведения

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

int MPI_Allreduce(void *sendbuf, void *rcvbuf, int

count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)

MPI_ALLREDUCE(SENDBUF, RCVBUF, COUNT, DATATYPE, OP, COMM, IERR)

Входные параметры:
sendbuf — начальный адрес буфера передачи;
count — количество элементов в буфере передачи;
datatype — тип передаваемых данных;
op — операция приведения;
comm — коммуникатор.

Выходной параметр:
rcvbuf — стартовый адрес буфера приема.

При аварийном завершении подпрограмма может возвращать код ошибки MPI_ERR_OP (некорректная операция). Это происходит, если применяется операция, которая не является предопределенной и которая не создана предшествующим вызовом подпрограммы
MPI_Op_create.
Сбор данных от всех процессов и сохранение результата операции приведения в результирующем буфере каждого процессаint MPI_Allreduce(void *sendbuf,

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика