
- •Федеральное агентство по атомной энергии
- •Национальный исследовательский ядерный университет «мифи»
- •Средства разработки параллельных приложений на общей и распределенной памяти в стандарте интерфейса передачи данных 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_Topo_test(mpi_Comm comm, int *status)
IN comm коммуникатор (дескриптор)
OUT status тип топологии коммуникатора comm (альтернатива)
MPI_Topo_test возвращает тип топологии, которую определяет коммуникатор.Выходное значение status имеет одно из следующих значений:
MPI_GRAPH топология графа
MPI_CART декартова топология
MPI_UNDEFINED топология не определена
Лекция 8
Технология программирования OpenMP. Основные конструкции OpenMP Си реализации.
Одним из наиболее популярных методов программирования для компьютеров с общей памятью в настоящее время является технология OpenMP. Стандарт OpenMP разработан для языков Фортран, С и С++, содержит спецификации набора директив компилятора, функций и переменных среды окружения. Для разработки OpenMP программ необходимо подключить файл omp.h
Схематично процесс выполнения OpenMP программ можно представить следующим образом:
За основу берется текст последовательной программы, который разбивается на последовательные и параллельные области. В начальный момент времени порождается нить-мастер или "основная" нить, которая начинает выполнение программы.
В отличие от рассмотренного в реализации MPI термина параллельные процессы, здесь используется термин - нити (threads, легковесные процессы). Поскольку OpenMP – это технология разработки параллельных программ, основанная на использовании общей памяти, она ориентирована на SMP вычислительные системы, где реализован механизм эффективной поддержки нитей, исполняющихся на различных процессорах, что позволяет избежать значительных накладных расходов на поддержку классических UNIX-процессов.
Основная нить исполняет все последовательные области программы. При входе в параллельную область порождаются дополнительные нити, каждая из которых получает свой уникальный номер, причем нить-мастер всегда имеет номер 0. Все нити исполняют один и тот же код, соответствующий параллельной области. При выходе из параллельной области основная нить дожидается завершения остальных нитей, и дальнейшее выполнение программы продолжает только она.
Синтаксис OpenMP-директив:
#pragma omp имя_директивы [оператор [оператор] ...]
Все директивы OpenMP используют префикс #pragma omp.
Директива parallel - определяет параллельную секцию
#pragma omp parallel [оператор [оператор] ...]
{
< код параллельной секции >
}
Участок кода, стоящий в фигурных скобках, будет выполняться параллельно. Для выполнения кода параллельной секции, порождается OMP_NUM_THREADS-1 нитей, где OMP_NUM_THREADS - это переменная окружения, значение которой задает пользователь до начала выполнения программы. Все нити исполняют код, заключенный между фигурными скобками. После выхода из параллельной секции автоматически происходит неявная синхронизация порожденных нитей. Когда все порожденные нити доходят до точки выхода из параллельной секции, нить-мастер продолжает выполнение последующей части программы, остальные нити уничтожаются.
Параллельные секции могут быть вложенными. По умолчанию вложенная параллельная секция исполняется одной нитью. Принцип обработки вложенных секций определяет переменная OMP_NESTED, значение которой можно изменить с помощью функции OMP_SET_NESTED.
На время выполнения параллельной области, изменить количество порожденных нитей нельзя, однако если пользователь установит значение переменной OMP_DYNAMIC=1, то с помощью функции OMP_SET_NUM_THREADS при входе в следующую параллельную секцию можно изменить значение переменной OMP_NUM_THREADS, а значит и число порождаемых нитей. Значение переменной OMP_DYNAMIC устанавливается функцией OMP_SET_DYNAMIC.
(Клауза) оператор - один из следующих: