Search code examples
c++parallel-processingopenmpmatrix-multiplication

Why is my matrix multiplication code not working?


I am new to C++ and I have written a C++ OpenMp Matrix Multiplication code that multiplies two 1000x1000 matrices. So far its not running and I am having a hard time finding out where the bugs are. I tried to figure it out for a few days but I'm stuck.

Here is my code:

#include <iostream>
#include <time.h>
#include <omp.h>

using namespace std;
int N;

void Multiply()
 {
    //initialize matrices with random numbers
    //#pragma omp for 
    int aMatrix[N][N], i, j;
  for( i = 0; i < N; ++i)
  {for( j = 0;  j < N; ++j)
     {aMatrix[i][j] = rand();}
  }
    int bMatrix[N][N], i1, j2;
  for( i1 = 0; i1 < N; ++i1)
  {for( j2 = 0;  j2 < N; ++j2)
     {bMatrix[i1][j2] = rand();}
  }
  //Result Matrix
    int product[N][N]  = {0};

    //Transpose Matrix;
    int BTransposed[j][i];
    BTransposed[j][i] = bMatrix[i1][j2];

    for (int row = 0; row < N; row++) {
        for (int col = 0; col < N; col++) {
            // Multiply the row of A by the column of B to get the row, column of product.
            for (int inner = 0; inner < N; inner++) {
                product[row][col] += aMatrix[row][inner] * BTransposed[col][inner];
            }

        }
    
    }
}

int main() {
    
   time_t begin, end;
    time(&begin);

    Multiply();

  time(&end);
  time_t elapsed = end - begin;

  cout << ("Time measured: ") << endl;
    cout << elapsed << endl;

    return 0;

}```

Solution

  • The transposed matrix (BTransposed) is not correctly constructed. You can solve this in the following ways:

    First Option: use a for loop to create the correct BTransposed matrix.

    for (int i = 0; i != N; i++)
      for (int j = 0; j != N; j++)
        BTransposed[i][j] = bMatrix[j][i]
    

    Second Option (better one): completely delete BTransposed matrix. when needed just use the original bMatrix with indexes i,j exchanged! for example instead of BTransposed[col][inner] you can use BMatrix[inner][col].