Параллельное программирование: Учебное пособие, страница 111

3.  Перечислите множество вариантов приема некоторым процессом сообщения, посланного из другого процесса при двухточечном обмене.

4.  Какие функции выполняют такие параметры процедур обмена, как ранг (rank) и тэг (tag)?

5.  Кто или что устанавливает ранги процессов и тэги у сообщений?

6.  Как связываются имена и ранги процессов друг с другом?

7.  Что за объект представляет собой общий коммуникатор, который по умолчанию представляется константой MPI_COMM_WORLD?

8.  С каким ключевым словом необходимо объявлять переменные, чтобы они имели тип коммуникатора?

9.  Как можно создать новый коммуникатор содержащий, те же процессы, что и исходный, но с новым контекстом?

10.  Что представляют собою группы процессов и для каких целей они могут использоваться?

11.  Какие математические действия выполняются над группами процессов и как назначаются ранги процессам в результирующей группе?

12.  Для какой цели в MPI имеется специальная предопределенная пустая группа MPI_GROUP_EMPTY?

13.  Чем вызвана необходимость введения двух типов коммуникаторов в MPI и какого вида обменные операции они позволяют выполнять?

14.  В интеркоммуникаторе определены понятия локальной и удаленной групп. Какими параметрами определяется в нем двухточечный интеробмен?

15.  Из чего создается новая группа процессов, какие ранги будут у процессов вновь созданной группы и где эти ранги будут размещены?

16.  Может ли один и тот же процесс в несколько групп? Если да, то как определяется их относительная нумерация в массивах рангов групп?


6  Коллективный обмен данными в MPI

Организация коллективных обменов в рамках только двухточечных обменов может оказаться весьма громоздкой и трудно обозримой. В MPI для таких случаев предусмотрены специальные процедуры, которые позволяют существенно упростить написание текстов параллельных программ. Все многообразие коллективных обменов сведено к небольшому числу обменных структур, которые условно представлены на рис. 6.1 и семантически определяются следующими типами:

Рисунок 6.1.

·  широковещательная рассылка (broadcast);

·  сбор данных (gather);

·  распределение данных (scatter);

·  операции приведения (reduce) и сканирования (scan).

Рассмотрим подробнее операции, выполняемые в процессе коллективных обменов данными.

6.1  Широковещательная рассылка

При широковещательной передаче один и тот же набор данных передается каждому процессу в пределах общего для них коммуникатора. Для выполнения широковещательного обмена используется подпрограмма MPI_Bcast, которая вызывается во всех процессах из области взаимодействия. При этом должны обязательно использоваться одинаковые значения параметров по количеству (count) и типу (datatype). Одна и та же подпрограмма выполняет в одном вызове и передачу и прием данных.

Пример использования широковещательной пересылки для передачи трех числовых значений, вводимых с клавиатуры в одном процессе, всем остальным процессам из коммуникатора MPI_Comm_world, приведен в тексте 6.1.

Текст 6.1. Использование широковещательной рассылки

#include "MPI.h"

#include <stdio.h>

int main(int argc, char *argv[])

{

int myrank;

int root = 0;

int count = 1;

float a, b;

int n;

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &myrank);

if (myrank == 0)

{

printf("Enter a, b, n\n");

scanf("%f %f %i", &a, &b, &n);

MPI_Bcast(&a, count, MPI_FLOAT, root,

MPI_COMM_WORLD);

MPI_Bcast(&b, count, MPI_FLOAT, root,

MPI_COMM_WORLD);

MPI_Bcast(&n, count, MPI_INT, root,

MPI_COMM_WORLD);

}

else

{

MPI_Bcast(&a, count, MPI_FLOAT, root,

MPI_COMM_WORLD);

MPI_Bcast(&b, count, MPI_FLOAT, root,

MPI_COMM_WORLD) ;

MPI_Bcast(&n,count, MPI_INT, root, MPI_COMM_WORLD);

printf("%i Process got %f %f %i\n",

myrank, a, b, n);

}

MPI_Finalize();

return 0;

}

6.2  Распределение и сбор данных