1 #include <stdio.h>
2 #include <time.h>
3 #include <stdlib.h>
4 #include <omp.h>
5
6 // in addmatrix.c
7 void addmatrix(int ** a, int ** b, int ** c);
8
9 // in printmatrix.c
10 void printmatrix(int ** matrix);
11
12 // globals
13 int xdim;
14 int ydim; // matrix dimensions
15
16 int main(int argc, char * argv[]) {
17
18 int i,j,n; // loop counters
19
20 int ** a; // the matrices themselves
21 int ** b;
22
23 int count; // number to add
24
25 // argument stream should be matrix dimensions & count
26 if(argc!=4) {
27 fprintf(stderr,"Usage:\n%s <xdim> <ydim> <count>\n",
28 argv[0]);
29 exit(1);
30 }
31
32 xdim = atoi(argv[1]);
33 ydim = atoi(argv[2]);
34 count = atoi(argv[3]);
35
36 if(xdim <= 0 || ydim <= 0 || count < 2) {
37 fprintf(stderr,"xdim,ydim must be >0, count must be >1\n");
38 exit(1);
39 }
40
41 // seed the random number generator
42 srand(time(NULL));
43
44 // allow the omp library to select the number of threads to use
45 omp_set_dynamic(1);
46
47 // allocate the matrices
48 a = (int **) malloc( ydim * sizeof(int *));
49 b = (int **) malloc( ydim * sizeof(int *));
50
51 for(j=0;j<ydim;j++) {
52 a[j] = (int*) malloc( xdim * sizeof(int));
53 b[j] = (int*) malloc( xdim * sizeof(int));
54
55 for(i=0;i<xdim;i++) {
56 a[j][i] = 0;
57 b[j][i] = rand() % 5;
58 }
59 }
60
61
62 // do the specified number of additions
63 for(n=0;n<count;n++) {
64
65 printmatrix(a);
66 fprintf(stdout," +\n");
67 printmatrix(b);
68 fprintf(stdout," =\n");
69
70 // calls into an OMP-enabled file
71 addmatrix(a,a,b); // does a = a+b
72
73 printmatrix(a);
74 fprintf(stdout,"\n***********************\n\n");
75
76 // re-initialize b to a new random matrix
77 // Note: this is not done in parallel!
78 for(j=0;j<ydim;j++) {
79 for(i=0;i<xdim;i++) {
80 b[j][i] = rand() % 5;
81 }
82 }
83 }
84
85 exit(0);
86 }
87