Advertisement
Tvor0zhok

ParProg8.5

May 15th, 2023 (edited)
454
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.56 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. #include <iostream>
  3. #include <iomanip>
  4. #include "mpi.h"
  5. using namespace std;
  6.  
  7. int const N = 8;
  8.  
  9. void UsrFunc(void* In, void* InOut, int* len, MPI_Datatype* Ty)
  10. {
  11.     int* InV = (int*)In;
  12.     int* InOutV = (int*)InOut;
  13.  
  14.     for (int k = 0; k < (*len); k++)
  15.         InOutV[k] = (InV[k] + InOutV[k]) % 8;
  16. }
  17.  
  18. int main(int argc, char** argv)
  19. {
  20.     int* A = new int[N];
  21.  
  22.     MPI_Init(NULL, NULL);
  23.  
  24.     MPI_Op My_Op;
  25.     MPI_Op_create(&UsrFunc, true, &My_Op);
  26.  
  27.     MPI_Group Gr;
  28.     MPI_Comm_group(MPI_COMM_WORLD, &Gr);
  29.  
  30.     int Size;
  31.     MPI_Comm_size(MPI_COMM_WORLD, &Size);
  32.  
  33.     int Rank;
  34.     MPI_Comm_rank(MPI_COMM_WORLD, &Rank);
  35.  
  36.     MPI_Group New_Group;
  37.  
  38.     if (Rank < Size / 2)
  39.     {
  40.         int* Rks = new int[Size / 2];
  41.  
  42.         for (int k = 0; k < Size / 2; k++)
  43.             Rks[k] = k;
  44.  
  45.         MPI_Group_incl(Gr, Size / 2, Rks, &New_Group);
  46.         delete[] Rks;
  47.     }
  48.     else
  49.     {
  50.         int* Rks = new int[Size - Size / 2];
  51.  
  52.         for (int k = 0; k < Size - Size / 2; k++)
  53.             Rks[k] = k + Size / 2;
  54.  
  55.         MPI_Group_incl(Gr, Size - Size / 2, Rks, &New_Group);
  56.         delete[] Rks;
  57.     }
  58.  
  59.     MPI_Comm New_Comm;
  60.     MPI_Comm_create(MPI_COMM_WORLD, New_Group, &New_Comm);
  61.  
  62.     MPI_Comm_rank(New_Comm, &Rank);
  63.     for (int k = 0; k < N; k++)
  64.         A[k] = k + Rank;
  65.  
  66.     if (Rank == 0)
  67.     {
  68.         int* B = new int[N];
  69.         MPI_Reduce(A, B, N, MPI_INT, My_Op, 0, New_Comm);
  70.         for (int k = 0; k < N; k++)
  71.             cout << B[k] << " ";
  72.         cout << endl;
  73.         delete[] B;
  74.     }
  75.     else
  76.     {
  77.         MPI_Reduce(A, NULL, N, MPI_INT, My_Op, 0, New_Comm);
  78.     }
  79.  
  80.     MPI_Comm_free(&New_Comm);
  81.     MPI_Op_free(&My_Op);
  82.     MPI_Finalize();
  83.     delete[] A;
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement