Системное программное обеспечение - Учебное пособие (Терехин А.Н.)

4.21 mpi: применение коллективных коммуникаций.

В данном примере производится приближенное вычисление числа π путем численного интегрирования на отрезке методом прямоугольников. Количество точек в разбиении определяет пользователь. Ветвь с номером 0 осуществляет ввод данных от пользователя, а затем, по окончании вычислений, - сбор данных от всех ветвей и вывод результата.

#include <mpi.h>

#include <stdio.h>

 

int main(int argc, char **argv)

{

          int size, rank, N, i;

          double h, sum, x, global_pi;

 

MPI_Init(&argc, &argv); /* Инициализируем библиотеку */

          MPI_Comm_size(MPI_COMM_WORLD, &size);

/* Узнаем количество задач в запущенном приложении... */

MPI_Comm_rank (MPI_COMM_WORLD, &rank);   

/* ...и свой собственный номер: от 0 до (size-1) */

 

          if (rank == 0) {

/* ветвь с номером 0 определяет количество итераций... */

printf("Please, enter the total iteration count: ");

                   scanf("\%d", &N);

          }

/*... и рассылает это число всем ветвям */

          MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD);

          h = 1.0 / N;

          sum = 0.0;

 

/* вычисление частичной суммы */

          for (i = rank + 1; i <= N; i += size) {

                   x = h * (i - 0.5);

                   sum += f(x);

          }

          sum = h * sum;

 

/* суммирование результата на ветви с номером 0 */

MPI_Reduce(&sum, &global_pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

          if (rank == 0) {

printf("The result is \%.10f ", global_pi);

          }

MPI_Finalize();

          return 0;

}