#include<stdio.h>
#include<omp.h>

int l=10, m=10,n=10;
float vmulti(int,float[],float[]); 

int main(int argc, char *argv[]){
   int i,j,k,nthreads = 2;
   float A[l*m],B[l*m],C[l*m],D[l],E[l]; 
   for(i = 0; i < l ; i++){
      for(j=0; j < m; j++){
        A[j+m*i] = (float) i;
	B[j+m*i] = (float) j; 
	C[j+m*i] = 0.0;
      }
   }   

   omp_set_num_threads(nthreads);   

#pragma omp parallel for shared (A,B,C,i) private (D,E,j,k)     
   for (i=0; i < l; i++){
     for (j=0; j < n; j++){
      for(k=0; k < m; k++){
         D[k] = A[k+m*i];
         E[k] = B[j+l*k]; 
      }
      C[j+n*i] = +vmulti(m,D,E); 
     }
   } 

  printf("A=\n");  
  for(i=0; i < l ; i++){
     for(j=0; j < m; j++){
        printf("%2.0f",A[j+m*i]); 
     }
    printf("\n");  
  }

  printf("B=\n");
  for(i=0; i < m ; i++){
     for(j=0; j < n; j++){
      printf("%2.0f",B[j+n*i]);
      }
    printf("\n");
  }

  printf("C=\n");
  for(i=0; i < l ; i++){
      for(j=0; j < n; j++){
        printf("%2.0f ",C[j+n*i]);
       }
      printf("\n");
    }
   return(0); 
}


float vmulti(int p, float A[], float B[]){
  float x;
  int i;
  x = 0.0;
  for(i=0; i < p; i++)
     x+=A[i] * B[i]; 
  return(x); 
}