- •Федеральное агентство по атомной энергии
- •Национальный исследовательский ядерный университет «мифи»
- •Средства разработки параллельных приложений на общей и распределенной памяти в стандарте интерфейса передачи данных 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_Graph_create(mpi_Comm comm_old, int nnodes, int *index, int *edges, int reorder, mpi_Comm *comm_graph)
IN comm_old входной коммуникатор (дескриптор)
IN nnodes количество узлов графа (целое)
IN index массив целочисленных значений, описывающий степени вершин
IN edges массив целочисленных значений, описывающий ребра графа
IN reorder номера могут быть переупорядочены ( true) или нет ( false)
OUT comm_graph построенный коммуникатор с графовой топологией (дескриптор)
Функция MPI_Graph_create является коллективной, создает новый коммуникатор для описания графовой топологии. Если reorder = false, то номер каждого процесса в новой группе идентичен его номеру в старой группе. В противном случае функция может переупорядочить процессы. Если количество узлов графа nnodes меньше, чем размер группы коммуникатора, то процессы, не вошедшие в топологию возвращают значение MPI_COMM_NULL. Вызов будет неверным, если определен граф большего размера, чем размер группы исходного коммуникатора.
Структуру графа определяют три параметра: nnodes, index и edges. Nnodes – число узлов графа от 0 до nnodes-1. i-ый элемент массива index хранит общее число соседей первых i вершин графа. Списки соседей вершин 0, 1, ..., nnodes-1 хранятся в последовательности ячеек массива edges. Общее число элементов в index есть nnodes, а общее число элементов в edges равно числу ребер графа.
Функции запроса топологии графа
Следующие две функции: MPI_Graphdims_get и MPI_Graph_get через коммуникатор возвращают информацию о топологии, которая была создана функцией MPI_Graph_create.
1. int MPI_Graphdims_get(MPI_Comm comm, int *nnodes, int *nedges)
IN comm коммуникатор группы с графовой топологией (дескриптор)
OUT nnodes число вершин графа (целое, равно числу процессов в группе)
OUT nedges число ребер графа (целое)
Полученные значения массивов index и edges может быть использована для корректного определения размера векторов index и edges в функции MPI_Graph_get.
2. int MPI_Graph_get(MPI_Comm comm, int maxindex, int maxedges, int *index, int *edges)
IN comm коммуникатор с графовой топологией (дескриптор)
IN maxindex длина вектора index (целое)
IN maxedges длина вектора edges (целое)
OUT index целочисленный массив, содержащий структуру графа (подробнее в описании функции MPI_Graph_greate)
OUT edges целочисленный массив, содержащий структуру графа
3. int MPI_Graph_neighbors_count(MPI_Comm comm, int rank, int *nneighbors)
IN comm коммуникатор с графовой топологией (дескриптор)
IN rank номер процесса в группе comm (целое)
OUT nneighbors номера процессов, являющихся соседними указанному процессу (целочисленный массив)
4. int MPI_Graph_neighbors(MPI_Comm comm, int rank, int maxneighbors, int *neighbors)
IN comm коммуникатор с графовой топологией (дескриптор)
IN rank номер процесса в группе comm (целое)
IN maxneighbors размер массива neighbors (целое)
OUT neighbors номера процессов, соседних данному (целочисленный массив)
Функция запроса типа топологии
Если топология была определена одной из вышеупомянутых функций, то информация об этой топологии может быть получена с помощью функций запроса. Все они являются локальными вызовами.