Multiplying 100*100 matrix using threads and also produce the sum of the diagonal elements in another matrix

#include <omp.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
long int a[100][100],c[100][100],b[100][100],d[100][100],i,k,j,val;
int id,ids;
#pragma omp parallel for private(i,j) shared(a)
for(j=0;j<100;j++)
 {
  for(i=0;i<100;i++)
  {
   a[i][j]=rand()%999;
  }
 }

#pragma omp parallel for private(i,j) shared(b)
for(j=0;j<100;j++)
 {
  for(i=0;i<100;i++)
  {
   b[i][j]=rand()%999;
  }
 }

val=0;
#pragma omp parallel for private(i,j,k) shared(a,b,c)
for(k=0;k<100;k++)
 {
  for(i=0;i<100;i++)
  {
   for(j=0;j<100;j++)
   {
   c[i][j]=c[i][j]+(a[i][k]*b[k][j]);
   }    }
 }
/*
for(j=0;j<100;j++)
 {
  for(i=0;i<100;i++)
  {
   printf("%ld\n",a[i][j]);
  }
 }
for(j=0;j<100;j++)
 {
  for(i=0;i<100;i++)
  {
   printf("%ld\n",b[i][j]);
  }
 }
*/
#pragma omp parallel for private(i,j) shared(c)
for(j=0;j<100;j++)
 {
  for(i=0;i<100;i++)
  {
   printf("%ld\n",c[i][j]);
  }
 }
#pragma omp critical
#pragma omp parallel for private(i,j) shared(id)
for(i=0;i<100;i++)
{
 for(j=0;j<100;j++)
 {
  ids=omp_get_num_threads();
  id=omp_get_thread_num();
  if(id%2!=0)
  {
   while(id%2!=0)
   {
   ids=omp_get_num_threads();
   id=omp_get_thread_num();
   }
  }
    else
  { if(id%2==0)
   {
   printf("Thread number is %d\n",id);
   d[i][j]=a[i][j]+b[i][j];
   printf("%ld\n",d[i][j]);
   }
   else
   {
    while(id%2!=0)
    {
    ids=omp_get_num_threads();
    id=omp_get_thread_num();
    }
   }
  }
   }
}
return 0;
}


Learn More :