Tranvick

mpi_2

Jun 9th, 2015
288
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.79 KB | None | 0 0
  1. #include <cstdio>
  2. #include <mpi.h>
  3. #include <fstream>
  4. #include <iostream>
  5. #include <cstdlib>
  6.  
  7. using namespace std;
  8.  
  9. #define msg1 10
  10. #define msg2 20
  11. #define msg3 30
  12.  
  13. void generateMatrix(int** &matrix, int size) {
  14.     for(int i=0; i<size; ++i) {
  15.         for(int j=0; j<size; ++j) {
  16.             if(i<=j )
  17.                 matrix[i][j]=i+1;
  18.             else
  19.                 matrix[i][j]=j+1;
  20.         }
  21.     }
  22. }
  23.  
  24. int main(int argc, char **argv)
  25. {
  26.     int ranksize, myrank, n, start;
  27.     MPI_Status status;
  28.     MPI_Init(&argc,&argv);
  29.     MPI_Comm_size (MPI_COMM_WORLD, &ranksize);
  30.     MPI_Comm_rank (MPI_COMM_WORLD, &myrank);
  31.  
  32.     double start_time, finish_time;
  33.  
  34.     MPI_Barrier(MPI_COMM_WORLD);
  35.  
  36.     start = myrank;
  37.     if (myrank == 0)
  38.         cin >> n;
  39.  
  40.     start_time = MPI_Wtime();
  41.  
  42.     MPI_Bcast(&n, 1, MPI_INTEGER, 0, MPI_COMM_WORLD);
  43.     int **matrix = new int*[n];
  44.     for(int i = 0; i < n; ++i)
  45.         matrix[i] = new int[n];
  46.     if(myrank == 0)
  47.         generateMatrix(matrix, n);
  48.  
  49.     int *l = new int[n];
  50.  
  51.     MPI_Barrier(MPI_COMM_WORLD);
  52.  
  53.     int nrows = ((n%ranksize)>myrank)? (n/ranksize+1) : (n/ranksize);
  54.  
  55.     if(myrank == 0)
  56.     {
  57.         for(int i = 1; i < n; ++i)
  58.             if(i % ranksize != 0)
  59.                 MPI_Send(matrix[i], n, MPI_INTEGER, i%ranksize, msg1, MPI_COMM_WORLD);
  60.  
  61.         for(int i = 1; i < n; ++i)
  62.         {
  63.             matrix[0][i] /= matrix[0][0];
  64.             l[i] = matrix[0][i];
  65.         }
  66.         start += ranksize;
  67.         nrows--;
  68.     }
  69.     else
  70.         for(int i = 0; i < nrows; ++i)
  71.             MPI_Recv(matrix[start + ranksize*i], n, MPI_INTEGER, 0, msg1, MPI_COMM_WORLD, &status);
  72.  
  73.     MPI_Bcast(&l[1], n - 1, MPI_INTEGER, 0, MPI_COMM_WORLD);
  74.  
  75.     MPI_Barrier(MPI_COMM_WORLD);
  76.  
  77.     for(int k = 1; k < n; ++k)
  78.     {
  79.         for(int j = 0; j < nrows; ++j)
  80.             if(start >= k)
  81.                 for(int i = k; i < n; ++i)
  82.                     matrix[start + j*ranksize][i] -= matrix[start + j*ranksize][k-1] * l[i];
  83.  
  84.         if(myrank == k % ranksize)
  85.         {
  86.             for(int i = k + 1; i < n; ++i)
  87.                 l[i] = matrix[k][i] / matrix[k][k];
  88.         }
  89.         MPI_Bcast(&l[k+1], n - k - 1, MPI_INTEGER, k % ranksize, MPI_COMM_WORLD);
  90.         if(myrank == k % ranksize){
  91.             // for (int i = 0; i < ranksize; ++i) {
  92.             //     if (i != myrank) {
  93.             //         MPI_Send(l + k + 1, n - k - 1, MPI_INTEGER, i, msg3, MPI_COMM_WORLD);
  94.             //     }
  95.             // }
  96.             if(myrank != 0)
  97.                 MPI_Send(matrix[k], k + 1, MPI_INTEGER, 0, msg2, MPI_COMM_WORLD);
  98.             start += ranksize;
  99.             nrows--;
  100.         } else {
  101.             // MPI_Recv(l + k + 1, n - k - 1, MPI_INTEGER, k % ranksize, msg3, MPI_COMM_WORLD, &status);
  102.         }
  103.  
  104.         if(myrank == 0)
  105.         {
  106.             if(k % ranksize != 0)
  107.                 MPI_Recv(matrix[k], k + 1, MPI_INTEGER, k % ranksize, msg2, MPI_COMM_WORLD, &status);
  108.             for(int i = k + 1; i < n; ++i)
  109.                 matrix[k][i] = l[i];
  110.         }
  111.         MPI_Barrier(MPI_COMM_WORLD);
  112.  
  113.     }
  114.     MPI_Barrier(MPI_COMM_WORLD);
  115.     finish_time = MPI_Wtime();
  116.  
  117.     double s_wb_time, f_wb_time;
  118.     MPI_Barrier(MPI_COMM_WORLD);
  119.  
  120.     s_wb_time = MPI_Wtime();
  121.  
  122.     ofstream fout("output.txt");
  123.     if(myrank == 0)
  124.     {
  125.         fout << n << endl;
  126.         for(int i=0; i<n; i++)
  127.         {
  128.             for(int j=0; j<n; j++)
  129.                 fout<<matrix[i][j]<<' ';
  130.             fout<<endl;
  131.         }
  132.         fout<<endl;
  133.  
  134.         cout << "Execution: " << finish_time - start_time;
  135.     }
  136.     MPI_Barrier(MPI_COMM_WORLD);
  137.  
  138.     f_wb_time = MPI_Wtime();
  139.     if(myrank == 0)
  140.     {
  141.         cout << ", write back: " << f_wb_time - s_wb_time << endl;
  142.     }
  143.  
  144.     MPI_Finalize();
  145.  
  146.     return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment