2021年5月2日星期日

MPI Programming

I am a beginner in MPI programing and I am trying to do a matrix-vector multiplication (Ax=b). let say A matrix is as follows,

            |3  2  5|  matrix A=   |4  3  1|              |2  4  2|  

I divided A matrix into two matrix A1 and A2 as follows

            |1  2  3|  matrix A1=  |3  2  1|              |1  2  0|                |2  0  2|  matrix A2=  |1  1  0|              |1  2  2|  

The x vector is,

            | 2 |  vector x=   | 1 |              | 3 |  

I need to calculate Ax=b such a way that the process number 1 does the A1 * x multiplication and gives C1 and process number 2 does the A2 * x multiplication and gives C2 and at the end the sum of C1 and C2 will be wrapped up in C. when I run the code through cmd it stops working and I don't know what is the problem. I would be really grateful if you could help me to find out what is the problem in code, here is my code,

#define _CRT_SECURE_NO_WARNINGS  #include<iostream>  #include<fstream>  #include<vector>  #include<iterator>  #include<sstream>  #include<string>  #include<cstdlib>  #include<cmath>  #include<stdio.h>  #include<conio.h>  #include<algorithm>  #include<ctime>   #include<iomanip>  #include<mpi.h>  #include<time.h>  #include<assert.h>    using namespace std;    void Initialise(int **res, int rows, int cols);  void Multiply(int **res, int **A, int **B, int aRows, int aCols, int bRows, int bCols);  void timestamp();          //**********************************************************  /*              |3  2  5|      matrix A=   |4  3  1|                  |2  4  2|       matrix A is divided into two matrix A1,A2                    |1  2  3|      matrix A1=  |3  2  1|                  |1  2  0|                    |2  0  2|      matrix A2=  |1  1  0|                  |1  2  2|                      | 2 |      vector x=   | 1 |                  | 3 |                      | 23 |      C   =       | 14 |                  | 14 |    //*********************************************************  */          int main(int argc,char **argv)         {            int  id, p;        MPI_Status status;      // p -> no. of processes    // id -> process id        MPI_Init(&argc, &argv);      MPI_Comm_rank(MPI_COMM_WORLD, &id);        MPI_Comm_size(MPI_COMM_WORLD, &p);      cout << p << endl;      char processor_name[MPI_MAX_PROCESSOR_NAME];      int name_len;      MPI_Get_processor_name(processor_name, &name_len);          if (id == 0)// master      {          wtime = MPI_Wtime();              int aRows = 3;          int aCols = 3;          int bRows = 3;          int bCols = 1;            int** A = new int*[aRows];          for (int i = 0; i < aRows; i++)          {              A[i] = new int[aCols];          }          int** A1 = new int*[aRows];          for (int i = 0; i < aRows; i++)          {              A1[i] = new int[aCols];          }          int** A2 = new int*[aRows];          for (int i = 0; i < aRows; i++)          {              A2[i] = new int[aCols];          }            int** B = new int*[bRows];          for (int i = 0; i < bRows; i++)          {              B[i] = new int[bCols];          }            //***************************************          A[0][0] = 3;          A[0][1] = 2;          A[0][2] = 5;          A[1][0] = 4;          A[1][1] = 3;          A[1][2] = 1;          A[2][0] = 2;          A[2][1] = 4;          A[2][2] = 2;          B[0][0] = 2;          B[1][0] = 1;          B[2][0] = 3;          //**************************************          A1[0][0] = 1;          A1[0][1] = 2;          A1[0][2] = 3;          A1[1][0] = 3;          A1[1][1] = 2;          A1[1][2] = 1;          A1[2][0] = 1;          A1[2][1] = 2;          A1[2][2] = 0;          //**************************************          A2[0][0] = 2;          A2[0][1] = 0;          A2[0][2] = 2;          A2[1][0] = 1;          A2[1][1] = 1;          A2[1][2] = 0;          A2[2][0] = 1;          A2[2][1] = 2;          A2[2][2] = 2;          //*************************************          B[0][0] = 2;          B[1][0] = 1;          B[2][0] = 3;          //*************************************          int** C;          C = new int*[aRows];          for (int i = 0; i < aRows; i++)          {              C[i] = new int[bCols];          }          //************************************          int** C1;          C1 = new int*[aRows];          for (int i = 0; i < aRows; i++)          {              C1[i] = new int[bCols];          }          //************************************          int** C2;          C2 = new int*[aRows];          for (int i = 0; i < aRows; i++)          {              C2[i] = new int[bCols];          }          //***********************************          Multiply(C, A, B, aRows, aCols, bRows, bCols);            for (int i = 0; i < aRows; i++)          {              for (int j = 0; j < bCols; j++)              {                  std::cout << C[i][j] << ' ';              }              std::cout << '\n';          }            MPI_Send(&aRows, 1, MPI_INT, 1, 1, MPI_COMM_WORLD);          MPI_Send(&aCols, 1, MPI_INT, 1, 2, MPI_COMM_WORLD);          MPI_Send(&bRows, 1, MPI_INT, 1, 3, MPI_COMM_WORLD);          MPI_Send(&bCols, 1, MPI_INT, 1, 4, MPI_COMM_WORLD);            MPI_Send(&aRows, 1, MPI_INT, 2, 5, MPI_COMM_WORLD);          MPI_Send(&aCols, 1, MPI_INT, 2, 6, MPI_COMM_WORLD);          MPI_Send(&bRows, 1, MPI_INT, 2, 7, MPI_COMM_WORLD);          MPI_Send(&bCols, 1, MPI_INT, 2, 8, MPI_COMM_WORLD);            MPI_Send(&A1, aRows*aCols, MPI_INT, 1, 9, MPI_COMM_WORLD);          MPI_Send(&B , bRows*bCols, MPI_INT, 1, 10, MPI_COMM_WORLD);            MPI_Send(&A2, aRows*aCols, MPI_INT, 2, 11, MPI_COMM_WORLD);          MPI_Send(&B, bRows*bCols, MPI_INT, 2, 12, MPI_COMM_WORLD);        }            for (id=1;id<3;id++)          {          if (id == 1)          {                int aRows, aCols, bRows, bCols;                MPI_Recv(&aRows, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);              printf("receive data:%d", aRows);              MPI_Recv(&aCols, 1, MPI_INT, 0, 2, MPI_COMM_WORLD, &status);              printf("receive data:%d", aCols);              MPI_Recv(&bRows, 1, MPI_INT, 0, 3, MPI_COMM_WORLD, &status);              printf("receive data:%d", bRows);              MPI_Recv(&bCols, 1, MPI_INT, 0, 4, MPI_COMM_WORLD, &status);              printf("receive data:%d", bCols);                //int s = status.MPI_SOURCE;              //int t = status.MPI_TAG;                      int** A1 = new int*[aRows];              for (int i = 0; i < aRows; i++)              {                  A1[i] = new int[aCols];              }                int** B = new int*[bRows];              for (int i = 0; i < bRows; i++)              {                  B[i] = new int[bCols];              }                int** C1 = new int*[bRows];              for (int i = 0; i < bRows; i++)              {                  C1[i] = new int[bCols];              }                //***********************************************************                MPI_Recv(&A1, aRows*aCols, MPI_INT, 0, 9, MPI_COMM_WORLD, &status);              printf("receive data:%d", A1);              MPI_Recv(&B , aRows*aCols, MPI_INT, 0, 10, MPI_COMM_WORLD, &status);              printf("receive data:%d", B);                Multiply(C1, A1, B, aRows, aCols, bRows, bCols);                for (int i = 0; i < aRows; i++)              {                  for (int j = 0; j < bCols; j++)                  {                      cout << C1[i][j] << endl;                    }              }          }                else          {              int aRows, aCols, bRows, bCols;                MPI_Recv(&aRows, 1, MPI_INT, 0, 5, MPI_COMM_WORLD, &status);              MPI_Recv(&aCols, 1, MPI_INT, 0, 6, MPI_COMM_WORLD, &status);              MPI_Recv(&bRows, 1, MPI_INT, 0, 7, MPI_COMM_WORLD, &status);              MPI_Recv(&bCols, 1, MPI_INT, 0, 8, MPI_COMM_WORLD, &status);                  int** A2 = new int*[aRows];              for (int i = 0; i < aRows; i++)              {                  A2[i] = new int[aCols];              }                int** B = new int*[bRows];              for (int i = 0; i < bRows; i++)              {                  B[i] = new int[bCols];              }                int** C2 = new int*[bRows];              for (int i = 0; i < bRows; i++)              {                  C2[i] = new int[bCols];              }                MPI_Recv(&A2, aRows*aCols, MPI_INT, 0, 11, MPI_COMM_WORLD, &status);              printf("receive data:%d", A2);              MPI_Recv(&B , aRows*aCols, MPI_INT, 0, 12, MPI_COMM_WORLD, &status);              printf("receive data:%d", B);                //**************************************************************              MPI_Status status;              Multiply(C2, A2, B, aRows, aCols, bRows, bCols);              for (int i = 0; i < aRows; i++)              {                  for (int j = 0; j < bCols; j++)                  {                      cout << C2[i][j] << endl;                  }                }          }          //MPI_Recv(&(C1[0][0]), aRows*bCols, MPI_INT, 0, tag, MPI_COMM_WORLD,&status);      }        MPI_Finalize();      return 0;  }    void Multiply(int **res, int **A, int **B, int aRows, int aCols, int bRows, int bCols)  {      if (aCols != bRows)          return;        for (int i = 0; i < aRows; i++)      {          for (int j = 0; j < bCols; j++)          {              res[i][j] = 0;              for (int k = 0; k < aCols; k++)              {                  res[i][j] += A[i][k] * B[k][j];              }          }      }  }    void Initialise(int **res, int rows, int cols)  {      for (int i = 0; i < rows; i++)      {          for (int j = 0; j < cols; j++)          {              res[i][j] = 0;          }      }  }  
https://stackoverflow.com/questions/67362338/mpi-programming May 03, 2021 at 08:44AM

没有评论:

发表评论