next up previous contents
Next: Редукция Up: Коллективные коммуникации Previous: Коммуникации в виде дерева   Contents

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

Пример коммуникации, в которой участвуют все процессы в коммуникаторе, называется коллективной. Как следствие коллективная связь обычно предполагает участие более двух процессов. Широковещательное сообщение - коллективная коммуникация, когда отдельный процесс посылает одинаковые данные каждому процессу. В MPI существует функция для широковещательной передачи MPI_Bcast():

int MPI_Bcast(void* message, int count,

       MPI_Datatype datatype, int root, MPI_Comm comm);

Эта функция просто посылает копию данных в сообщении от процесса root к каждому процессу в коммуникаторе comm. Ее нужно вызывать всем процессам в коммуникаторе с теми же самыми аргументами для root и comm. Широковещательное сообщение не может быть получено с помощью MPI_Recv(). Параметры count и datatype имеют то же самое значение, которое они имеют в MPI_Send(), и MPI_Recv(): определяют содержание сообщения. Однако в отличие от функций направленной передачи, MPI требует, чтобы при коллективном взаимодействии count и datatype имели одни и те же значения для всех процессов в коммуникаторе.

Функцию получения данных Get_data(), используя MPI_Bcast(), можно переписать следующим образом:

void Get_data2(int my_rank, float* a_ptr, float* b_ptr,

     int* n_ptr) {

  int root = 0; /* Аргументы MPI_Bcast */

  int count = 1;

  if (my_rank == 0) {

    printf(''Введите a, b, и n\n'');

    scanf(''%f %f %d'', a_ptr, b_ptr, n_ptr);

  }

  MPI_Bcast(a_ptr, 1, MPI_FLOAT, root, MPI_COMM_WORLD);

  MPI_Bcast(b_ptr, 1, MPI_FLOAT, root, MPI_COMM_WORLD);

  MPI_Bcast(n_ptr, 1, MPI_INT, root, MPI_COMM_WORLD);

} /* Get-data2 */



2004-06-22