- •Федеральное агентство по атомной энергии
- •Национальный исследовательский ядерный университет «мифи»
- •Средства разработки параллельных приложений на общей и распределенной памяти в стандарте интерфейса передачи данных mpi и openmp c реализации курс лекций
- •Void main(int argc, char *argv[] ){
- •Int rank, size;
- •Int mpi_Send(void* buf, int count, mpi_Datatype datatype, int dest, int tag, mpi_Comm comm)
- •Int mpi_Get_count(mpi_Status *status, mpi_Datatype datatype, int *count)
- •Стандартный режим передачи
- •Буферизующий режим передачи
- •1. Барьерная синхронизация - mpi_Barrier (comm)
- •2. Широковещательная передача
- •3. Сбор данных
- •4. Рассылка данных
- •5. Операции редукции (обработки данных)
- •Непрерывный.
- •2. Вектор
- •Int mpi_Type_hvector(int count, int blocklength, int stride, mpi_Datatype oldtype,
- •4. Индексированные данные
- •6. Структурный
- •3. Mpi_Group_translate_ranks (mpi_Group group1, int n, int *ranks1, mpi_Group group2, int *ranks2)
- •4. Mpi_Group _compare(group1, group2, result)
- •6. Mpi_Group _excl(group, n, ranks, newgroup)
- •1. Mpi_Comm_size (comm, size)
- •2. Mpi_Comm_rank(comm, rank)
- •3. Mpi_Comm_compare(comm1, comm2, result)
- •1. Mpi_Comm_dup(comm, newcomm)
- •2. Mpi_Comm_create(comm, group, newcomm)
- •3. Mpi_Comm_split(comm, color, key, newcomm)
- •1. Mpi_Cart_create(mpi_Comm comm_old, int ndims, int *dims, int *periods, int reorder, mpi_Comm *comm_cart)
- •2. Mpi_Dims_create(int nnodes, int ndims, int *dims)
- •1. Mpi_Cartdim_get(mpi_Comm comm, int *ndims)
- •2. Mpi_Cart_get(mpi_Comm comm, int maxdims, int *dims, int *periods, int *coords)
- •3. Int mpi_Cart_rank(mpi_Comm comm, int *coords, int *rank)
- •4. Int mpi_Cart_coords(mpi_Comm comm, int rank, int maxdims, int *coords)
- •5. Координаты декартова сдвига
- •Int mpi_Graph_create(mpi_Comm comm_old, int nnodes, int *index, int *edges, int reorder, mpi_Comm *comm_graph)
- •Int mpi_Topo_test(mpi_Comm comm, int *status)
- •Default(shared | none)
- •Void main()
- •Void main()
- •Int a[10], b[10], c[10]; // целочисленные массивы
- •2. Оператор sections
- •3. Оператор single
- •Void main()
- •10. Функция omp_get_nested
- •Int omp_get_nested(void)
4. Рассылка данных
MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm);
IN sendbuf адрес буфера рассылки (исп-ся только корневым проц.)
IN sendcount кол-во эл-ов, посылаемых каждому процессу (исп-ся корневым проц.)
IN sendtype тип данных элементов в буфере посылки (исп-ся корневым проц.)
OUT recvbuf адрес буфера процесса-получателя
IN recvcount количество элементов в буфере корневого процесса (целое)
IN recvtype тип данных элементов приемного буфера
IN root номер процесса-получателя (целое)
IN comm коммуникатор (дескриптор)
MPI_Scatter – обратная функция по отношению к MPI_Gather. Результат ее выполнения таков, как если бы корневой процесс выполнил n операций посылки: MPI_Send(senbuf + i * extent(sendtype), sendcount, sendtype, i, …), и каждый процесс выполнит прием: MPI_Recv(recvbuf, recvcount, recvtype, i, …).
Значения sendcount[i], sendtype на главном процессе, должны быть теми же, что и recvcount, recvtype на процессе i. Количество посланных и полученных данных должно совпадать для всех процессов. Процесс, который выполняет рассылку использует все аргументы функции, принимающие процессы используют только аргументы recvbuf, recvcount, recvtype, root, comm. Аргументы root и comm должны быть одинаковыми во всех процессах.
Сбор данных на всех процессах
MPI_Allgather( sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm)
IN sendbuf начальный адрес посылающего буфера
IN sendcount количество элементов в буфере (целое)
IN sendtype тип данных элементов в посылающем буфере
OUT recvbuf адрес принимающего буфера
IN recvcount кол-во элементов, полученных от любого процесса (целое)
IN recvtype тип данных элементов принимающего буфера
IN comm коммуникатор
Функцию MPI_Allgather можно представить как MPI_Gather, где результат принимают все процессы. Блок данных, посланный j-м процессом принимается каждым процессом и помещается в j-й блок буфера recvbuf.
MPI_Allgather можно представить как MPI_Gatherv, где результат получают все процессы. j-й блок данных, посланный каждым процессом, принимается каждым процессом и помещается в j-й блок буфера recvbuf. Эти блоки могут быть разного размера.
MPI_Allgatherv( sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm)
IN sendbuf начальный адрес посылающего буфера
IN sendcount количество элементов в посылающем буфере (целое)
IN sendtype тип данных элементов в посылающем буфере
OUT recvbuf адрес принимающего буфера
IN recvcounts целочисл. массив (gsize), содерж.кол-во эл-ов, получ. от каждого процесса
IN displs целочисл. массив (gsize), элемент i – смещение (относит. recvbuf), куда помещаются принимаемые данные от процесса i
IN recvtype тип данных элементов принимающего буфера
IN comm коммуникатор
Значения sendcount, sendtype в процессе j должны быть такими же, как recvcounts[j], recvtype в любом другом процессе.
Результат вызова MPI_Allgatherv (...) такой же, как если бы все процессы выполнили n вызовов: MPI_Gatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs,recvtype, root, comm), для root = 0, …, n-1.
Функция MPI_Alltoall – расширение функции MPI_Allgather для случая, когда каждый процесс посылает данные каждому процессу. При этом j-й блок, посланный процессом i, принимается процессом j и помещается в i-й блок буфера recvbuf.
MPI_ Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm)
IN sendbuf начальный адрес посылающего буфера
IN sendcount количество элементов посылаемых в каждый процесс (целое)
IN sendtype тип данных элементов посылающего буфера
OUT recvbuf адрес принимающего буфера
IN recvcount количество элементов, принятых от какого-либо процесса (целое)
IN recvtype тип данных элементов принимающего буфера
IN comm коммуникатор
Результат выполнения функции MPI_Alltoall такой же, как если бы каждый процесс выполнил посылку данных каждому процессу (включая себя) вызовом: MPI_Send(sendbuf + i * sendcount * extent(sendtype), sendcount, sendtype, i, ...), и принял данные от всех остальных процессов путем вызова: MPI_Recv(recvbuf + i* recvcount* extent(recvtype), recvcount, i,…).
Значения sendcount, sendtype в каждом процессе должны быть одинаковыми. Т.е. количество посланных данных должно быть равно количеству полученных данных между каждой парой процессов. Все аргументы используются всеми процессами.
MPI_Alltoallv(sendbuf, sendcounts, sdispls, sendtype, recvbuf,recvcounts, rdispls, recvtype, comm)
IN sendbuf начальный адрес посылающего буфера (альтернатива)
IN sendcounts целочисл. массив (gsize), опред-ет кол-во посыл. кажд. процессу элементов
IN sdispls целочисл. массив (gsize). Эл-нт j содержит смещение области (относит. sendbuf), из которой берутся данные для процесса j
IN sendtype тип данных элементов посылающего буфера
OUT recvbuf адрес принимающего буфера
IN recvcounts целочисл. массив (gsize), содержит число эл-ов, которые могут быть приняты от каждого процесса
IN rdispls целочисл. массив (gsize). Эл-нт i определяет смещение области (относительно recvbuf), в которой размещаются данные, получаемые из процесса i
IN recvtype тип данных элементов принимающего буфера
IN comm коммуникатор