#include #include int main(int argc, char *argv[]) { int N, k; int my_rank, commsize; double result, buf = 0; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD, &commsize); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); /* Головной процесс */ if (my_rank == 0) { scanf("%d", &N); k = N / commsize; for (int i = 1; i < commsize; ++i) MPI_Send(&k, 1, MPI_INT, i, 0, MPI_COMM_WORLD); /* Считаем члены суммы, оставшиеся после распределения (в случае commsize < N - считаем всю сумму тут) */ for (int i = k * (commsize - 1) + 1; i <= N; i++) result += 1 / (double)i; /* Получаем результаты подсчета от всех процессов */ printf("[0] result = %f\n", result); for (int i = 1; i < commsize; ++i) { MPI_Recv(&buf, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, NULL); printf("[%d] result = %f\n", i, buf); result += buf; } printf("result = %f\n", result); } else { MPI_Recv(&k, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, NULL); for (int i = (my_rank - 1) * k + 1; i < my_rank * k + 1; ++i) result += 1 / (double)i; MPI_Send(&result, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD); } MPI_Finalize(); }