Advertisement
Margoshinka

земля металлом

Feb 16th, 2023
1,013
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.12 KB | None | 0 0
  1. #include "mpi.h"
  2. #include "iostream"
  3. #include "iomanip"
  4. using namespace std;
  5.  
  6. int main(int argc, char** argv)
  7. {
  8.     MPI_Init(&argc, &argv);
  9.     int rank, size;
  10.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  11.     MPI_Comm_size(MPI_COMM_WORLD, &size);
  12.     MPI_Status st;
  13.     double fact2, fact4, fact8;
  14.     double partFact56, partFact567;
  15.     double partFact910, partFact91011;
  16.     double result1314, partFact131415;
  17.     double partFact9101112;
  18.     MPI_Group Group1, Group2, WORLD;
  19.     MPI_Comm LocalGroup1, LocalGroup2;
  20.     MPI_Comm_group(MPI_COMM_WORLD, &WORLD);
  21.     int threadsGroup1[] = { 0,1,2,3 };
  22.     int threadsGroup2[] = { 4,5,6,7 };
  23.     MPI_Group_incl(WORLD, 4, threadsGroup1, &Group1);
  24.     MPI_Group_incl(WORLD, 4, threadsGroup2, &Group2);
  25.     MPI_Comm_create(MPI_COMM_WORLD, Group1, &LocalGroup1);
  26.     MPI_Comm_create(MPI_COMM_WORLD, Group2, &LocalGroup2);
  27.  
  28.     if (size > 3)
  29.     {
  30.         if (rank == 0)
  31.         {
  32.             cout << "1! = " << 1 << endl;
  33.             fact2 = 1 * 2;                                          // Считаем 2!
  34.             MPI_Send(&fact2, 1, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD);  // Отправляем 2! 1 потоку
  35.             cout << "2! = " << fact2 << endl;
  36.             double fact3 = fact2 * 3;                               // Считаем 3!
  37.             cout << "3! = " << fact3 << endl;
  38.             MPI_Bcast(&fact4, 1, MPI_DOUBLE, 1, LocalGroup1);   // Получаем 4! от 1 потока
  39.             cout << "input 4! = " << fact4 << endl;
  40.             double fact5 = fact4 * 5;                               // Считаем 5!
  41.             cout << "5! = " << fact5 << endl;
  42.             MPI_Bcast(&fact8, 1, MPI_DOUBLE, 3, MPI_COMM_WORLD);    // Получаем 8! от 3 потока
  43.             cout << "9! = " << setprecision(15) << fact8 * 9 << endl; //Считаем 9!
  44.         }
  45.         if (rank == 1)
  46.         {
  47.             double partFact34 = 3 * 4;
  48.             MPI_Recv(&fact2, 1, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &st);         // Получаем 2! от 0 потока
  49.             fact4 = fact2 * partFact34;                                         // Считаем 4!
  50.             cout << "4! = " << fact4 << endl;
  51.             MPI_Bcast(&fact4, 1, MPI_DOUBLE, 1, LocalGroup1);               // Отправляем 4! всем потокам
  52.             MPI_Recv(&partFact567, 1, MPI_DOUBLE, 2, 1, MPI_COMM_WORLD, &st);   // Получаем 5*6*7 от 2 потока
  53.             double fact7 = fact4 * partFact567;                                 // Считаем 7!
  54.             cout << "7! = " << setprecision(15) << fact7 << endl;
  55.             MPI_Bcast(&fact8, 1, MPI_DOUBLE, 3, MPI_COMM_WORLD);                // Получаем 8! от 3 потока
  56.             MPI_Recv(&partFact910, 1, MPI_DOUBLE, 4, 1, MPI_COMM_WORLD, &st);   // Получаем 9*10 от 4 потока
  57.             cout << "10! = " << setprecision(15) << fact8 * partFact910 << endl;    // Считаем 10!
  58.         }
  59.         if (rank == 2)
  60.         {
  61.             partFact56 = 5 * 6;
  62.             MPI_Send(&partFact56, 1, MPI_DOUBLE, 3, 1, MPI_COMM_WORLD);             // Отправляем 5*6 3 потоку
  63.             partFact567 = partFact56 * 7;
  64.             MPI_Bcast(&fact4, 1, MPI_DOUBLE, 1, LocalGroup1);                   // Получаем 4! от 1 потока
  65.             MPI_Send(&partFact567, 1, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD);            // Отправляем 1 процессу 5*6*7
  66.             double fact6 = fact4 * partFact56;                                      // Считаем 6!
  67.             cout << "6! = " << setprecision(15) << fact6 << endl;
  68.             MPI_Bcast(&fact8, 1, MPI_DOUBLE, 3, MPI_COMM_WORLD);                    // Получаем 8! от 3 потока
  69.             MPI_Recv(&partFact9101112, 1, MPI_DOUBLE, 5, 1, MPI_COMM_WORLD, &st);   // Получаем 9*10*11*12 от 5 потока
  70.             cout << "12! = " << setprecision(15) << fact8 * partFact9101112 << endl;    // Считаем 12!
  71.         }
  72.         if (rank == 3)
  73.         {
  74.             double partFact78 = 7 * 8;
  75.             MPI_Recv(&partFact56, 1, MPI_DOUBLE, 2, 1, MPI_COMM_WORLD, &st);        // Получаем 5*6 от 2 потока
  76.             double partFact5678 = partFact56 * partFact78;
  77.             MPI_Bcast(&fact4, 1, MPI_DOUBLE, 1, LocalGroup1);                   // Получаем 4! от 1 потока
  78.             fact8 = fact4 * partFact5678;                                           // Считаем 8!
  79.             cout << "8! = " << setprecision(15) << fact8 << endl;
  80.             MPI_Bcast(&fact8, 1, MPI_DOUBLE, 3, MPI_COMM_WORLD);                    // Отправляем 8! всем потокам
  81.             MPI_Recv(&partFact91011, 1, MPI_DOUBLE, 4, 1, MPI_COMM_WORLD, &st);     // Получаем 9*10*11 от 4 потока
  82.             cout << "11! = " << setprecision(15) << fact8 * partFact91011 << endl;  // Считаем 11!
  83.         }
  84.         if (rank == 4)
  85.         {
  86.             partFact910 = 9 * 10;
  87.             MPI_Send(&partFact910, 1, MPI_DOUBLE, 5, 1, MPI_COMM_WORLD);    // Отправляем 9*10 5 потоку
  88.             partFact91011 = partFact910 * 11;
  89.             MPI_Bcast(&partFact9101112, 1, MPI_DOUBLE, 1, LocalGroup2); // Получаем 9*10*11*12 от 5 потока
  90.             double partFact910111213 = partFact9101112 * 13;
  91.             cout << "input 9*10*11*12 = " << partFact9101112 << endl;
  92.             MPI_Bcast(&fact8, 1, MPI_DOUBLE, 3, MPI_COMM_WORLD);            // Получаем 8! от 3 потока
  93.             MPI_Send(&partFact910, 1, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD);    // Отправляем 9*10 1 потоку
  94.             cout << "13! = " << setprecision(15) << fact8 * partFact910111213 << endl;  // Считаем 13!
  95.             MPI_Send(&partFact91011, 1, MPI_DOUBLE, 3, 1, MPI_COMM_WORLD);  // Отправляем 9*10*11 3 потоку
  96.         }
  97.         if (rank == 5)
  98.         {
  99.             double partFact1112 = 11 * 12;
  100.             MPI_Recv(&partFact910, 1, MPI_DOUBLE, 4, 1, MPI_COMM_WORLD, &st);   // Получаем 9*10 от 4 потока
  101.             partFact9101112 = partFact910 * partFact1112;
  102.             MPI_Bcast(&partFact9101112, 1, MPI_DOUBLE, 1, LocalGroup2);     // Считаем 9*10*11*12
  103.             MPI_Recv(&partFact131415, 1, MPI_DOUBLE, 6, 1, MPI_COMM_WORLD, &st);// Получаем 13*14*15 от 6 потока
  104.             double partFact9101112131415 = partFact9101112 * partFact131415;
  105.             MPI_Bcast(&fact8, 1, MPI_DOUBLE, 3, MPI_COMM_WORLD);                // Получаем 8! от 3 потока
  106.             cout << "15! = " << setprecision(15) << fact8 * partFact9101112131415 << endl;  // Считаем 15!
  107.             MPI_Send(&partFact9101112, 1, MPI_DOUBLE, 2, 1, MPI_COMM_WORLD);    // Отправляем 9*10*11*12 2 потоку
  108.         }
  109.         if (rank == 6)
  110.         {
  111.             result1314 = 13 * 14;
  112.             MPI_Send(&result1314, 1, MPI_DOUBLE, 7, 1, MPI_COMM_WORLD);         // Отправляем 13*14 7 потоку
  113.             partFact131415 = result1314 * 15;
  114.             MPI_Bcast(&partFact9101112, 1, MPI_DOUBLE, 1, LocalGroup2);     // Получаем 9*10*11*12 от 5 потока
  115.             MPI_Send(&partFact131415, 1, MPI_DOUBLE, 5, 1, MPI_COMM_WORLD);     // Отправляем 13*14*15 5 потоку
  116.             double result91011121314 = partFact9101112 * result1314;
  117.             MPI_Bcast(&fact8, 1, MPI_DOUBLE, 3, MPI_COMM_WORLD);                // Получаем 8! от 3 пртока
  118.             cout << "14! = " << setprecision(15) << fact8 * result91011121314 << endl;  // Считаем 14!
  119.         }
  120.         if (rank == 7)
  121.         {
  122.             double result1516 = 15 * 16;
  123.             MPI_Recv(&result1314, 1, MPI_DOUBLE, 6, 1, MPI_COMM_WORLD, &st);    // Получаем 13*14 от 6 потока
  124.             double partFact13141516 = result1314 * result1516;
  125.             MPI_Bcast(&partFact9101112, 1, MPI_DOUBLE, 1, LocalGroup2);     // Получаем 9*10*11*12 от 5 потока
  126.             double partFact91011121314151 = partFact9101112 * partFact13141516;
  127.             MPI_Bcast(&fact8, 1, MPI_DOUBLE, 3, MPI_COMM_WORLD);                // Получаем 8! от 3 потока
  128.             cout << "16! = " << setprecision(15) << fact8 * partFact91011121314151 << endl; // Считаем 16!
  129.         }
  130.     }
  131.     MPI_Group_free(&Group1);
  132.     MPI_Group_free(&Group2);
  133.     MPI_Group_free(&WORLD);
  134.     MPI_Comm_free(&LocalGroup1);
  135.     MPI_Comm_free(&LocalGroup2);
  136.     MPI_Finalize();
  137.     return 0;
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement