next up previous contents
Next: Структура программы MPI Up: Интерфейс передачи сообщений MPI Previous: Интерфейс передачи сообщений MPI   Contents

Первая программа MPI

Первой программой на C, которую пишет большинство начинающих программистов, является программа, выводящая сообщение "Привет, мир!". Она просто печатает сообщение "Привет, мир!"на терминал. Многопроцессорный вариант содержит процессы, каждый из которых посылает приветствие другому.

В MPI процессы, участвующие в выполнении параллельной программы, идентифицируются последовательностью неотрицательных целых чисел. Если в выполнении программы участвуют P процессов, то они будут иметь номера (ранги) 0, 1, ..., P-1. В следующей программе каждый процесс с рангом, не равным 0, посылает сообщение в процесс 0, а процесс 0 выводит все сообщения, которые он получил:

#include <stdio.h>

#include ''mpi.h''

 

main(int argc, char** argv) {

  int my_rank; /* Ранг процесса */

  int p; /* Количество процессов */

  int source; /* Ранг посылающего */

  int dest; /* Ранг принимающего */

  int tag = 50; /* Тэг сообщений */

  char message[100]; /* Память для сообщения */

  MPI_Status status; /* Статус возврата */

 

  MPI_Init(&argc, &argv);

  MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

  MPI_Comm_size(MPI_COMM_WORLD, &p); 

  if (my_rank != 0) {

     sprintf(message, ''Привет из процесса %d!'', my_rank);

     dest = 0;

     /* Используется strlen(message)+1

       чтобы включить '\0' */

     MPI_Send(message, strlen(message)+1,

        MPI_CHAR, dest, tag, MPI_COMM_WORLD);

  } else { /* my_rank == 0 */

     for (source = 1; source < p; source++) {

     MPI_Recv(message, 100, MPI_CHAR, source, tag,

        MPI_COMM_WORLD, &status);

     printf(''%s\n'', message);

     }

  }

  MPI-Finalize();

} /* main */

Если программу откомпилировать и запустить для четырех процессов, она выведет:

Привет из процесса 1!

Привет из процесса 2!

Привет из процесса 3!

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

  1. Пользователь дает команду операционной системе, которая помещает копию выполняемой программы на каждый процессор.
  2. Каждый процессор начинает выполнение его копии программы.
  3. Различные процессы могут в каждый момент времени выполнять различные операторы, осуществляя переходы в пределах программы. Обычно переход зависит от ранга процесса.
Приведенная программа использует парадигму ОПМД (одна программа - множественные данные). При этом различные программы, работающие на различных процессорах, реализуются через ветвление в пределах одной общей программы на основе рангов процесса. Операторы, выполненные процессом 0, отличаются от выполненных другими процессами даже в случае, когда все процессы управляются одной и той же программой. Это наиболее распространенный метод написания программ ОПМД.



2004-06-22