Advertisement
filip710

zadatak

Jan 21st, 2020
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.26 KB | None | 0 0
  1. #include <mpi.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. int main(int argc, char *argv[])
  7. {
  8.     int matrixSize, rank, size;
  9.  
  10.     double *sendA, *sendB, *finalC, *recA, *recC;
  11.     //definirnje varijabli za mjerenje userCPU i realCPU
  12.     //double t1, t2;
  13.     MPI::Init(argc, argv);
  14.  
  15.     size = MPI::COMM_WORLD.Get_size();
  16.     rank = MPI::COMM_WORLD.Get_rank();
  17.  
  18.     if (rank == 0)
  19.     {
  20.         matrixSize = 4;
  21.         printf("rows is %d \n", matrixSize);
  22.  
  23.         sendA = new double[matrixSize * matrixSize];
  24.         sendB = new double[matrixSize * matrixSize];
  25.         finalC = new double[matrixSize * matrixSize];
  26.  
  27.         for (int i = 0; i < matrixSize; i++)
  28.             for (int j = 0; j < matrixSize; j++)
  29.             {
  30.                 sendA[i * matrixSize + j] = i + 1;
  31.             }
  32.         for (int i = 0; i < matrixSize; i++)
  33.             for (int j = 0; j < matrixSize; j++)
  34.             {
  35.                 sendB[i * matrixSize + j] = j + 1;
  36.             }
  37.     }
  38.  
  39.     MPI::COMM_WORLD.Barrier();
  40.     MPI::COMM_WORLD.Bcast(&matrixSize, 1, MPI::INT, 0);
  41.     //Start time t1
  42.     //t1 = MPI::Wtime();
  43.     recA = new double[matrixSize / size * matrixSize];
  44.     if (sendB == NULL)
  45.     {
  46.         sendB = new double[matrixSize * matrixSize];
  47.     }
  48.     recC = new double[matrixSize / size * matrixSize];
  49.  
  50.    
  51.     MPI::COMM_WORLD.Scatter(sendA, matrixSize * matrixSize / size, MPI::DOUBLE, recA, matrixSize * matrixSize / size, MPI::DOUBLE, 0);
  52.  
  53.    
  54.     MPI::COMM_WORLD.Bcast(sendB, matrixSize * matrixSize, MPI::DOUBLE, 0);
  55.  
  56.    
  57.     for (int i = 0; i < (matrixSize / size); i++)
  58.         for (int j = 0; j < matrixSize; j++)
  59.         {
  60.             recC[i * matrixSize + j] = 0;
  61.             for (int k = 0; k < matrixSize; k++)
  62.                 recC[i * matrixSize + j] += recA[i * matrixSize + k] * sendB[k * matrixSize + j];
  63.         }
  64.  
  65.     MPI::COMM_WORLD.Barrier();
  66.     MPI::COMM_WORLD.Gather(recC, matrixSize * matrixSize / size, MPI::DOUBLE, finalC, matrixSize * matrixSize / size, MPI::DOUBLE, 0);
  67.     MPI::COMM_WORLD.Barrier();
  68.     //End time t2
  69.     //t2 = MPI::Wtime();
  70.    
  71.     /*
  72.         IZRACUN realCPU Time
  73.         double totalTime;
  74.         double elapsedTime = t2-t1;
  75.         MPI::COMM_WORLD.Reduce( &elapsedTime, &totalTime, 1, MPI::DOUBLE, MPI::SUM, 0 );
  76.     */
  77.    
  78.     if (rank == 0)
  79.     {
  80.         /*      
  81.         IZRACUN MLFPOS
  82.         int n_flop = 2 * matrixSize * matrixSize * matrixSize;
  83.         double time = t2- t1;
  84.         double mflops = n_flop / (time * 1000000);
  85.         */
  86.         for (int i = 0; i < matrixSize; i++)
  87.         {
  88.             for (int j = 0; j < matrixSize; j++)
  89.                 printf(" %.2f ", finalC[i * matrixSize + j]);
  90.             printf("\n");
  91.         }
  92.         printf("Send A: \n");
  93.         for (int i = 0; i < matrixSize; i++)
  94.         {
  95.             for (int j = 0; j < matrixSize; j++)
  96.                 printf(" %.2f ", sendA[i * matrixSize + j]);
  97.             printf("\n");
  98.         }
  99.         printf("Send B: \n");
  100.         for (int i = 0; i < matrixSize; i++)
  101.         {
  102.             for (int j = 0; j < matrixSize; j++)
  103.                 printf(" %.2f ", sendB[i * matrixSize + j]);
  104.             printf("\n");
  105.         }
  106.     }
  107.  
  108.     MPI::Finalize();
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement