
- •Федеральное агентство по атомной энергии
- •Национальный исследовательский ядерный университет «мифи»
- •Средства разработки параллельных приложений на общей и распределенной памяти в стандарте интерфейса передачи данных 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)
Int mpi_Get_count(mpi_Status *status, mpi_Datatype datatype, int *count)
Семантика парного обмена между процессами
Очередность. Сообщения не обгоняют друг друга: если отправитель последовательно посылает два сообщения в один адрес, то они должны быть приняты в том же порядке. Если получатель выполняет два приема последовательно и оба соответствуют тому же сообщению, то вторая операция не будет принимать это сообщение, если первая операция все еще не выполнена. Это требование облегчает установление соответствия посылки и приема. Если процесс имеет однопоточное исполнение, тогда любые два обмена, выполняемые этим процессом, упорядочены.
Если процесс многопоточный, тогда семантика потокового исполнения может быть неопределенной относительно порядка для двух операций посылки, выполняемых двумя различными ветвями. Операции логически являются конкурентами, даже если одна физически предшествует другой. Если две операции приема, которые логически конкурентные, принимают два последовательно посланных сообщения, то два сообщения могут соответствовать двум приемам в различном порядке.
Однозначность выполнения коммуникаций в MPI должен обеспечить программист. Предположим, что посылка инициирована. Тогда возможно, что процесс-получатель повторно инициирует прием, соответствующий этой посылке, хотя сообщение все еще не принято, поскольку оно всякий раз обгоняется другим сообщением, посланным другим источником. Аналогично предположим, что прием был установлен многопоточным процессом. Тогда возможно, что сообщения, соответствующие этому приему, принимаются повторно, хотя прием все еще не закрыт, поскольку он обгоняется другими приемами, установленными на этом узле. Предупредить зависание в такой ситуации является обязанностью программиста.
Ограничение по ресурсам. Любое выполнение операций обмена предполагает наличие ресурсов, которые могут быть ограниченными.
Может иметь место ошибка, когда недостаток ресурсов ограничивает выполнение вызова.
В операциях передачи и приема сообщений размер приемного буфера не может быть меньше количества присланных данных, иначе возникнет ошибка переполнения. Если приемный больше количества присланных данных, то его размер не изменяется.
Source = destination допускается: процесс может послать сообщение самому себе. В этом случае вызвать операции необходимо только в следующей последовательности:
MPI_Send(); MPI_Recv(); иначе возникнет ситуация взаимоблокировки.
Описание блокирующих операций и режимы связи
С одной стороны блокирующие операции более надежны, с другой стороны они менее производительны, поскольку требуют копирования память-память и выделения памяти под буферизацию.
Стандартный режим передачи
Функции передачи/приема MPI_Send(….) и MPI_Recv(…..). В этом режиме MPI сам решает надо или не надо буферизировать передачу сообщений. Блокирующая операция с буферизацией, может начинать выполнять следующую посылку при перемещении пересылаемой информации в выделенный буфер, даже если не выставлен соответствующий запрос от принимающего процесса. Блокирующая операция без буферизации, может начинать выполнять следующую посылку, только если будет выставлен соответствующий запрос на прием, и данные поступят в буфер принимающего процесса.