Санкт-Петербургский государственный университет
Опубликован: 11.10.2012 | Доступ: свободный | Студентов: 929 / 170 | Длительность: 05:14:00
Лекция 5:

Коллективные обмены

< Лекция 4 || Лекция 5: 123 || Лекция 6 >
Аннотация: В этой лекции дается общая характеристика коллективных обменов. Рассматриваются широковещательная рассылка, операции распределения и сбора данных, операции приведения, синхронизация коллективных обменов.

Презентацию к данной лекции Вы можете скачать здесь.

Общая характеристика коллективных обменов

В операции коллективного обмена вовлечены не два, а большее число процессов

В операции коллективного обмена вовлечены не два, а большее число процессов

Общая характеристика коллективных обменов:

  • коллективные обмены не могут взаимодействовать с двухточечными. Коллективная
  • передача не может быть перехвачена двухточечной подпрограммой приема;
  • коллективные обмены могут выполняться как с синхронизацией, так и без нее;
  • все коллективные обмены являются блокирующими для инициировавшего их обмена;
  • теги сообщений в коллективных обменах назначаются системой.

Виды коллективных обменов:

  • широковещательная передача  - выполняется от одного процесса ко всем;
  • распределение данных;
  • сбор данных;
  • обмен с барьером - это форма синхронизации работы процессов, когда обмен сообщениями происходит только после того, как к соответствующей процедуре обратилось определенное число процессов;
  • операции сканирования;
  • операции приведения. Входными являются данные нескольких процессов, а результат  одно значение, которое становится доступным всем процессам, участвующим в обмене.

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


Широковещательная рассылка выполняется подпрограммой

int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm)

MPI_Bcast(buffer, count, datatype, root, comm, ierr)

  

Параметры этой процедуры одновременно являются входными и выходными:

  • buffer - адрес буфера;
  • count - количество элементов данных в сообщении;
  • datatype - тип данных MPI;
  • root - ранг главного процесса, выполняющего широковещательную рассылку;
  • comm - коммуникатор.

Пример

#include "mpi.h"
#include <stdio.h>
int main(int argc,char *argv[])
{
char data[24];
int myrank, count = 25;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
if (myrank == 0)
{
 strcpy(data, "Hi, Parallel Programmer!");
 MPI_Bcast(&data, count, MPI_BYTE, 0, MPI_COMM_WORLD);
 printf("send: %s\n", data);
}
else
{
 MPI_Bcast(&data, count, MPI_BYTE, 0, MPI_COMM_WORLD);
 printf("received: %s\n", data);
}
 MPI_Finalize();
return 0;
}
    

Пример

#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;
} 
  
< Лекция 4 || Лекция 5: 123 || Лекция 6 >
Александр Качанов
Александр Качанов
Япония, Токио
Дмитрий Кифель
Дмитрий Кифель
Казахстан, Темиртау