Advertisement
Guest User

Untitled

a guest
Nov 21st, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.96 KB | None | 0 0
  1.  
  2. #include "mpi.h"
  3. #include "iostream"
  4. #include "iomanip"
  5. using namespace std;
  6. double** mtrxInit(int n) {
  7.     double** mtrx = new double*[n];
  8.     for (int i = 0; i < n; i++) {
  9.         mtrx[i] = new double[n];
  10.         for (int j = 0; j < n; j++) {
  11.             mtrx[i][j] = 0;
  12.         }
  13.     }
  14.     return mtrx;
  15. }
  16.  
  17. double** mtrxInitFrom(double** mtrx, int n)
  18. {
  19.     double** res = mtrxInit(n);
  20.     for (int i = 0; i < n; i++)
  21.     {
  22.         for (int j = 0; j < n; j++)
  23.         {
  24.             res[i][j] = mtrx[i][j];
  25.         }
  26.     }
  27.     return res;
  28. }
  29. void mtrxSumm(double** mtrx1, double** mtrx2, int n) {
  30.     for (int i = 0; i < n; i++) {
  31.         for (int j = 0; j < n; j++) {
  32.             mtrx1[i][j] += mtrx2[i][j];
  33.         }
  34.     }
  35. }
  36.  
  37. void mtrxMult(double** mtrx1, double** mtrx2, int n) {
  38.     double** res = mtrxInit(n);
  39.  
  40.     for (int i = 0; i < n; i++) {
  41.         for (int j = 0; j < n; j++) {
  42.             for (int k = 0; k < n; k++) {
  43.                 res[i][j] += mtrx1[i][k] * mtrx2[k][j];
  44.             }
  45.         }
  46.     }
  47.  
  48.     for (int i = 0; i < n; i++) {
  49.         for (int j = 0; j < n; j++) {
  50.             mtrx1[i][j] = res[i][j];
  51.         }
  52.         delete res[i];
  53.     }
  54.     delete[] res;
  55. }
  56.  
  57. void mtrxMult(double** mtrx, double a, int n) {
  58.     for (int i = 0; i < n; i++) {
  59.         for (int j = 0; j < n; j++) {
  60.             mtrx[i][j] *= a;
  61.         }
  62.     }
  63. }
  64.  
  65. void mtrxShow(double** mtrx, int n) {
  66.     for (int i = 0; i < n; i++) {
  67.         for (int j = 0; j < n; j++) {
  68.             cout << mtrx[i][j] << " ";
  69.         }
  70.         cout << endl;
  71.     }
  72.     cout << endl;
  73. }
  74.  
  75. double mtrxElSumm(double** mtrx, int n) {
  76.     double res = 0;
  77.     for (int i = 0; i < n; i++) {
  78.         for (int j = 0; j < n; j++) {
  79.             res += mtrx[i][j];
  80.         }
  81.     }
  82.     return res;
  83. }
  84.  
  85. double* packBuf2(double** tmtrx, int n) {
  86.     double* pack = new double[n*n];
  87.     int l = 0;
  88.     for (int i = 0; i < n; i++) {
  89.         for (int j = 0; j < n; j++) {
  90.             pack[l] = tmtrx[i][j];
  91.             l++;
  92.         }
  93.     }
  94.     return pack;
  95. }
  96.  
  97. double** unpackBuf2(double* pack, int n) {
  98.     double** tmtrx = new double*[n];
  99.     int l = 0;
  100.     for (int i = 0; i < n; i++) {
  101.         tmtrx[i] = new double[n];
  102.         for (int j = 0; j < n; j++) {
  103.             tmtrx[i][j] = pack[l];
  104.             l++;
  105.         }
  106.     }
  107.     return tmtrx;
  108. }
  109.  
  110.  
  111. double** mtrxIcalc(double** mtrx, int n, int size, int rank) {
  112.     double** res = mtrxInitFrom(mtrx, n);
  113.     for (int i = 1; i < size; i++) {
  114.         mtrxMult(res, mtrx, n);
  115.     }
  116.     return res;
  117. }
  118.  
  119. double** mtrxRinit(double** mtrx, int n, int rank) {
  120.     double** imatrx = mtrxInit(n);
  121.     for (int i = 0; i < n; i++) {
  122.         imatrx[i][i] = 1.0;
  123.     }
  124.  
  125.     for (int i = 0; i < rank; i++) {
  126.         mtrxMult(imatrx, mtrx, n);
  127.         mtrxMult(imatrx, 1.0 / (i + 1), n);
  128.     }
  129.  
  130.     return imatrx;
  131. }
  132.  
  133. void expanent2() {
  134.     int rank;
  135.     int size;
  136.     MPI_Status st;
  137.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  138.     MPI_Comm_size(MPI_COMM_WORLD, &size);
  139.  
  140.     double startTime = MPI_Wtime();
  141.  
  142.     //степень
  143.     int nt = 100000;
  144.  
  145.     //init matrx
  146.     int n = 25;
  147.     double** mtrx = mtrxInit(n);
  148.     for (int i = 0; i < n; i++) {
  149.         for (int j = 0; j < n; j++) {
  150.             mtrx[i][j] = i*(i == j);
  151.         }
  152.     }
  153.  
  154.     //
  155.     double** cmtrxt = mtrxIcalc(mtrx, n, size, rank);
  156.     double** imtrx = mtrxRinit(mtrx, n, rank);
  157.     double** summ = mtrxInitFrom(imtrx, n);
  158.  
  159.     for (int i = size + rank; i < nt; i = i + size) {
  160.         mtrxMult(imtrx, cmtrxt, n);
  161.         double cont = 1.0;
  162.         for (int j = 0; j < size; j++) {
  163.             cont = cont*(i - j);
  164.         }
  165.         mtrxMult(imtrx, 1.0 / cont, n);
  166.         mtrxSumm(summ, imtrx, n);
  167.     }
  168.  
  169.     double* reciveBuf = new double[n*n];
  170.     double* sendBuf = packBuf2(summ, n);
  171.  
  172.     MPI_Reduce(sendBuf, reciveBuf, n*n, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
  173.  
  174.     if (rank == 0) {
  175.         double** result = unpackBuf2(reciveBuf, n);
  176.         mtrxShow(result, n);
  177.         for (int i = 0; i < n; i++) {
  178.             delete result[i];
  179.         }
  180.         delete[] result;
  181.     }
  182.     double endTime = MPI_Wtime();
  183.     if (rank == 0) {
  184.         cout << "time | " << endTime - startTime << endl;
  185.     }
  186.     for (int i = 0; i < n; i++) {
  187.         delete[] cmtrxt[i];
  188.         delete[] imtrx[i];
  189.         delete[] summ[i];
  190.     }
  191.     delete[] cmtrxt;
  192.     delete[] imtrx;
  193.     delete[] summ;
  194.     delete[] reciveBuf;
  195.     delete[] sendBuf;
  196. }
  197.  
  198. int main(int argc, char** argv) {
  199.  
  200.     MPI_Init(&argc, &argv);
  201.  
  202.     expanent2();
  203.  
  204.  
  205.  
  206.     MPI_Finalize();
  207.     /*
  208.     int data;
  209.     cin >> data;*/
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement