aboutsummaryrefslogtreecommitdiff
path: root/src/2/main.c
blob: 58295a574b126d40e1a7f1da33afa6ca87224f82 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <stdlib.h>

#include <omp.h>

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);
}