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; } |
|