Advertisement
tatty_ko

MPI_my_var

Nov 14th, 2017
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // lab2MPI.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <mpi.h>
  6. #include <iostream>
  7. #include <vector>
  8. #define iter_num 1
  9. #define vec_size 10
  10. using namespace std;
  11.  
  12. void one_proc(int iter)
  13. {
  14.     vector<double> vec(vec_size);
  15.     vec[0] = vec[(vec_size /2)-1] = vec[vec_size - 1] = 1;
  16.     for (int i = 0; i < iter; i++) {
  17.         for (int j = 1; j < vec_size-1; j++)
  18.         {
  19.             if (j != vec_size/2-1) {
  20.                     vec[j] = (vec[j - 1] + vec[j + 1]) / 2;
  21.                 }
  22.         }
  23.     }
  24.     for (int i = 0; i < vec.size(); i++)
  25.     {
  26.         cout << vec[i] << " ";
  27.     }
  28.     cout << endl << endl;
  29. }
  30.  
  31.  
  32.  
  33. int main(int argc, char **argv)
  34. {
  35.     int rank, size;
  36.    
  37.     vector <double> main_vector(vec_size);
  38.     main_vector[0] = main_vector[(vec_size / 2)-1] = main_vector[vec_size - 1] = 1;
  39.     MPI_Init(&argc, &argv);
  40.     MPI_Comm_size(MPI_COMM_WORLD, &size);
  41.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  42.    
  43.     if (size == 1 || size==2)
  44.     {
  45.         one_proc(iter_num);
  46.         MPI_Finalize();
  47.         exit(0);
  48.     }
  49.     MPI_Request request;
  50.     MPI_Status status;
  51.  
  52.     int proc_amount = size - 1;
  53.     int temp_size = ((vec_size % proc_amount) ? (vec_size / proc_amount + 1) : (vec_size / proc_amount));
  54.     vector<double> temp(temp_size);
  55.  
  56.     if (rank == 0)
  57.     {
  58.         for (int i = 1; i <= proc_amount; i++) {
  59.             temp.assign(main_vector.begin() + (i - 1)*vec_size / proc_amount, main_vector.begin() + (i*vec_size / proc_amount));
  60.             MPI_Isend(&temp[0], temp.size(), MPI_DOUBLE, i, 0, MPI_COMM_WORLD, &request);
  61.             MPI_Wait(&request, &status);
  62.         }
  63.     }
  64.     else
  65.     {
  66.         temp[temp_size - 1] = -1;
  67.         MPI_Irecv(&temp[0], temp_size, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &request);
  68.         MPI_Wait(&request, &status);
  69.         if (temp[temp_size - 1] == -1)
  70.         {
  71.             temp.pop_back();
  72.         }
  73.     }
  74.  
  75.  
  76.     double first, last;
  77.     for (int i = 0; i < iter_num; i++)
  78.     {
  79.         if (rank == 1)
  80.         {
  81.             first = temp[temp.size() - 1];
  82.             MPI_Isend(&first, 1, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD, &request);
  83.             MPI_Wait(&request, &status);
  84.  
  85.  
  86.             MPI_Irecv(&last, 1, MPI_DOUBLE, 2, 0, MPI_COMM_WORLD, &request);
  87.             MPI_Wait(&request, &status);
  88.             temp.push_back(last);
  89.             for (int j = 0; j < temp.size(); j++)
  90.             {
  91.                 if (j != 0 && j != temp.size() - 1) {
  92.                     if (temp[j] != 1) {
  93.                         temp[j] = (temp[j - 1] + temp[j + 1]) / 2;
  94.                     }
  95.                 }
  96.             }
  97.             temp.pop_back();
  98.             first = temp[temp.size() - 1];
  99.  
  100.             cout << endl;
  101.             for (int k = 0; k < temp.size(); k++) {
  102.                 cout << rank << " " << temp[k] << endl;
  103.             }
  104.         }
  105.         else if (rank > 1 && rank < proc_amount)
  106.         {
  107.             last = temp[0];
  108.             MPI_Isend(&last, 1, MPI_DOUBLE, rank - 1, 0, MPI_COMM_WORLD, &request);
  109.             MPI_Wait(&request, &status);
  110.  
  111.             MPI_Irecv(&first, 1, MPI_DOUBLE, rank - 1, 0, MPI_COMM_WORLD, &request);
  112.             MPI_Wait(&request, &status);
  113.  
  114.             temp.insert(temp.begin(), first);
  115.  
  116.             first = temp[temp.size() - 1];
  117.             MPI_Isend(&first, 1, MPI_DOUBLE, rank + 1, 0, MPI_COMM_WORLD, &request);
  118.             MPI_Wait(&request, &status);
  119.  
  120.  
  121.             MPI_Irecv(&last, 1, MPI_DOUBLE, rank + 1, 0, MPI_COMM_WORLD, &request);
  122.             MPI_Wait(&request, &status);
  123.  
  124.             temp.push_back(last);
  125.  
  126.             for (int j = 0; j < temp.size(); j++)
  127.             {
  128.                 if (j != 0 && j != temp.size() - 1) {
  129.                     if (temp[j] != 1) {
  130.                         temp[j] = (temp[j - 1] + temp[j + 1]) / 2;
  131.                     }
  132.                 }
  133.             }
  134.  
  135.  
  136.             temp.erase(temp.begin());
  137.             temp.pop_back();
  138.  
  139.             cout << endl;
  140.             for (int k = 0; k < temp.size(); k++) {
  141.                 cout << rank << " " << temp[k] << endl;
  142.             }
  143.  
  144.         }
  145.         else if (rank == proc_amount)
  146.         {
  147.             last = temp[0];
  148.             MPI_Isend(&last, 1, MPI_DOUBLE, proc_amount - 1, 0, MPI_COMM_WORLD, &request);
  149.             MPI_Wait(&request, &status);
  150.  
  151.             MPI_Irecv(&first, 1, MPI_DOUBLE, proc_amount - 1, 0, MPI_COMM_WORLD, &request);
  152.             MPI_Wait(&request, &status);
  153.  
  154.             temp.insert(temp.begin(), first);
  155.             for (int j = 0; j < temp.size(); j++)
  156.             {
  157.                 if (j != 0 && j != temp.size() - 1) {
  158.                     if (temp[j] != 1) {
  159.                         temp[j] = (temp[j - 1] + temp[j + 1]) / 2;
  160.                     }
  161.                 }
  162.             }
  163.             temp.erase(temp.begin());
  164.             cout << endl;
  165.             for (int k = 0; k < temp.size(); k++) {
  166.                 cout << rank << " " << temp[k] << endl;
  167.             }
  168.         }
  169.  
  170.     }
  171.  
  172.     MPI_Finalize();
  173.    
  174.     system("pause");
  175.     return 0;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement