1
+ #include <stdio.h>
2
+ #include <stdlib.h>
3
+ #include <string.h>
4
+
5
+ #include <omp.h>
6
+
7
+ // define the dimensions of the matrix
8
+ #define M 384
9
+ #define N 512
10
+
11
+ /* Read the numbers in the file as an m x n matrix
12
+ Note: If the file has fewer elements than in matrix, the rest is filled with zeroes. */
13
+ int * * readMatrix (const char * filename , int m , int n );
14
+
15
+ const int const NUM_THREADS [] = {1 , 2 , 4 , 6 , 8 , 12 , 16 , 20 , 24 , 28 , 32 };
16
+
17
+ int main (void )
18
+ {
19
+ int i , j ;
20
+
21
+ // read random image matrices from file 'red.txt', 'green.txt', 'blue.txt'
22
+ int * * redmatrix = readMatrix ("../../data/red.txt" , M , N );
23
+ int * * greenmatrix = readMatrix ("../../data/green.txt" , M , N );
24
+ int * * bluematrix = readMatrix ("../../data/blue.txt" , M , N );
25
+
26
+ // create matrices to store mean filtering result for red, green, blue matrices
27
+ int * * redmeanfilteredmatrix , * * greenmeanfilteredmatrix , * * bluemeanfilteredmatrix ;
28
+
29
+ redmeanfilteredmatrix = (int * * )malloc (sizeof (int * )* (M - 4 ));
30
+ greenmeanfilteredmatrix = (int * * )malloc (sizeof (int * )* (M - 4 ));
31
+ bluemeanfilteredmatrix = (int * * )malloc (sizeof (int * )* (M - 4 ));
32
+
33
+ for (i = 0 ; i < (M - 4 ); ++ i )
34
+ {
35
+ * (redmeanfilteredmatrix + i ) = (int * )malloc (sizeof (int )* (N - 4 ));
36
+ * (greenmeanfilteredmatrix + i ) = (int * )malloc (sizeof (int )* (N - 4 ));
37
+ * (bluemeanfilteredmatrix + i ) = (int * )malloc (sizeof (int )* (N - 4 ));
38
+ }
39
+
40
+
41
+ int num_threads_index ;
42
+ double start_time , end_time ;
43
+
44
+ for (num_threads_index = 0 ; num_threads_index < sizeof (NUM_THREADS )/sizeof (int ); ++ num_threads_index )
45
+ {
46
+ start_time = omp_get_wtime ();
47
+
48
+ // perform mean filtering on the matrices
49
+ #pragma omp parallel sections
50
+ {
51
+ #pragma omp section
52
+ {
53
+ #pragma omp parallel for default(none) shared(redmeanfilteredmatrix, redmatrix) private(i, j) num_threads(NUM_THREADS[num_threads_index]) collapse(2)
54
+ for (i = 0 ; i < (M - 4 ); ++ i )
55
+ for (j = 0 ; j < (N - 4 ); ++ j )
56
+ * (* (redmeanfilteredmatrix + i ) + j ) = 0.04 * * (* (redmatrix + i )+ j ) + 0.04 * * (* (redmatrix + i )+ j + 1 ) + 0.04 * * (* (redmatrix + i )+ j + 2 ) + 0.04 * * (* (redmatrix + i )+ j + 3 ) + 0.04 * * (* (redmatrix + i )+ j + 4 ) + 0.04 * * (* (redmatrix + i + 1 )+ j ) + 0.04 * * (* (redmatrix + i + 1 )+ j + 1 ) + 0.04 * * (* (redmatrix + i + 1 )+ j + 2 ) + 0.04 * * (* (redmatrix + i + 1 )+ j + 3 ) + 0.04 * * (* (redmatrix + i + 1 )+ j + 4 ) + 0.04 * * (* (redmatrix + i + 2 )+ j ) + 0.04 * * (* (redmatrix + i + 2 )+ j + 1 ) + 0.04 * * (* (redmatrix + i + 2 )+ j + 2 ) + 0.04 * * (* (redmatrix + i + 2 )+ j + 3 ) + 0.04 * * (* (redmatrix + i + 2 )+ j + 4 ) + 0.04 * * (* (redmatrix + i + 3 )+ j ) + 0.04 * * (* (redmatrix + i + 3 )+ j + 1 ) + 0.04 * * (* (redmatrix + i + 3 )+ j + 2 ) + 0.04 * * (* (redmatrix + i + 3 )+ j + 3 ) + 0.04 * * (* (redmatrix + i + 3 )+ j + 4 ) + 0.04 * * (* (redmatrix + i + 4 )+ j ) + 0.04 * * (* (redmatrix + i + 4 )+ j + 1 ) + 0.04 * * (* (redmatrix + i + 4 )+ j + 2 ) + 0.04 * * (* (redmatrix + i + 4 )+ j + 3 ) + 0.04 * * (* (redmatrix + i + 4 )+ j + 4 );
57
+ }
58
+
59
+ #pragma omp section
60
+ {
61
+ #pragma omp parallel for default(none) shared(greenmeanfilteredmatrix, greenmatrix) private(i, j) num_threads(NUM_THREADS[num_threads_index]) collapse(2)
62
+ for (i = 0 ; i < (M - 4 ); ++ i )
63
+ for (j = 0 ; j < (N - 4 ); ++ j )
64
+ * (* (greenmeanfilteredmatrix + i ) + j ) = 0.04 * * (* (greenmatrix + i )+ j ) + 0.04 * * (* (greenmatrix + i )+ j + 1 ) + 0.04 * * (* (greenmatrix + i )+ j + 2 ) + 0.04 * * (* (greenmatrix + i )+ j + 3 ) + 0.04 * * (* (greenmatrix + i )+ j + 4 ) + 0.04 * * (* (greenmatrix + i + 1 )+ j ) + 0.04 * * (* (greenmatrix + i + 1 )+ j + 1 ) + 0.04 * * (* (greenmatrix + i + 1 )+ j + 2 ) + 0.04 * * (* (greenmatrix + i + 1 )+ j + 3 ) + 0.04 * * (* (greenmatrix + i + 1 )+ j + 4 ) + 0.04 * * (* (greenmatrix + i + 2 )+ j ) + 0.04 * * (* (greenmatrix + i + 2 )+ j + 1 ) + 0.04 * * (* (greenmatrix + i + 2 )+ j + 2 ) + 0.04 * * (* (greenmatrix + i + 2 )+ j + 3 ) + 0.04 * * (* (greenmatrix + i + 2 )+ j + 4 ) + 0.04 * * (* (greenmatrix + i + 3 )+ j ) + 0.04 * * (* (greenmatrix + i + 3 )+ j + 1 ) + 0.04 * * (* (greenmatrix + i + 3 )+ j + 2 ) + 0.04 * * (* (greenmatrix + i + 3 )+ j + 3 ) + 0.04 * * (* (greenmatrix + i + 3 )+ j + 4 ) + 0.04 * * (* (greenmatrix + i + 4 )+ j ) + 0.04 * * (* (greenmatrix + i + 4 )+ j + 1 ) + 0.04 * * (* (greenmatrix + i + 4 )+ j + 2 ) + 0.04 * * (* (greenmatrix + i + 4 )+ j + 3 ) + 0.04 * * (* (greenmatrix + i + 4 )+ j + 4 );
65
+ }
66
+
67
+ #pragma omp section
68
+ {
69
+ #pragma omp parallel for default(none) shared(bluemeanfilteredmatrix, bluematrix) private(i, j) num_threads(NUM_THREADS[num_threads_index]) collapse(2)
70
+ for (i = 0 ; i < (M - 4 ); ++ i )
71
+ for (j = 0 ; j < (N - 4 ); ++ j )
72
+ * (* (bluemeanfilteredmatrix + i ) + j ) = 0.04 * * (* (bluematrix + i )+ j ) + 0.04 * * (* (bluematrix + i )+ j + 1 ) + 0.04 * * (* (bluematrix + i )+ j + 2 ) + 0.04 * * (* (bluematrix + i )+ j + 3 ) + 0.04 * * (* (bluematrix + i )+ j + 4 ) + 0.04 * * (* (bluematrix + i + 1 )+ j ) + 0.04 * * (* (bluematrix + i + 1 )+ j + 1 ) + 0.04 * * (* (bluematrix + i + 1 )+ j + 2 ) + 0.04 * * (* (bluematrix + i + 1 )+ j + 3 ) + 0.04 * * (* (bluematrix + i + 1 )+ j + 4 ) + 0.04 * * (* (bluematrix + i + 2 )+ j ) + 0.04 * * (* (bluematrix + i + 2 )+ j + 1 ) + 0.04 * * (* (bluematrix + i + 2 )+ j + 2 ) + 0.04 * * (* (bluematrix + i + 2 )+ j + 3 ) + 0.04 * * (* (bluematrix + i + 2 )+ j + 4 ) + 0.04 * * (* (bluematrix + i + 3 )+ j ) + 0.04 * * (* (bluematrix + i + 3 )+ j + 1 ) + 0.04 * * (* (bluematrix + i + 3 )+ j + 2 ) + 0.04 * * (* (bluematrix + i + 3 )+ j + 3 ) + 0.04 * * (* (bluematrix + i + 3 )+ j + 4 ) + 0.04 * * (* (bluematrix + i + 4 )+ j ) + 0.04 * * (* (bluematrix + i + 4 )+ j + 1 ) + 0.04 * * (* (bluematrix + i + 4 )+ j + 2 ) + 0.04 * * (* (bluematrix + i + 4 )+ j + 3 ) + 0.04 * * (* (bluematrix + i + 4 )+ j + 4 );
73
+ }
74
+ }
75
+
76
+
77
+ end_time = omp_get_wtime ();
78
+ printf ("No. of Threads = %d, time taken = %lf\n" , NUM_THREADS [num_threads_index ], (end_time - start_time ));
79
+ }
80
+
81
+ return 0 ;
82
+ }
83
+
84
+ int * * readMatrix (const char * filename , int m , int n )
85
+ {
86
+ int * * matrix ;
87
+
88
+ // open the matrix file for reading
89
+ FILE * fptr = fopen (filename , "r" );
90
+
91
+ if (fptr == NULL )
92
+ {
93
+ matrix = NULL ;
94
+
95
+ char * errormsg = (char * )malloc ( sizeof (char )* (30 + strlen (filename ) + 1 ) );
96
+ sprintf (errormsg , "Failed to read and parse file %s" , filename );
97
+ perror (errormsg );
98
+ }
99
+
100
+ else
101
+ {
102
+ // create and read the matrix
103
+ matrix = (int * * )malloc (sizeof (int * )* m );
104
+
105
+ int i , j ;
106
+ for (i = 0 ; i < m ; ++ i )
107
+ {
108
+ * (matrix + i ) = (int * )malloc (sizeof (int )* n );
109
+ for (j = 0 ; j < n ; ++ j )
110
+ fscanf (fptr , "%d" , * (matrix + i )+ j );
111
+ }
112
+
113
+ fclose (fptr );
114
+ }
115
+
116
+ return matrix ;
117
+
118
+ }
0 commit comments