#include #include #include int main() { int **a, **b, **c, l, m1, m2, n; printf("Order of matrix A: "); int _ = scanf("%d %d", &l, &m1); printf("Order of matrix B: "); _ = scanf("%d %d", &m2, &n); if (m1 != m2) { printf("Invalid order\n"); exit(1); } int m = m1; a = (int **) calloc(l, sizeof(int *)); for(int i = 0; i < m; i++) a[i] = (int *) calloc(m, sizeof(int)); b = (int **) calloc(m, sizeof(int *)); for(int i = 0; i < n; i++) b[i] = (int *) calloc(n, sizeof(int)); c = (int **) calloc(l, sizeof(int *)); for(int i = 0; i < n; i++) c[i] = (int *) calloc(n, sizeof(int)); printf("L: %d, M: %d, N: %d\n", l, m, n); // populate A for(int i = 0; i < l; i++) { for(int j = 0; j < m; j++) { // _ = scanf("%d", &a[i][j]); a[i][j] = rand() % 500; } } // populate B for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { // _ = scanf("%d", &b[i][j]); b[i][j] = rand() % 1000; } } double start_time = omp_get_wtime(); int i, j, k; #pragma omp parallel for private(j, k) num_threads(1) for(i = 0; i < l; i++) { for(j = 0; j < m; j++) { c[i][j] = 0; for(k = 0; k < n; k++) { c[i][j] += a[i][k] * b[k][j]; } } } double end_time = omp_get_wtime(); printf(">>= Done in %f secs", end_time - start_time); }