3. Перечислите множество вариантов приема некоторым процессом сообщения, посланного из другого процесса при двухточечном обмене.
4. Какие функции выполняют такие параметры процедур обмена, как ранг (rank) и тэг (tag)?
5. Кто или что устанавливает ранги процессов и тэги у сообщений?
6. Как связываются имена и ранги процессов друг с другом?
7. Что за объект представляет собой общий коммуникатор, который по умолчанию представляется константой MPI_COMM_WORLD?
8. С каким ключевым словом необходимо объявлять переменные, чтобы они имели тип коммуникатора?
9. Как можно создать новый коммуникатор содержащий, те же процессы, что и исходный, но с новым контекстом?
10. Что представляют собою группы процессов и для каких целей они могут использоваться?
11. Какие математические действия выполняются над группами процессов и как назначаются ранги процессам в результирующей группе?
12. Для какой цели в MPI имеется специальная предопределенная пустая группа MPI_GROUP_EMPTY?
13. Чем вызвана необходимость введения двух типов коммуникаторов в MPI и какого вида обменные операции они позволяют выполнять?
14. В интеркоммуникаторе определены понятия локальной и удаленной групп. Какими параметрами определяется в нем двухточечный интеробмен?
15. Из чего создается новая группа процессов, какие ранги будут у процессов вновь созданной группы и где эти ранги будут размещены?
16. Может ли один и тот же процесс в несколько групп? Если да, то как определяется их относительная нумерация в массивах рангов групп?
Организация коллективных обменов в рамках только двухточечных обменов может оказаться весьма громоздкой и трудно обозримой. В MPI для таких случаев предусмотрены специальные процедуры, которые позволяют существенно упростить написание текстов параллельных программ. Все многообразие коллективных обменов сведено к небольшому числу обменных структур, которые условно представлены на рис. 6.1 и семантически определяются следующими типами:
Рисунок 6.1.
· широковещательная рассылка (broadcast);
· сбор данных (gather);
· распределение данных (scatter);
· операции приведения (reduce) и сканирования (scan).
Рассмотрим подробнее операции, выполняемые в процессе коллективных обменов данными.
При широковещательной передаче один и тот же набор данных передается каждому процессу в пределах общего для них коммуникатора. Для выполнения широковещательного обмена используется подпрограмма MPI_Bcast, которая вызывается во всех процессах из области взаимодействия. При этом должны обязательно использоваться одинаковые значения параметров по количеству (count) и типу (datatype). Одна и та же подпрограмма выполняет в одном вызове и передачу и прием данных.
Пример использования широковещательной пересылки для передачи трех числовых значений, вводимых с клавиатуры в одном процессе, всем остальным процессам из коммуникатора MPI_Comm_world, приведен в тексте 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;
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.