Advertisement
Artem_Chepurov

Untitled

Nov 21st, 2022
1,004
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.30 KB | Fixit | 0 0
  1. #include <stdio.h>
  2. #include "mpi.h"
  3. #include <cmath>
  4. int main(int argc, char** argv) {
  5.  
  6.     int size, rank, a, b;
  7.     MPI_Status status;
  8.     MPI_Init(&argc, &argv);
  9.     MPI_Comm_size(MPI_COMM_WORLD, &size);
  10.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  11.     a = rank;
  12.     b = -1;
  13.     if (rank == 0) {
  14.         int s;
  15.         scanf_s("%d", &s);
  16.         printf("%d\n", s);
  17.         double start = MPI_Wtime();
  18.         for (int i = 0; i < size - 1; i++) {
  19.             MPI_Send(&s, 1, MPI_INT, i + 1, 5, MPI_COMM_WORLD);
  20.         }
  21.         int n = s / size + 1;
  22.         int ibeg = rank * n + 1;
  23.         int iend = (rank + 1) * n;
  24.         double sum = 0;
  25.         for (int i = ibeg; i <= ((iend > s) ? s : iend); i++)
  26.             sum += pow(-1, i) * log(i) / i;
  27.  
  28.         for (int i = 0; i < size - 1; i++) {
  29.             double local_sum;
  30.             MPI_Recv(&local_sum, 1, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
  31.             sum += local_sum;
  32.         }
  33.         double end = MPI_Wtime();
  34.         printf("total sum = %f\n", sum);
  35.         printf("time = %f", end - start);
  36.     }
  37.     else {
  38.         int n;
  39.         MPI_Recv(&n, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
  40.         n = n / size + 1;
  41.         int ibeg = rank * n + 1;
  42.         int iend = (rank + 1) * n;
  43.         double sum = 0;
  44.         for (int i = ibeg; i <= ((iend > n) ? n : iend); i++)
  45.             sum += pow(-1, i) * log(i) / i;
  46.         MPI_Send(&sum, 1, MPI_DOUBLE, 0, 5, MPI_COMM_WORLD);
  47.     }
  48.     MPI_Finalize();
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement