Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "mpi.h"
- #include "iostream"
- #include "iomanip"
- using namespace std;
- int main(int argc, char** argv)
- {
- MPI_Init(&argc, &argv);
- int rank, size;
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- MPI_Comm_size(MPI_COMM_WORLD, &size);
- MPI_Status st;
- double fact2, fact4, fact8;
- double partFact56, partFact567;
- double partFact910, partFact91011;
- double result1314, partFact131415;
- double partFact9101112;
- MPI_Group Group1, Group2, WORLD;
- MPI_Comm LocalGroup1, LocalGroup2;
- MPI_Comm_group(MPI_COMM_WORLD, &WORLD);
- int threadsGroup1[] = { 0,1,2,3 };
- int threadsGroup2[] = { 4,5,6,7 };
- MPI_Group_incl(WORLD, 4, threadsGroup1, &Group1);
- MPI_Group_incl(WORLD, 4, threadsGroup2, &Group2);
- MPI_Comm_create(MPI_COMM_WORLD, Group1, &LocalGroup1);
- MPI_Comm_create(MPI_COMM_WORLD, Group2, &LocalGroup2);
- if (size > 3)
- {
- if (rank == 0)
- {
- cout << "1! = " << 1 << endl;
- fact2 = 1 * 2; // Считаем 2!
- MPI_Send(&fact2, 1, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD); // Отправляем 2! 1 потоку
- cout << "2! = " << fact2 << endl;
- double fact3 = fact2 * 3; // Считаем 3!
- cout << "3! = " << fact3 << endl;
- MPI_Bcast(&fact4, 1, MPI_DOUBLE, 1, LocalGroup1); // Получаем 4! от 1 потока
- cout << "input 4! = " << fact4 << endl;
- double fact5 = fact4 * 5; // Считаем 5!
- cout << "5! = " << fact5 << endl;
- MPI_Bcast(&fact8, 1, MPI_DOUBLE, 3, MPI_COMM_WORLD); // Получаем 8! от 3 потока
- cout << "9! = " << setprecision(15) << fact8 * 9 << endl; //Считаем 9!
- }
- if (rank == 1)
- {
- double partFact34 = 3 * 4;
- MPI_Recv(&fact2, 1, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &st); // Получаем 2! от 0 потока
- fact4 = fact2 * partFact34; // Считаем 4!
- cout << "4! = " << fact4 << endl;
- MPI_Bcast(&fact4, 1, MPI_DOUBLE, 1, LocalGroup1); // Отправляем 4! всем потокам
- MPI_Recv(&partFact567, 1, MPI_DOUBLE, 2, 1, MPI_COMM_WORLD, &st); // Получаем 5*6*7 от 2 потока
- double fact7 = fact4 * partFact567; // Считаем 7!
- cout << "7! = " << setprecision(15) << fact7 << endl;
- MPI_Bcast(&fact8, 1, MPI_DOUBLE, 3, MPI_COMM_WORLD); // Получаем 8! от 3 потока
- MPI_Recv(&partFact910, 1, MPI_DOUBLE, 4, 1, MPI_COMM_WORLD, &st); // Получаем 9*10 от 4 потока
- cout << "10! = " << setprecision(15) << fact8 * partFact910 << endl; // Считаем 10!
- }
- if (rank == 2)
- {
- partFact56 = 5 * 6;
- MPI_Send(&partFact56, 1, MPI_DOUBLE, 3, 1, MPI_COMM_WORLD); // Отправляем 5*6 3 потоку
- partFact567 = partFact56 * 7;
- MPI_Bcast(&fact4, 1, MPI_DOUBLE, 1, LocalGroup1); // Получаем 4! от 1 потока
- MPI_Send(&partFact567, 1, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD); // Отправляем 1 процессу 5*6*7
- double fact6 = fact4 * partFact56; // Считаем 6!
- cout << "6! = " << setprecision(15) << fact6 << endl;
- MPI_Bcast(&fact8, 1, MPI_DOUBLE, 3, MPI_COMM_WORLD); // Получаем 8! от 3 потока
- MPI_Recv(&partFact9101112, 1, MPI_DOUBLE, 5, 1, MPI_COMM_WORLD, &st); // Получаем 9*10*11*12 от 5 потока
- cout << "12! = " << setprecision(15) << fact8 * partFact9101112 << endl; // Считаем 12!
- }
- if (rank == 3)
- {
- double partFact78 = 7 * 8;
- MPI_Recv(&partFact56, 1, MPI_DOUBLE, 2, 1, MPI_COMM_WORLD, &st); // Получаем 5*6 от 2 потока
- double partFact5678 = partFact56 * partFact78;
- MPI_Bcast(&fact4, 1, MPI_DOUBLE, 1, LocalGroup1); // Получаем 4! от 1 потока
- fact8 = fact4 * partFact5678; // Считаем 8!
- cout << "8! = " << setprecision(15) << fact8 << endl;
- MPI_Bcast(&fact8, 1, MPI_DOUBLE, 3, MPI_COMM_WORLD); // Отправляем 8! всем потокам
- MPI_Recv(&partFact91011, 1, MPI_DOUBLE, 4, 1, MPI_COMM_WORLD, &st); // Получаем 9*10*11 от 4 потока
- cout << "11! = " << setprecision(15) << fact8 * partFact91011 << endl; // Считаем 11!
- }
- if (rank == 4)
- {
- partFact910 = 9 * 10;
- MPI_Send(&partFact910, 1, MPI_DOUBLE, 5, 1, MPI_COMM_WORLD); // Отправляем 9*10 5 потоку
- partFact91011 = partFact910 * 11;
- MPI_Bcast(&partFact9101112, 1, MPI_DOUBLE, 1, LocalGroup2); // Получаем 9*10*11*12 от 5 потока
- double partFact910111213 = partFact9101112 * 13;
- cout << "input 9*10*11*12 = " << partFact9101112 << endl;
- MPI_Bcast(&fact8, 1, MPI_DOUBLE, 3, MPI_COMM_WORLD); // Получаем 8! от 3 потока
- MPI_Send(&partFact910, 1, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD); // Отправляем 9*10 1 потоку
- cout << "13! = " << setprecision(15) << fact8 * partFact910111213 << endl; // Считаем 13!
- MPI_Send(&partFact91011, 1, MPI_DOUBLE, 3, 1, MPI_COMM_WORLD); // Отправляем 9*10*11 3 потоку
- }
- if (rank == 5)
- {
- double partFact1112 = 11 * 12;
- MPI_Recv(&partFact910, 1, MPI_DOUBLE, 4, 1, MPI_COMM_WORLD, &st); // Получаем 9*10 от 4 потока
- partFact9101112 = partFact910 * partFact1112;
- MPI_Bcast(&partFact9101112, 1, MPI_DOUBLE, 1, LocalGroup2); // Считаем 9*10*11*12
- MPI_Recv(&partFact131415, 1, MPI_DOUBLE, 6, 1, MPI_COMM_WORLD, &st);// Получаем 13*14*15 от 6 потока
- double partFact9101112131415 = partFact9101112 * partFact131415;
- MPI_Bcast(&fact8, 1, MPI_DOUBLE, 3, MPI_COMM_WORLD); // Получаем 8! от 3 потока
- cout << "15! = " << setprecision(15) << fact8 * partFact9101112131415 << endl; // Считаем 15!
- MPI_Send(&partFact9101112, 1, MPI_DOUBLE, 2, 1, MPI_COMM_WORLD); // Отправляем 9*10*11*12 2 потоку
- }
- if (rank == 6)
- {
- result1314 = 13 * 14;
- MPI_Send(&result1314, 1, MPI_DOUBLE, 7, 1, MPI_COMM_WORLD); // Отправляем 13*14 7 потоку
- partFact131415 = result1314 * 15;
- MPI_Bcast(&partFact9101112, 1, MPI_DOUBLE, 1, LocalGroup2); // Получаем 9*10*11*12 от 5 потока
- MPI_Send(&partFact131415, 1, MPI_DOUBLE, 5, 1, MPI_COMM_WORLD); // Отправляем 13*14*15 5 потоку
- double result91011121314 = partFact9101112 * result1314;
- MPI_Bcast(&fact8, 1, MPI_DOUBLE, 3, MPI_COMM_WORLD); // Получаем 8! от 3 пртока
- cout << "14! = " << setprecision(15) << fact8 * result91011121314 << endl; // Считаем 14!
- }
- if (rank == 7)
- {
- double result1516 = 15 * 16;
- MPI_Recv(&result1314, 1, MPI_DOUBLE, 6, 1, MPI_COMM_WORLD, &st); // Получаем 13*14 от 6 потока
- double partFact13141516 = result1314 * result1516;
- MPI_Bcast(&partFact9101112, 1, MPI_DOUBLE, 1, LocalGroup2); // Получаем 9*10*11*12 от 5 потока
- double partFact91011121314151 = partFact9101112 * partFact13141516;
- MPI_Bcast(&fact8, 1, MPI_DOUBLE, 3, MPI_COMM_WORLD); // Получаем 8! от 3 потока
- cout << "16! = " << setprecision(15) << fact8 * partFact91011121314151 << endl; // Считаем 16!
- }
- }
- MPI_Group_free(&Group1);
- MPI_Group_free(&Group2);
- MPI_Group_free(&WORLD);
- MPI_Comm_free(&LocalGroup1);
- MPI_Comm_free(&LocalGroup2);
- MPI_Finalize();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement